Redis (от англ. remote dictionary server)
— резидентная система управления базами данных класса NoSQL с открытым исходным кодом, работающая со структурами данных типа «ключ — значение». Используется как для баз данных, так и для реализации кэшей, брокеров сообщений[en].
Redis является хранилищем данных в памяти, обычно используется в качестве базы данных, кэша и брокера сообщений.
Все данные Redis
хранит в виде словаря, в котором ключи связаны со своими значениями. Одно из ключевых отличий Redis
от других хранилищ данных заключается в том, что значения этих ключей не ограничиваются строками.
Поддерживаются следующие абстрактные типы данных:
строки
списки
множества
хеш-таблицы
упорядоченные множества
Тип данных значения определяет, какие операции (команды) доступны для него; поддерживаются такие высокоуровневые операции, как объединение и разность наборов, сортировка наборов.
Так это выше была небольшая теория, посмотрим практику.
ekzorchik@navy:~$ ssh -l ekzorchik 172.33.33.2 ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject ekzorchik@srv-bionic:~$ sudo ./dproject/default ekzorchik@srv-bionic:~$ apt-cache show redis-server | grep "Version\|Description-en" | head -n2 Version: 5:4.0.9-1ubuntu0.1 Description-en: Persistent key-value database with network interface ekzorchik@srv-bionic:~$ sudo apt-get install redis-server -y
Проверить установленную версию Redis
сервера на системе:
ekzorchik@srv-bionic:~$ redis-server -v Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=76095d16786fbcba ekzorchik@srv-bionic:~$ sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.backup ekzorchik@srv-bionic:~$ sudo nano /etc/redis/redis.conf # 127.0.0.1 — подключение только с текущего сервера # 0.0.0.0 - подключению с любого IP # 172.33.33.2 — подключение только с этого IP-адреса (адрес сервера) bind 127.0.0.1 ::1 protected-mode yes port 6379 daemonize yes #supervised no supervised auto pidfile /var/run/redis/redis-server.pid logfile /var/log/redis/redis-server.log #Каждые 900 секунд будет происходить сохранение на диск, ведь база работает в памяти, а память быстрее диска # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # т. е. Если 1 ключ меняется то сохранение каждый 900 секунд, если 10000 то 60 секунд save 900 1 save 300 10 save 60 10000 dir /var/lib/redis ekzorchik@srv-bionic:~$ sudo systemctl restart redis.service && sudo systemctl status redis.service | head -n5 ● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2019-05-13 09:35:37 MSK; 21ms ago Docs: http://redis.io/documentation, man:redis-server(1) ekzorchik@srv-bionic:~$ sudo netstat -tulpn | grep :6379 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1780/redis-server 1 tcp6 0 0 ::1:6379 :::* LISTEN 1780/redis-server 1
Смотрю логи сервиса базы данных Redis
, может есть какие-либо уведомление о работе:
ekzorchik@srv-bionic:~$ sudo tail -f /var/log/redis/redis-server.log 1942:M 13 May 09:58:52.808 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 1942:M 13 May 09:58:52.809 # Server initialized 1942:M 13 May 09:58:52.809 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
А вот и первые замечания, поправляю как хочет сервис:
ekzorchik@srv-bionic:~$ sudo bash -c "cat /etc/redis/redis.conf | grep "tcp-backlog"" tcp-backlog 511 ekzorchik@srv-bionic:~$ cat /proc/sys/net/core/somaxconn 128 ekzorchik@srv-bionic:~$ sudo sed -i '/tcp-backlog/s/511/128/' /etc/redis/redis.conf ekzorchik@srv-bionic:~$ sudo bash -c "cat /etc/redis/redis.conf | grep "tcp-backlog"" tcp-backlog 128 ekzorchik@srv-bionic:~$ sudo nano /etc/sysctl.conf vm.overcommit_memory=1 ekzorchik@srv-bionic:~$ sudo sysctl -p vm.overcommit_memory = 1 ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo systemctl restart redis.service && sudo systemctl status redis.service | head -n5 ekzorchik@srv-bionic:~$ sudo tail -f /var/log/redis/redis-server.log 3463:M 13 May 10:36:10.012 # Server initialized 3463:M 13 May 10:36:10.012 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 3463:M 13 May 10:36:10.012 * DB loaded from disk: 0.000 seconds 3463:M 13 May 10:36:10.012 * Ready to accept connections ekzorchik@srv-bionic:~$ sudo nano /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="quiet splash transparent_hugepage=never" ekzorchik@srv-bionic:~$ sudo update-grub Sourcing file `/etc/default/grub' Generating grub configuration file ... Found linux image: /boot/vmlinuz-4.15.0-48-generic Found initrd image: /boot/initrd.img-4.15.0-48-generic done ekzorchik@srv-bionic:~$ sudo reboot ekzorchik@srv-bionic:~$ sudo tail -f /var/log/redis/redis-server.log 636:M 13 May 10:44:11.043 # Server initialized 636:M 13 May 10:44:11.044 * DB loaded from disk: 0.001 seconds 636:M 13 May 10:44:11.044 * Ready to accept connections
Проверяю работоспособность Redis
подключение клиента к серверу:
ekzorchik@srv-bionic:~$ whereis redis-cli redis-cli: /usr/bin/redis-cli /usr/share/man/man1/redis-cli.1.gz ekzorchik@srv-bionic:~$ redis-cli 127.0.0.1:6379> ekzorchik@srv-bionic:~$ Проверяю статус соединения: 127.0.0.1:6379> ping PONG → значит, соединение с сервером установлено 127.0.0.1:6379> Проверяю, что отрабатывает установка ключей Redis, т. е. Есть статус OK: ekzorchik@srv-bionic:~$ redis-cli 127.0.0.1:6379> set key value [EX seconds] [PX milliseconds] [NX|XX] → при набирании команды set дальше отображается справка по искользованию Проверяю, извлечение значения по ключу: 127.0.0.1:6379> set test "ekzorchik" OK 127.0.0.1:6379> get key → где key это справка что нужно указать 127.0.0.1:6379> get test "ekzorchik" 127.0.0.1:6379> если нажимать клавишу TAB то будет произведено подставление управляющих команд, к примеру APPEND, AUTH и т. к. Чтобы покинуть подключение: ekzorchik@srv-bionic:~$ redis-cli 127.0.0.1:6379> exit 127.0.0.1:6379> quit 127.0.0.1:6379> Сочетание клавиш Ctrl + C Смотрим размер базы данных: ekzorchik@srv-bionic:~$ sudo ls -l /var/lib/redis/ total 4 -rw-rw---- 1 redis redis 113 May 13 10:44 dump.rdb Не лишним будет установка пароля для безопасности хранилища ключ=значение: ekzorchik@srv-bionic:~$ sudo nano /etc/redis/redis.conf # requirepass foobared requirepass 712mbddr@ ekzorchik@srv-bionic:~$ sudo systemctl restart redis.service && sudo systemctl status redis.service | head -n5
Проверяю, как теперь будет выглядеть подключение клиентом, смотрю
справку на предмет ключей через которых буду производить авторизацию:
ekzorchik@srv-bionic:~$ redis-cli --help -h <hostname> Server hostname (default: 127.0.0.1). -p <port> Server port (default: 6379). -a <password> Password to use when connecting to the server. ekzorchik@srv-bionic:~$ redis-cli -h 127.0.0.1 -p 6379 -a 712mbddr@ 127.0.0.1:6379>
Если нужно чтобы к примеру можно было подключаться с определенной системы к Redis:
ekzorchik@srv-bionic:~$ sudo nano /etc/redis/redis.conf bind 127.0.0.1 172.33.33.2 ekzorchik@srv-bionic:~$ sudo systemctl restart redis.service && sudo systemctl status redis.service | head -n5 ekzorchik@srv-bionic:~$ sudo netstat -tulpn | grep :6379 tcp 0 0 172.33.33.2:6379 0.0.0.0:* LISTEN 1900/redis-server 1 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1900/redis-server 1 ekzorchik@srv-bionic:~$ ss -nlt | grep :6379 LISTEN 0 128 172.33.33.2:6379 0.0.0.0:* LISTEN 0 128 127.0.0.1:6379 0.0.0.0:*
Проверяю подключение к базе с текущей системы:
ekzorchik@srv-bionic:~$ redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379> ping → команда проверки статуса (error) NOAUTH Authentication required. → ошибка, я не авторизирован, а все дело в том, что я не указал ключ «-a»: 127.0.0.1:6379> quit ekzorchik@srv-bionic:~$ redis-cli -h 127.0.0.1 -p 6379 -a 712mbddr@ 127.0.0.1:6379> ping PONG → вот теперь все отлично я авторизован. 127.0.0.1:6379> quit ekzorchik@srv-bionic:~$
Проверяю возможность подключения с удаленной системы, для этого устанавливаю Redis
и опираясь на синтаксис инициализирую взаимодействие:
ekzorchik@srv-bionic2:~$ apt-cache search redis-tools redis-tools - Persistent key-value database with network interface (client) ekzorchik@srv-bionic2:~$ sudo apt-get install redis-tools -y ekzorchik@srv-bionic2:~$ redis-cli -h 172.33.33.2 -p 6379 -a 712mbddr@ 172.33.33.2:6379> ping PONG 172.33.33.2:6379> 172.33.33.2:6379> keys * → отобразить все ключи 1) "test" 172.33.33.2:6379>
Итак я с удаленной системы подключился, но что я еще считаю важным, так это в обязательном порядке использовать брандмауэр, разберу как есть включить на первом сервере, т. е. 172.33.33.2:
ekzorchik@srv-bionic:~$ sudo apt-get install ufw -y ekzorchik@srv-bionic:~$ sudo nano /etc/default/ufw #Выключаю поддержку IPV6 IPV6=no ekzorchik@srv-bionic:~$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
Дефолтный профиль должен быть таким:
ekzorchik@srv-bionic:~$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip
Если нет, то приводим к дефолтному:
ekzorchik@srv-bionic:~$ sudo ufw default deny incoming ekzorchik@srv-bionic:~$ sudo ufw default allow outgoing ekzorchik@srv-bionic:~$ sudo ufw allow 22/tcp ekzorchik@srv-bionic:~$ sudo ufw allow to 172.33.33.2 port 6379 from 172.33.33.0/24 proto tcp ekzorchik@srv-bionic:~$ sudo ufw logging on ekzorchik@srv-bionic:~$ sudo ufw reload ekzorchik@srv-bionic:~$ sudo ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 172.33.33.2 6379/tcp ALLOW 172.33.33.0/24
Теперь к серверу где развернута база Redis
в административных целях можно подключиться через SSH (port 22 proto tcp)
, а в целях использования базы Redis
через дефолтный порт 6379/tcp:
ekzorchik@srv-bionic2:~$ redis-cli -h 172.33.33.2 -p 6379 -a 712mbddr@ 172.33.33.2:6379> ping PONG 172.33.33.2:6379> quit ekzorchik@srv-bionic2:~$
Посмотрим что говорит сканер nmap
при проверки хоста (172.33.33.2
):
ekzorchik@srv-bionic2:~$ sudo apt-get install nmap -y ekzorchik@srv-bionic2:~$ nmap -p 6379 172.33.33.2 --script redis-info -PN Starting Nmap 7.60 ( https://nmap.org ) at 2019-05-13 10:28 MSK Nmap scan report for 172.33.33.2 Host is up (0.00057s latency). PORT STATE SERVICE 6379/tcp open redis Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds ekzorchik@srv-bionic2:~$
Пока на этом всё, не большое введение завершено. Но как правда использовать это в практических целях я пока не знаю. А нет я использую в паре OwnCloud 10 + Redis
вместо того что по дефолту. С уважением автор блога Олло Александр aka ekzorchik.