Redis. Кластер — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
(не показано 11 промежуточных версий этого же участника)
Строка 17: Строка 17:
  
 
Для создания кластера и управления понадобится скрипт Ruby, который находится в /usr/share/doc/redis-tools/examples/redis-trib.rb<br/>
 
Для создания кластера и управления понадобится скрипт Ruby, который находится в /usr/share/doc/redis-tools/examples/redis-trib.rb<br/>
Если Ruby не установлен, ставим на основной сервер:
+
Если Ruby не установлен, ставим на основной сервер
 
  # apt install ruby
 
  # apt install ruby
  
Строка 26: Строка 26:
 
Далее выполняем следующие шаги:
 
Далее выполняем следующие шаги:
  
Подключаемся к серверу 1. Находим конфиг /etc/redis/redis.conf и делаем из него два, master и slave, оригинальный можно грохнуть.
+
Подключаемся к Server 1. Находим конфиг /etc/redis/redis.conf и делаем из него два, master и slave, оригинальный можно грохнуть
 
  # cp redis.conf c_slave.conf
 
  # cp redis.conf c_slave.conf
 
  # mv redis.conf a_master.conf
 
  # mv redis.conf a_master.conf
  
  
В a_master.conf, определяем директиву bind и активируем режим кластера. Порты в данном случае будут варьироваться в диапазоне от 6379 до 6381.
+
В a_master.conf, определяем директиву bind и активируем режим кластера. Порты в данном случае будут варьироваться в диапазоне от 6379 до 6381
 
  bind 0.0.0.0
 
  bind 0.0.0.0
 
  protected-mode no
 
  protected-mode no
Строка 40: Строка 40:
 
  cluster-node-timeout 15000
 
  cluster-node-timeout 15000
  
Для каждого узла в проектируемом кластере Redis требуется доступность не только определенного порта, но и порта выше 10000. На сервере 1 оба порта TCP 6379 и 16379 должны быть открыты. Проверяем, что файрвол настроен корректно.
+
Для каждого узла в проектируемом кластере Redis требуется доступность не только определенного порта, но и порта выше 10000. На Server 1 оба порта TCP 6379 и 16379 должны быть открыты. Проверяем, что файрвол настроен корректно.
  
  
Строка 70: Строка 70:
 
'''Запуск узлов Master и Slave'''
 
'''Запуск узлов Master и Slave'''
  
Подключаемся к серверу 1 и запускаем оба экземпляра Redis
+
Подключаемся к Server 1 и запускаем оба экземпляра Redis
 
  # redis-server /etc/redis/a_master.conf
 
  # redis-server /etc/redis/a_master.conf
 
  # redis-server /etc/redis/c_slave.conf
 
  # redis-server /etc/redis/c_slave.conf
Строка 104: Строка 104:
  
 
При успешной установке кластера вернется ответ
 
При успешной установке кластера вернется ответ
 +
>>> 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 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.50:6380 172.16.10.46:6380
 +
./redis-trib.rb add-node --slave --master-id 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6381 172.16.10.50:6381
 +
 +
 +
Проверяем
 +
172.16.10.45:6379> cluster nodes
 +
3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 myself,master - 0 0 1 connected 0-5460
 +
ba4ed4a5ff6d679e69cd0fc118f2abb712c18a2f 172.16.10.46:6379 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568117880458 1 connected
 +
cf2a0caff28660820ca9320e78861387ac5b0716 172.16.10.45:6381 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568117883464 1 connected
 +
6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 master - 0 1568117881962 2 connected 5461-10922
 +
5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 master - 0 1568117881460 3 connected 10923-16383
 +
73beea633bb135f392f0b94deb1b6c5720283a39 172.16.10.50:6380 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568117882464 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 и кластер останется доступным

Версия 16:09, 10 сентября 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 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 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
 `-._    `-._`-.__.-'_.-'    _.-'
|`-._`-._    `-.__.-'    _.-'_.-'|
|    `-._`-._        _.-'_.-'    |
 `-._    `-._`-.__.-'_.-'    _.-'
     `-._    `-.__.-'    _.-'
         `-._        _.-'
             `-.__.-'


Создание кластера с использованием встроенного скрипта 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 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.50:6380 172.16.10.46:6380
./redis-trib.rb add-node --slave --master-id 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6381 172.16.10.50:6381


Проверяем

172.16.10.45:6379> cluster nodes
3b4a43092d0032ee914f58bec9fa5e0c30f035e6 172.16.10.45:6379 myself,master - 0 0 1 connected 0-5460
ba4ed4a5ff6d679e69cd0fc118f2abb712c18a2f 172.16.10.46:6379 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568117880458 1 connected
cf2a0caff28660820ca9320e78861387ac5b0716 172.16.10.45:6381 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568117883464 1 connected
6d944aa3bf1f4fd9adfc5d7239317c5b406332d4 172.16.10.46:6380 master - 0 1568117881962 2 connected 5461-10922
5e241ff2eafca16aba7013de3e93c9f9e46ab5aa 172.16.10.50:6381 master - 0 1568117881460 3 connected 10923-16383
73beea633bb135f392f0b94deb1b6c5720283a39 172.16.10.50:6380 slave 3b4a43092d0032ee914f58bec9fa5e0c30f035e6 0 1568117882464 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 и кластер останется доступным