Redis. Кластер — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
(не показаны 52 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
Установка, настройка и управление кластером Redis на Debian Stretch. Мануал является переводом и адаптацией англоязычной [https://www.linode.com/docs/applications/big-data/how-to-install-and-configure-a-redis-cluster-on-ubuntu-1604/ статьи]. | Установка, настройка и управление кластером Redis на Debian Stretch. Мануал является переводом и адаптацией англоязычной [https://www.linode.com/docs/applications/big-data/how-to-install-and-configure-a-redis-cluster-on-ubuntu-1604/ статьи]. | ||
+ | |||
+ | |||
+ | '''Настройка узлов Master и Slave''' | ||
+ | |||
+ | В данной инструкции каждый master будет подключен к одному slave. | ||
+ | |||
+ | Официальная документация рекомендует использовать 6 узлов — по одному экземпляру Redis на узле, что позволяет обеспечить большую надежность, но возможно использовать три узла со следующей топологией соединений<br/> | ||
+ | |||
+ | [[Файл:Redis cluster nodes.png]] | ||
+ | |||
+ | В установке используется три сервера, на каждом из которых запущено по два экземпляра Redis. Убеждаемся, что каждый хост независим от других и не выйдет из строя совместно с другим. | ||
+ | |||
+ | Ставим Redis на каждом сервере через менеджер пакетов | ||
+ | # apt install redis-server | ||
+ | |||
+ | |||
+ | Для создания кластера и управления понадобится скрипт Ruby, который находится в /usr/share/doc/redis-tools/examples/redis-trib.rb<br/> | ||
+ | Если Ruby не установлен, ставим на основной сервер | ||
+ | # apt install ruby | ||
+ | |||
+ | Так же понадобится пакет Redis для Ruby: | ||
+ | # gem install redis | ||
+ | |||
+ | |||
+ | Далее выполняем следующие шаги: | ||
+ | |||
+ | Подключаемся к Server 1. Находим конфиг /etc/redis/redis.conf и делаем из него два, master и slave, оригинальный можно грохнуть | ||
+ | # cp redis.conf c_slave.conf | ||
+ | # mv redis.conf a_master.conf | ||
+ | |||
+ | |||
+ | В a_master.conf, определяем директиву bind и активируем режим кластера. Порты в данном случае будут варьироваться в диапазоне от 6379 до 6381 | ||
+ | bind 0.0.0.0 | ||
+ | protected-mode no | ||
+ | port 6379 | ||
+ | pidfile /var/run/redis_6379.pid | ||
+ | cluster-enabled yes | ||
+ | cluster-config-file /etc/redis/conf.d/nodes-6379.conf | ||
+ | cluster-node-timeout 15000 | ||
+ | |||
+ | Для каждого узла в проектируемом кластере Redis требуется доступность не только определенного порта, но и порта выше 10000. На Server 1 оба порта TCP 6379 и 16379 должны быть открыты. Проверяем, что файрвол настроен корректно. | ||
+ | |||
+ | |||
+ | В c_slave.conf настройки будут аналогичны, кроме номера порта. Позднее для настройки режима slave, соответствующего определенному узлу master, будет использоваться скрипт redis-trib.rb | ||
+ | bind 0.0.0.0 | ||
+ | protected-mode no | ||
+ | port 6381 | ||
+ | pidfile /var/run/redis_6381.pid | ||
+ | cluster-enabled yes | ||
+ | cluster-config-file /etc/redis/conf.d/nodes-6381.conf | ||
+ | cluster-node-timeout 15000 | ||
+ | |||
+ | |||
+ | Повторяем для оставшихся двух серверов, определив порты для всех пар master-slave. | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Server !! Master !! Slave !! IP | ||
+ | |- | ||
+ | | 1 || 6379 || 6381 || 172.16.10.45 | ||
+ | |- | ||
+ | | 2 || 6380 || 6379 || 172.16.10.46 | ||
+ | |- | ||
+ | | 3 || 6381 || 6380 ||172.16.10.50 | ||
+ | |- | ||
+ | |} | ||
+ | |||
+ | |||
+ | '''Запуск узлов Master и Slave''' | ||
+ | |||
+ | Подключаемся к Server 1 и запускаем оба экземпляра Redis | ||
+ | # redis-server /etc/redis/a_master.conf | ||
+ | # redis-server /etc/redis/c_slave.conf | ||
+ | |||
+ | Для других двух серверов меняем a_master.conf и c_slave.conf соответствующим конфигурационным файлом. Все узлы master будут запущены в режиме кластера. | ||
+ | _._ | ||
+ | _.-``__ ''-._ | ||
+ | _.-`` `. `_. ''-._ Redis 3.2.6 (00000000/0) 64 bit | ||
+ | .-`` .-```. ```\/ _.,_ ''-._ | ||
+ | ( ' , .-` | `, ) Running in cluster mode | ||
+ | |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | ||
+ | | `-._ `._ / _.-' | PID: 1221 | ||
+ | `-._ `-._ `-./ _.-' _.-' | ||
+ | |`-._`-._ `-.__.-' _.-'_.-'| | ||
+ | | `-._`-._ _.-'_.-' | http://redis.io | ||
+ | `-._ `-._`-.__.-'_.-' _.-' | ||
+ | |`-._`-._ `-.__.-' _.-'_.-'| | ||
+ | | `-._`-._ _.-'_.-' | | ||
+ | `-._ `-._`-.__.-'_.-' _.-' | ||
+ | `-._ `-.__.-' _.-' | ||
+ | `-._ _.-' | ||
+ | `-.__.-' | ||
+ | |||
+ | |||
+ | После того как всё будет запускаться, можно впилить автозапуск в systemd<br/> | ||
+ | <spoiler text="master"> | ||
+ | [Unit] | ||
+ | Description=Advanced key-value store | ||
+ | After=network.target | ||
+ | Documentation=http://redis.io/documentation, man:redis-server(1) | ||
+ | |||
+ | [Service] | ||
+ | Type=forking | ||
+ | ExecStart=/usr/bin/redis-server /etc/redis/a_master.conf | ||
+ | PIDFile=/var/run/redis/redis_6379.pid | ||
+ | TimeoutStopSec=0 | ||
+ | Restart=always | ||
+ | User=redis | ||
+ | Group=redis | ||
+ | RuntimeDirectory=redis | ||
+ | |||
+ | ExecStartPre=-/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d | ||
+ | ExecStartPost=-/bin/run-parts --verbose /etc/redis/redis-server.post-up.d | ||
+ | ExecStop=-/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d | ||
+ | ExecStop=/bin/kill -s TERM $MAINPID | ||
+ | ExecStopPost=-/bin/run-parts --verbose /etc/redis/redis-server.post-down.d | ||
+ | |||
+ | UMask=007 | ||
+ | PrivateTmp=yes | ||
+ | LimitNOFILE=65535 | ||
+ | PrivateDevices=yes | ||
+ | ProtectHome=yes | ||
+ | ReadOnlyDirectories=/ | ||
+ | ReadWriteDirectories=-/var/lib/redis | ||
+ | ReadWriteDirectories=-/var/log/redis | ||
+ | ReadWriteDirectories=-/var/run/redis | ||
+ | CapabilityBoundingSet=~CAP_SYS_PTRACE | ||
+ | |||
+ | # redis-server writes its own config file when in cluster mode so we allow | ||
+ | # writing there (NB. ProtectSystem=true over ProtectSystem=full) | ||
+ | ProtectSystem=true | ||
+ | ReadWriteDirectories=-/etc/redis | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | Alias=redis-master.service | ||
+ | </spoiler> | ||
+ | <spoiler text="slave"> | ||
+ | [Unit] | ||
+ | Description=Advanced key-value store | ||
+ | After=network.target | ||
+ | Documentation=http://redis.io/documentation, man:redis-server(1) | ||
+ | |||
+ | [Service] | ||
+ | Type=forking | ||
+ | ExecStart=/usr/bin/redis-server /etc/redis/c_slave.conf | ||
+ | PIDFile=/var/run/redis/redis_6381.pid | ||
+ | TimeoutStopSec=0 | ||
+ | Restart=always | ||
+ | User=redis | ||
+ | Group=redis | ||
+ | RuntimeDirectory=redis | ||
+ | |||
+ | ExecStartPre=-/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d | ||
+ | ExecStartPost=-/bin/run-parts --verbose /etc/redis/redis-server.post-up.d | ||
+ | ExecStop=-/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d | ||
+ | ExecStop=/bin/kill -s TERM $MAINPID | ||
+ | ExecStopPost=-/bin/run-parts --verbose /etc/redis/redis-server.post-down.d | ||
+ | |||
+ | UMask=007 | ||
+ | PrivateTmp=yes | ||
+ | LimitNOFILE=65535 | ||
+ | PrivateDevices=yes | ||
+ | ProtectHome=yes | ||
+ | ReadOnlyDirectories=/ | ||
+ | ReadWriteDirectories=-/var/lib/redis | ||
+ | ReadWriteDirectories=-/var/log/redis | ||
+ | ReadWriteDirectories=-/var/run/redis | ||
+ | CapabilityBoundingSet=~CAP_SYS_PTRACE | ||
+ | |||
+ | # redis-server writes its own config file when in cluster mode so we allow | ||
+ | # writing there (NB. ProtectSystem=true over ProtectSystem=full) | ||
+ | ProtectSystem=true | ||
+ | ReadWriteDirectories=-/etc/redis | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | Alias=redis-slave.service | ||
+ | </spoiler> | ||
+ | |||
+ | |||
+ | '''Создание кластера с использованием встроенного скрипта Ruby''' | ||
+ | |||
+ | На данном этапе на каждом сервере запущены по два независимых узла master. Дальнейшая установка кластера происходит с помощью скрипта Ruby. | ||
+ | |||
+ | |||
+ | Создаём кластер, передав список пар ip:port серверов, которые будут играть роль master | ||
+ | # ./redis-trib.rb create 172.16.10.45:6379 172.16.10.46:6380 172.16.10.50:6381 | ||
+ | |||
+ | |||
+ | При успешной установке кластера вернется ответ | ||
+ | >>> Creating cluster | ||
+ | >>> Performing hash slots allocation on 3 nodes... | ||
+ | Using 3 masters: | ||
+ | 172.16.10.45:6379 | ||
+ | 172.16.10.46:6380 | ||
+ | 172.16.10.50:6381 | ||
+ | M: 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 | ||
+ | slots:0-5460 (5461 slots) master | ||
+ | M: 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 | ||
+ | slots:5461-10922 (5462 slots) master | ||
+ | M: 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 | ||
+ | slots:10923-16383 (5461 slots) master | ||
+ | Can I set the above configuration? (type 'yes' to accept): yes | ||
+ | >>> Nodes configuration updated | ||
+ | >>> Assign a different config epoch to each node | ||
+ | >>> Sending CLUSTER MEET messages to join the cluster | ||
+ | Waiting for the cluster to join.. | ||
+ | >>> Performing Cluster Check (using node 172.16.10.45:6379) | ||
+ | M: 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 | ||
+ | slots:0-5460 (5461 slots) master | ||
+ | 0 additional replica(s) | ||
+ | M: 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 | ||
+ | slots:5461-10922 (5462 slots) master | ||
+ | 0 additional replica(s) | ||
+ | M: 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 | ||
+ | slots:10923-16383 (5461 slots) master | ||
+ | 0 additional replica(s) | ||
+ | [OK] All nodes agree about slots configuration. | ||
+ | >>> Check for open slots... | ||
+ | >>> Check slots coverage... | ||
+ | [OK] All 16384 slots covered. | ||
+ | |||
+ | |||
+ | Теперь мы можем получить все связанные с кластером узлы с помощью redis-cli(флаг -c определяет соединение с кластером) и посмотреть список узлов в кластере | ||
+ | # redis-cli -c -h 172.16.10.45 -p 6379 | ||
+ | 172.16.10.45> cluster nodes | ||
+ | 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 myself,master - 0 0 1 connected 0-5460 | ||
+ | 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 master - 0 1568119239640 2 connected 5461-10922 | ||
+ | 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 master - 0 1568119238636 3 connected 10923-16383 | ||
+ | |||
+ | На данном этапе в кластере только 3 master-сервера, данные будут распределяться по кластеру, но не реплицироваться. Присоединим к каждому серверу master один сервер slave, чтобы обеспечить репликацию данных. | ||
+ | |||
+ | |||
+ | '''Добавление узлов Slave''' | ||
+ | |||
+ | Для добавления новых узлов в кластер пользуемся утилитой redis-trib | ||
+ | ./redis-trib.rb add-node --slave --master-id 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.46:6379 172.16.10.45:6379 | ||
+ | >>> Adding node 172.16.10.46:6379 to cluster 172.16.10.45:6379 | ||
+ | >>> Performing Cluster Check (using node 172.16.10.45:6379) | ||
+ | M: 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 | ||
+ | slots:0-5460 (5461 slots) master | ||
+ | 0 additional replica(s) | ||
+ | M: 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 | ||
+ | slots:5461-10922 (5462 slots) master | ||
+ | 0 additional replica(s) | ||
+ | M: 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 | ||
+ | slots:10923-16383 (5461 slots) master | ||
+ | 0 additional replica(s) | ||
+ | [OK] All nodes agree about slots configuration. | ||
+ | >>> Check for open slots... | ||
+ | >>> Check slots coverage... | ||
+ | [OK] All 16384 slots covered. | ||
+ | >>> Send CLUSTER MEET to node 172.16.10.46:6379 to make it join the cluster. | ||
+ | Waiting for the cluster to join. | ||
+ | >>> Configure node as replica of 172.16.10.45:6379. | ||
+ | [OK] New node added correctly. | ||
+ | |||
+ | |||
+ | Делаем для двух оставшихся узлов | ||
+ | ./redis-trib.rb add-node --slave --master-id 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.50:6380 172.16.10.46:6380 | ||
+ | ./redis-trib.rb add-node --slave --master-id 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.45:6381 172.16.10.50:6381 | ||
+ | |||
+ | |||
+ | Проверяем | ||
+ | 172.16.10.45:6379> cluster nodes | ||
+ | 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 master - 0 1568632281867 3 connected 10923-16383 | ||
+ | 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 master - 0 1568632283872 2 connected 5461-10922 | ||
+ | 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 myself,master - 0 0 1 connected 0-5460 | ||
+ | 73beea633bb135f392f0b94deb1b6c5720283a39 172.16.10.50:6380 slave 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 0 1568632279862 2 connected | ||
+ | cf2a0caff28660820ca9320e78861387ac5b0716 172.16.10.45:6381 slave 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 0 1568632282869 3 connected | ||
+ | ba4ed4a5ff6d679e69cd0fc118f2abb712c18a2f 172.16.10.46:6379 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568632280865 1 connected | ||
+ | |||
+ | |||
+ | '''Распределение данных''' | ||
+ | |||
+ | Интерфейс командной строки Redis позволяет задать и просмотреть ключи с помощью SET / GET и других команд. Можно присоединиться к любому из узлов master и получить свойства кластера Redis. | ||
+ | |||
+ | Используем команду CLUSTER INFO для просмотра информации о состоянии кластера, его размер, хэш слоты, ошибки, если они есть | ||
+ | 127.0.0.1:6379> cluster info | ||
+ | cluster_state:ok | ||
+ | cluster_slots_assigned:16384 | ||
+ | cluster_slots_ok:16384 | ||
+ | cluster_slots_pfail:0 | ||
+ | cluster_slots_fail:0 | ||
+ | cluster_known_nodes:6 | ||
+ | cluster_size:3 | ||
+ | cluster_current_epoch:3 | ||
+ | cluster_my_epoch:1 | ||
+ | cluster_stats_messages_sent:3949 | ||
+ | cluster_stats_messages_received:3949 | ||
+ | |||
+ | |||
+ | Для проверки репликации master/slave используем команду INFO REPLICATION, которая возвращает информацию об узлах slave | ||
+ | # Replication | ||
+ | role:master | ||
+ | connected_slaves:3 | ||
+ | slave0:ip=172.16.10.46,port=6379,state=online,offset=2619,lag=0 | ||
+ | slave1:ip=172.16.10.50,port=6380,state=online,offset=2619,lag=1 | ||
+ | slave2:ip=172.16.10.45,port=6381,state=online,offset=2619,lag=1 | ||
+ | master_repl_offset:2619 | ||
+ | repl_backlog_active:1 | ||
+ | repl_backlog_size:1048576 | ||
+ | repl_backlog_first_byte_offset:2 | ||
+ | repl_backlog_histlen:2618 | ||
+ | |||
+ | |||
+ | Для проверки распределения данных можно установить несколько пар ключ-значение | ||
+ | 172.16.10.45:6379> SET John Adams | ||
+ | -> Redirected to slot [16006] located at 172.16.10.50:6381 | ||
+ | OK | ||
+ | 172.16.10.50:6381> SET James Madison | ||
+ | -> Redirected to slot [7089] located at 172.16.10.46:6380 | ||
+ | OK | ||
+ | 172.16.10.46:6380> SET Andrew Jackson | ||
+ | OK | ||
+ | 172.16.10.45:6379> GET John | ||
+ | -> Redirected to slot [16006] located at 172.16.10.50:6381 | ||
+ | "Adams" | ||
+ | |||
+ | |||
+ | '''Поведение Slave при отказе Master''' | ||
+ | |||
+ | При использовании данной топологии, при отказе одного из серверов кластер будет полностью работоспособен — slave-узел оставшийся без master-а станет master-ом. | ||
+ | |||
+ | |||
+ | Для проверки добавим пару ключ-значение | ||
+ | 172.16.10.45:6379> SET foo bar | ||
+ | -> Redirected to slot [12182] located at 172.16.10.50:6381 | ||
+ | OK | ||
+ | 172.16.10.50:6381> GET foo | ||
+ | "bar" | ||
+ | |||
+ | Ключ foo добавлен в master на Server 3 и реплицировался в slave на Server 1. | ||
+ | |||
+ | |||
+ | В случае, если Server 3 станет недоступен, slave на Server 1 станет master и кластер останется доступным<br/> | ||
+ | [[Файл:Redis cluster server fail.png]] | ||
+ | |||
+ | 172.16.10.45:6379> cluster nodes | ||
+ | 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 master,fail - 1568638385263 1568638384261 3 disconnected | ||
+ | 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 master - 0 1568638415465 2 connected 5461-10922 | ||
+ | 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 myself,master - 0 0 1 connected 0-5460 | ||
+ | 73beea633bb135f392f0b94deb1b6c5720283a39 172.16.10.50:6380 slave 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 0 1568638417470 2 connected | ||
+ | cf2a0caff28660820ca9320e78861387ac5b0716 172.16.10.45:6381 master - 0 1568638416467 4 connected 10923-16383 | ||
+ | ba4ed4a5ff6d679e69cd0fc118f2abb712c18a2f 172.16.10.46:6379 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568638413455 1 connected | ||
+ | |||
+ | |||
+ | Для ключа, который был в хэш слоте на сервере 3, пара ключ-значение теперь хранится на сервере 1. | ||
+ | 172.16.10.45:6379> GET foo | ||
+ | -> Redirected to slot [12182] located at 172.16.10.45:6381 | ||
+ | "bar" | ||
+ | |||
+ | |||
+ | redis-cli инструментарий консоли Redis | ||
+ | |||
+ | redis-check-rdb инструмент проверки RDB Redis | ||
+ | |||
+ | redis-check-aof инструмент проверки AOF (Append Only Files) Redis | ||
+ | |||
+ | redis-benchmark инструментарий эталонного тестирования Redis | ||
+ | |||
+ | redis-cli info [section] информация о Redis |
Текущая версия на 17:12, 24 сентября 2019
Установка, настройка и управление кластером Redis на Debian Stretch. Мануал является переводом и адаптацией англоязычной статьи.
Настройка узлов Master и Slave
В данной инструкции каждый master будет подключен к одному slave.
Официальная документация рекомендует использовать 6 узлов — по одному экземпляру Redis на узле, что позволяет обеспечить большую надежность, но возможно использовать три узла со следующей топологией соединений
В установке используется три сервера, на каждом из которых запущено по два экземпляра Redis. Убеждаемся, что каждый хост независим от других и не выйдет из строя совместно с другим.
Ставим Redis на каждом сервере через менеджер пакетов
# apt install redis-server
Для создания кластера и управления понадобится скрипт Ruby, который находится в /usr/share/doc/redis-tools/examples/redis-trib.rb
Если Ruby не установлен, ставим на основной сервер
# apt install ruby
Так же понадобится пакет Redis для Ruby:
# gem install redis
Далее выполняем следующие шаги:
Подключаемся к Server 1. Находим конфиг /etc/redis/redis.conf и делаем из него два, master и slave, оригинальный можно грохнуть
# cp redis.conf c_slave.conf # mv redis.conf a_master.conf
В a_master.conf, определяем директиву bind и активируем режим кластера. Порты в данном случае будут варьироваться в диапазоне от 6379 до 6381
bind 0.0.0.0 protected-mode no port 6379 pidfile /var/run/redis_6379.pid cluster-enabled yes cluster-config-file /etc/redis/conf.d/nodes-6379.conf cluster-node-timeout 15000
Для каждого узла в проектируемом кластере Redis требуется доступность не только определенного порта, но и порта выше 10000. На Server 1 оба порта TCP 6379 и 16379 должны быть открыты. Проверяем, что файрвол настроен корректно.
В c_slave.conf настройки будут аналогичны, кроме номера порта. Позднее для настройки режима slave, соответствующего определенному узлу master, будет использоваться скрипт redis-trib.rb
bind 0.0.0.0 protected-mode no port 6381 pidfile /var/run/redis_6381.pid cluster-enabled yes cluster-config-file /etc/redis/conf.d/nodes-6381.conf cluster-node-timeout 15000
Повторяем для оставшихся двух серверов, определив порты для всех пар master-slave.
Server | Master | Slave | IP |
---|---|---|---|
1 | 6379 | 6381 | 172.16.10.45 |
2 | 6380 | 6379 | 172.16.10.46 |
3 | 6381 | 6380 | 172.16.10.50 |
Запуск узлов Master и Slave
Подключаемся к Server 1 и запускаем оба экземпляра Redis
# redis-server /etc/redis/a_master.conf # redis-server /etc/redis/c_slave.conf
Для других двух серверов меняем a_master.conf и c_slave.conf соответствующим конфигурационным файлом. Все узлы master будут запущены в режиме кластера.
_._ _.-``__ -._ _.-`` `. `_. -._ Redis 3.2.6 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ -._ ( ' , .-` | `, ) Running in cluster mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 1221 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-'
После того как всё будет запускаться, можно впилить автозапуск в systemd
master
Создание кластера с использованием встроенного скрипта Ruby
На данном этапе на каждом сервере запущены по два независимых узла master. Дальнейшая установка кластера происходит с помощью скрипта Ruby.
Создаём кластер, передав список пар ip:port серверов, которые будут играть роль master
# ./redis-trib.rb create 172.16.10.45:6379 172.16.10.46:6380 172.16.10.50:6381
При успешной установке кластера вернется ответ
>>> Creating cluster >>> Performing hash slots allocation on 3 nodes... Using 3 masters: 172.16.10.45:6379 172.16.10.46:6380 172.16.10.50:6381 M: 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 slots:0-5460 (5461 slots) master M: 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 slots:5461-10922 (5462 slots) master M: 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 slots:10923-16383 (5461 slots) master Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join.. >>> Performing Cluster Check (using node 172.16.10.45:6379) M: 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 slots:0-5460 (5461 slots) master 0 additional replica(s) M: 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 slots:5461-10922 (5462 slots) master 0 additional replica(s) M: 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 slots:10923-16383 (5461 slots) master 0 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
Теперь мы можем получить все связанные с кластером узлы с помощью redis-cli(флаг -c определяет соединение с кластером) и посмотреть список узлов в кластере
# redis-cli -c -h 172.16.10.45 -p 6379 172.16.10.45> cluster nodes 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 myself,master - 0 0 1 connected 0-5460 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 master - 0 1568119239640 2 connected 5461-10922 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 master - 0 1568119238636 3 connected 10923-16383
На данном этапе в кластере только 3 master-сервера, данные будут распределяться по кластеру, но не реплицироваться. Присоединим к каждому серверу master один сервер slave, чтобы обеспечить репликацию данных.
Добавление узлов Slave
Для добавления новых узлов в кластер пользуемся утилитой redis-trib
./redis-trib.rb add-node --slave --master-id 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.46:6379 172.16.10.45:6379 >>> Adding node 172.16.10.46:6379 to cluster 172.16.10.45:6379 >>> Performing Cluster Check (using node 172.16.10.45:6379) M: 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 slots:0-5460 (5461 slots) master 0 additional replica(s) M: 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 slots:5461-10922 (5462 slots) master 0 additional replica(s) M: 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 slots:10923-16383 (5461 slots) master 0 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. >>> Send CLUSTER MEET to node 172.16.10.46:6379 to make it join the cluster. Waiting for the cluster to join. >>> Configure node as replica of 172.16.10.45:6379. [OK] New node added correctly.
Делаем для двух оставшихся узлов
./redis-trib.rb add-node --slave --master-id 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.50:6380 172.16.10.46:6380 ./redis-trib.rb add-node --slave --master-id 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.45:6381 172.16.10.50:6381
Проверяем
172.16.10.45:6379> cluster nodes 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 master - 0 1568632281867 3 connected 10923-16383 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 master - 0 1568632283872 2 connected 5461-10922 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 myself,master - 0 0 1 connected 0-5460 73beea633bb135f392f0b94deb1b6c5720283a39 172.16.10.50:6380 slave 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 0 1568632279862 2 connected cf2a0caff28660820ca9320e78861387ac5b0716 172.16.10.45:6381 slave 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 0 1568632282869 3 connected ba4ed4a5ff6d679e69cd0fc118f2abb712c18a2f 172.16.10.46:6379 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568632280865 1 connected
Распределение данных
Интерфейс командной строки Redis позволяет задать и просмотреть ключи с помощью SET / GET и других команд. Можно присоединиться к любому из узлов master и получить свойства кластера Redis.
Используем команду CLUSTER INFO для просмотра информации о состоянии кластера, его размер, хэш слоты, ошибки, если они есть
127.0.0.1:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:3 cluster_my_epoch:1 cluster_stats_messages_sent:3949 cluster_stats_messages_received:3949
Для проверки репликации master/slave используем команду INFO REPLICATION, которая возвращает информацию об узлах slave # Replication role:master connected_slaves:3 slave0:ip=172.16.10.46,port=6379,state=online,offset=2619,lag=0 slave1:ip=172.16.10.50,port=6380,state=online,offset=2619,lag=1 slave2:ip=172.16.10.45,port=6381,state=online,offset=2619,lag=1 master_repl_offset:2619 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:2618
Для проверки распределения данных можно установить несколько пар ключ-значение
172.16.10.45:6379> SET John Adams -> Redirected to slot [16006] located at 172.16.10.50:6381 OK 172.16.10.50:6381> SET James Madison -> Redirected to slot [7089] located at 172.16.10.46:6380 OK 172.16.10.46:6380> SET Andrew Jackson OK 172.16.10.45:6379> GET John -> Redirected to slot [16006] located at 172.16.10.50:6381 "Adams"
Поведение Slave при отказе Master
При использовании данной топологии, при отказе одного из серверов кластер будет полностью работоспособен — slave-узел оставшийся без master-а станет master-ом.
Для проверки добавим пару ключ-значение
172.16.10.45:6379> SET foo bar -> Redirected to slot [12182] located at 172.16.10.50:6381 OK 172.16.10.50:6381> GET foo "bar"
Ключ foo добавлен в master на Server 3 и реплицировался в slave на Server 1.
В случае, если Server 3 станет недоступен, slave на Server 1 станет master и кластер останется доступным
172.16.10.45:6379> cluster nodes 5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 master,fail - 1568638385263 1568638384261 3 disconnected 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 master - 0 1568638415465 2 connected 5461-10922 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 myself,master - 0 0 1 connected 0-5460 73beea633bb135f392f0b94deb1b6c5720283a39 172.16.10.50:6380 slave 6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 0 1568638417470 2 connected cf2a0caff28660820ca9320e78861387ac5b0716 172.16.10.45:6381 master - 0 1568638416467 4 connected 10923-16383 ba4ed4a5ff6d679e69cd0fc118f2abb712c18a2f 172.16.10.46:6379 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568638413455 1 connected
Для ключа, который был в хэш слоте на сервере 3, пара ключ-значение теперь хранится на сервере 1.
172.16.10.45:6379> GET foo -> Redirected to slot [12182] located at 172.16.10.45:6381 "bar"
redis-cli инструментарий консоли Redis
redis-check-rdb инструмент проверки RDB Redis
redis-check-aof инструмент проверки AOF (Append Only Files) Redis
redis-benchmark инструментарий эталонного тестирования Redis
redis-cli info [section] информация о Redis