Translate

неділя, 9 січня 2022 р.

Redis Cluster

Я вже якось писав про базові можливості Redis і про способи забезпечення вищої доступності. Але цей цикл статей не був би повний без статті про Redis Cluster, інсталяції, що покриває як питання високої доступності, так і шардингу. 


1. INTRO

Redis Cluster має наступні переваги/особливості:

  • Висока доступність та горизонтальне масштабування до 1000 вузлів. Проте consistent hashing відсутній: при додаванні чи видаленні серверів із кластеру необхідно самому попіклуватись про рівномірний розподіл та переміщеня даних в кластері. Деякі з цих проблем вирішені в Enterprise версії.
  • Асинхронна синхронізація зі слейвами. Тобто кластер не гарантує консистентності операцій, тож при певному збігу обставин (наприклад фейловер процес) деякі дані можуть бути втраченими. Але це позитивно впливає на продуктивність.
  • Відсутність тразакцій/multiple-keys операцій (MULTI, EXEC, DISCARD, WATCH ), але це можна дещо пом'якшити із простановкою hash tag для ключів. Це пов'язано із самим процесом хешування (алгоритмом розміщення даних в кластері): перший ключ при записі може потрапити на перший сервер, а наступний після нього - на останній. Тож можливо код клієнта треба буде дещо змінити.
  • Одна із основних переваг Redis Cluster - це шардинг. Тобто великі об'єми даних можна розділити на групи серверів. У випадку Redis Sentinel він обмежений кількістю оперативної пам'яті сервера. До речі, Enterprise версія вміє використовувати кеш SSD-диску
  • Slave-вузли не простоюють, а забезпечують операції читання для кінцевих клієнтів. Хоч звісно можливі випадки надання не найсвіжіших даних через асинхронну природу реплікації.
  • Наявність replica migration. Тобто майстри, що мають декілька реплік, можуть ділитись реплікою із іншим майстром, який її потребує.

Із деталями будемо розбиратись в процесі налаштування. Cluster функціонал з'явився починаючи із версії 3, де його створенням та розподіленням даних в кластері ще займався ruby-скрипт. Наразі все інтегровано в redis-cli утиліту.


2. BASIC INSTALLATION OF REDIS CLUSTER

Наша тестова інсталяція буде складатись із 6 вузлів: 3 майстри і слейв для кожного майстра:

192.168.1.201 - redis-m1
192.168.1.202 - redis-m2
192.168.1.203 - redis-m3

192.168.1.211 - redis-s1
192.168.1.212 - redis-s2
192.168.1.213 - redis-s3

Всі вузли мають бути досяжними один для одного, тобто знаходитись у одній мережі. Обмін сервісними даними між нодами кластеру відбувається за допомогою gosip-протоколу.

На кожній із них проінсталюємо останній Редіс із офіційного репозиторію:

# add-apt-repository ppa:redislabs/redis
# apt-get update
# apt-get install redis

Остання стабільна весія Редісу на даний момент - 6.2.6:

# redis-server -v
Redis server v=6.2.6 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=9c9e426e2f96cc51

Дозволимо автоматичне завантаження сервісу разом із стартом операційної системи:

# systemctl enable redis-server

Дещо виправимо головний конфігураційний файл і перевантажимо сервіс:

# vim /etc/redis/redis.conf
...
bind ip.add.re.ss # Replace this IP address to the own IP address on each node
protected-mode no
cluster-enabled yes
cluster-config-file nodes-6397.conf
cluster-node-timeout 15000
appendonly yes
...

  • bind ip.add.re.ss - тут потрібно ввести адресу вузла
  • protected-mode no - по-замовчуванню цей параметр вставлений в yes, що забезпечує лише локальну роботу демона
  • cluster-enabled yes - кластерний режим роботи редіса
  • cluster-config-file nodes-6397.conf - назва конфігураційного файлу для роботи кластеру, його не слід редагувати вручну, він генерується автоматично після старту сервісу із активованою опцією cluster-enabled. Якщо кластер стартує за допомогою копіювання віртуалок - то необхідно прослідкувати, щоб він не скопіювався також. Шлях його розміщення в Ubuntu - /var/lib/redis/. Інакше кластер не збереться
  • cluster-node-timeout 15000 - к-ть мілісекунд після яких вузол кластера буде вважатись недоступним
  • appendonly yes - активація AOF (Append Only File) механізму. Кожна write операція буде записуватись до файлу, задля майбутнього швидкого старту із необхідними даними.

Також порт 16397 має бути відкритий для всіх вузлів кластеру, адже це шина кластера, і вона слугує для обміну сервісними повідомленнями. Він обирається автоматично за номером обраний порт сервіса + 10000.

Перевантажимо Redis:

# systemctl restart redis-server

# ps aux | grep redis
redis       1086  0.1  0.8  60812  9324 ?        Ssl  01:40   0:00 /usr/bin/redis-server ip.add.re.ss:6379 [cluster]

# cat /var/log/redis/redis-server.log
1086:M 30 Dec 2021 01:40:10.931 * Ready to accept connections

Перейдемо до створення кластеру. Перші 3 адреси - майбутні майстри, а наступні 3 - слейви. Слейви надалі можуть ставати майстрами - тому ділення умовне:

$ redis-cli --cluster create 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.211:6379 192.168.1.212:6379 192.168.1.213:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.212:6379 to 192.168.1.201:6379
Adding replica 192.168.1.213:6379 to 192.168.1.202:6379
Adding replica 192.168.1.211:6379 to 192.168.1.203:6379
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[0-5460] (5461 slots) master
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots:[5461-10922] (5462 slots) master
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[10923-16383] (5461 slots) master
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
S: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   replicates 5adcc48cea2c2ad2fa33021606082535e7bc91ab
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 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   slots: (0 slots) slave
   replicates 5adcc48cea2c2ad2fa33021606082535e7bc91ab
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Тут варто зазначити те, як сервіс розподіляє дані по вузлам. Редіс кластер розділяє всі дані на хеш слоти (hash slots). Всіх слотів, що сервіс може розподілити по вузлах кластеру, - 16384. Тобто якщо три майстра в кластері - то це буде приблизно по 5461 слоти на вузол (цього разу хтось із вузлів отримає на 1 слот більше). Більш того у випадку кластера база даних лише одна, на відміну від звичайної інсталяції, де їх 16.

Для того щоб записати чи вичитати ключ редіс кластер кожне значення буде пропускати через спеціальний алгоритм (складова якого CRC16 геш-функція) і таким чином отримуватиме значення слоту в який треба записати/прочитати значення ключа:

HASH_SLOT = CRC16(key) mod 16384

Власне це і є прикладом реалізації геш-таблиць.

Переглянемо інформацію щодо кластера:

$ redis-cli -h 192.168.1.201 -p 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:8
cluster_my_epoch:7
cluster_stats_messages_ping_sent:80440
cluster_stats_messages_pong_sent:80035
cluster_stats_messages_auth-ack_sent:1
cluster_stats_messages_sent:160476
cluster_stats_messages_ping_received:80025
cluster_stats_messages_pong_received:80440
cluster_stats_messages_meet_received:10
cluster_stats_messages_fail_received:1
cluster_stats_messages_auth-req_received:1
cluster_stats_messages_received:160477

Перевіримо вузли, що є в кластері та яку вони роль наразі виконують:

$ redis-cli -h 192.168.1.201 -p 6379 cluster nodes
5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379@16379 master - 0 1641090063000 2 connected 5461-10922
2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379@16379 myself,master - 0 1641090064000 7 connected 0-5460
680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379@16379 slave 5adcc48cea2c2ad2fa33021606082535e7bc91ab 0 1641090064096 2 connected
10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379@16379 slave 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 0 1641090064000 3 connected
97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379@16379 master - 0 1641090066112 3 connected 10923-16383
26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379@16379 slave 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 0 1641090065104 7 connected

Протестуємо роботу кластера. Зупинимо редіс-сервіс на redis-m2 задля призначення слейва redis-s2 новим майстром:

# systemctl stop redis

Та перевіримо статус кластера:

$ redis-cli -h 192.168.1.201 -p 6379 cluster nodes
5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379@16379 master,fail - 1641163348350 1641163345000 2 disconnected
2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379@16379 myself,master - 0 1641163370000 7 connected 0-5460
680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379@16379 master - 0 1641163369583 8 connected 5461-10922
10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379@16379 slave 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 0 1641163370592 3 connected
97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379@16379 master - 0 1641163369000 3 connected 10923-16383
26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379@16379 slave 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 0 1641163368571 7 connected

Як і очікувалось, 192.168.1.213 став майстром. Якщо ж знову запустити редіс на redis-m2 - то ситуація із розстановкою майстрів не зміниться, і він так і лишиться слейвом.

Пересвідчитись в тому, що кластер працює і дані зберігаються на різних вузлах можна і зі стандартної консолі редіса:

$ redis-cli -c -h 192.168.1.201 -p 6379
192.168.1.201:6379> set foo bar
-> Redirected to slot [5420] located at 192.168.1.201:6379
OK
192.168.1.204:6379> set hello world
-> Redirected to slot [12182] located at 192.168.1.203:6379
OK
192.168.1.204:6379> get foo
"bar"
192.168.1.204:6379> get hello
"world"

Тобто на деяких ключах відбуватиметься перенаправлення на інший вузол. Це має робити сам клієнт, тому і активований ключ '-с'. В реальному житті клієнти (бібліотеки) кешують схему локації слотів, тому одразу знають що і звідки запитувати.


3. ADDING NEW NODES TO CLUSTER

Додавання нових вузлів до кластеру Redis у випадку community-версії відбувається не зовсім автоматично. Після додавання вузла необхідно провести також перебалансування слотів задля їх рівномірного розподілення. Відповідно видалення ноди із кластеру ще складніше - тому що потрібно також переселити активні слоти на робочі одиниці кластеру і лише потім запускати перебалансування. Ці операції відбуваються без даунтайтаймів у випадку, якщо додатки підключені до кластеру коректними драйверами/бібліотеками.

Проте, у випадку із ребалансуванням ключів із встановленим hash tag, multiple-keys операції можуть бути тимчасово недоступними.

Перевіримо ще раз розподілення слотів по вузлах:

$ redis-cli --cluster check 192.168.1.201:6379
192.168.1.201:6379 (2c2a8802...) -> 0 keys | 5461 slots | 1 slaves.
192.168.1.213:6379 (680fd32d...) -> 0 keys | 5462 slots | 1 slaves.
192.168.1.203:6379 (97a13b39...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots: (0 slots) slave
   replicates 680fd32db581a3300bedd0c2632418008eb48e37
M: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Додамо дві нові ноди:

192.168.1.204 - redis-m4
192.168.1.214 - redis-s4

Для цього їх звісно необхідно створити і вручну додати до кластеру. Отже додамо новий майстер redis-m4:

$ redis-cli --cluster add-node 192.168.1.204:6379 192.168.1.201:6379
>>> Adding node 192.168.1.204:6379 to cluster 192.168.1.201:6379
>>> Performing Cluster Check (using node 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   slots: (0 slots) slave
   replicates 5adcc48cea2c2ad2fa33021606082535e7bc91ab
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.1.204:6379 to make it join the cluster.
[OK] New node added correctly.

Перша адреса - це адреса нового вузла, а друга - будь-яка адреса вузла діючого кластеру. Додамо redis-s4, що надалі слугуватиме слейвом для redis-m4:

$ redis-cli --cluster add-node 192.168.1.214:6379 192.168.1.201:6379 --cluster-slave
>>> Adding node 192.168.1.214:6379 to cluster 192.168.1.201:6379
>>> Performing Cluster Check (using node 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be 192.168.1.204:6379
   slots: (0 slots) master
S: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   slots: (0 slots) slave
   replicates 5adcc48cea2c2ad2fa33021606082535e7bc91ab
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 192.168.1.204:6379
>>> Send CLUSTER MEET to node 192.168.1.214:6379 to make it join the cluster.
Waiting for the cluster to join
>>> Configure node as replica of 192.168.1.204:6379.
[OK] New node added correctly.

Але це не зовсім правда. Нода буде зроблена слейвом якогось майстра на розсуд redis-cli. Якщо є бажання зробити її слейвом саме redis-m4 - то треба це вказати напряму:

$ redis-cli --cluster add-node 192.168.1.214:6379 192.168.1.201:6379 --cluster-slave --cluster-master-id b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be

b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be - id сервера redis-m4

Тож з'явився новий майстер на якому 0 слотів:

$ redis-cli --cluster check 192.168.1.201:6379
192.168.1.201:6379 (2c2a8802...) -> 0 keys | 5461 slots | 1 slaves.
192.168.1.202:6379 (5adcc48c...) -> 0 keys | 5462 slots | 1 slaves.
192.168.1.204:6379 (b99bcf00...) -> 0 keys | 0 slots | 1 slaves.
192.168.1.203:6379 (97a13b39...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 33efa3b5d3a45278e9de453cf4c88463ea5007b9 192.168.1.214:6379
   slots: (0 slots) slave
   replicates b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be
M: b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be 192.168.1.204:6379
   slots: (0 slots) master
   1 additional replica(s)
S: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   slots: (0 slots) slave
   replicates 5adcc48cea2c2ad2fa33021606082535e7bc91ab
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

На 192.168.1.204 вузлі 0 слотів, тож потрібно зробити перебалансування слотів. Це може бути довгою операцієї в залежності від того наскільки великий кластер:

$ redis-cli --cluster rebalance 192.168.1.204:6379 --cluster-use-empty-masters
>>> Performing Cluster Check (using node 192.168.1.204:6379)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 4 nodes. Total weight = 4.00
Moving 1366 slots from 192.168.1.202:6379 to 192.168.1.204:6379
######################################...######################################################
Moving 1365 slots from 192.168.1.203:6379 to 192.168.1.204:6379
######################################...######################################################
Moving 1365 slots from 192.168.1.201:6379 to 192.168.1.204:6379
######################################...######################################################

Ключ --cluster-use-empty-masters важливий, адже інакше буде спроба перебалансування лише на старих нодах, ігноруючи нові додані.

Тепер все чудово, як і має бути:

$ redis-cli --cluster check 192.168.1.201:6379
192.168.1.201:6379 (2c2a8802...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.202:6379 (5adcc48c...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.204:6379 (b99bcf00...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.203:6379 (97a13b39...) -> 0 keys | 4096 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 33efa3b5d3a45278e9de453cf4c88463ea5007b9 192.168.1.214:6379
   slots: (0 slots) slave
   replicates b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be
M: b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be 192.168.1.204:6379
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   slots: (0 slots) slave
   replicates 5adcc48cea2c2ad2fa33021606082535e7bc91ab
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Тобто в кластері як було, так і лишилось в сумі 16384 слоти, але тепер на кожному вузлі їх 4096. 

Кластер із 4 майстрів, в котрому ролі визначаються голосування (кворумом) вузлів - погана ідея, адже можливі split-brain. Це лише приклад, а не готовий варіант для production-інсталяції.


4. REMOVING NODE FROM CLUSTER

Нехай нам потрібно вивести наступний вузол із кластеру:

192.168.1.202 - redis-m2

та його слейв:

192.168.1.212 - redis-s2

Так просто це не можна зробити. Спочатку потрібно перенести всі його слоти на інші вузли. Наприклад на redis-m3:

$ redis-cli --cluster reshard 192.168.1.202:6379 \
--cluster-from  5adcc48cea2c2ad2fa33021606082535e7bc91ab \
--cluster-to    97a13b39af8ba930fcb211598c67d9e0b5ed0a01 \
--cluster-slots 4096 \
--cluster-yes
>>> Performing Cluster Check (using node 192.168.1.202:6379)
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
S: 33efa3b5d3a45278e9de453cf4c88463ea5007b9 192.168.1.214:6379
   slots: (0 slots) slave
   replicates b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be 192.168.1.204:6379
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   slots: (0 slots) slave
   replicates 5adcc48cea2c2ad2fa33021606082535e7bc91ab
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Ready to move 4096 slots.
  Source nodes:
    M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
       slots:[6827-10922] (4096 slots) master
       1 additional replica(s)
  Destination node:
    M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
       slots:[12288-16383] (4096 slots) master
       1 additional replica(s)
  Resharding plan:
    Moving slot 6827 from 5adcc48cea2c2ad2fa33021606082535e7bc91ab
    Moving slot 6828 from 5adcc48cea2c2ad2fa33021606082535e7bc91ab
    Moving slot 6829 from 5adcc48cea2c2ad2fa33021606082535e7bc91ab
    Moving slot 6830 from 5adcc48cea2c2ad2fa33021606082535e7bc91ab
...
Moving slot 6827 from 192.168.1.202:6379 to 192.168.1.203:6379: 
Moving slot 6828 from 192.168.1.202:6379 to 192.168.1.203:6379:
...

Значення --cluster-from --cluster-to та --cluster-slots обрані не випадково та базуються на попередніх виводах команд. Це id серверів та кількість слотів (всі), котрі ми плануємо перемістити на інший вузол. Пересвідчимось, що слоти справді мігрували на redis-m3 (192.168.1.203):

$ redis-cli --cluster check 192.168.1.201:6379
192.168.1.201:6379 (2c2a8802...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.202:6379 (5adcc48c...) -> 0 keys | 0 slots | 0 slaves.
192.168.1.204:6379 (b99bcf00...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.203:6379 (97a13b39...) -> 0 keys | 8192 slots | 2 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots: (0 slots) master
S: 33efa3b5d3a45278e9de453cf4c88463ea5007b9 192.168.1.214:6379
   slots: (0 slots) slave
   replicates b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be
M: b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be 192.168.1.204:6379
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: 680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[6827-10922],[12288-16383] (8192 slots) master
   2 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Як наслідок операцій вище redis-m3 отримав ще один слейв redis-s2. Видалимо одну із непотрібних реплік:

$ redis-cli -h 192.168.1.201 -p 6379 cluster nodes | grep slave
33efa3b5d3a45278e9de453cf4c88463ea5007b9 192.168.1.214:6379@16379 slave b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be 0 1641261071000 11 connected
680fd32db581a3300bedd0c2632418008eb48e37 192.168.1.213:6379@16379 slave 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 0 1641261073602 12 connected
10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379@16379 slave 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 0 1641261070576 12 connected
26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379@16379 slave 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 0 1641261072593 7 connected

$ redis-cli --cluster del-node 192.168.1.201:6379 680fd32db581a3300bedd0c2632418008eb48e37
>>> Removing node 680fd32db581a3300bedd0c2632418008eb48e37 from cluster 192.168.1.201:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

Як бачимо слоти із двох вузлів тепер мігрували на redis-m3 тож їх знову треба перебалансувати:

$ redis-cli --cluster rebalance 192.168.1.201:6379
>>> Performing Cluster Check (using node 192.168.1.201:6379)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 3 nodes. Total weight = 3.00
Moving 1366 slots from 192.168.1.203:6379 to 192.168.1.201:6379
######################################...######################################################
Moving 1365 slots from 192.168.1.203:6379 to 192.168.1.204:6379
######################################...######################################################

Перевіримо чи справді слоти рівномірно розподілились:

$ redis-cli --cluster check 192.168.1.201:6379
192.168.1.201:6379 (2c2a8802...) -> 0 keys | 5462 slots | 1 slaves.
192.168.1.202:6379 (5adcc48c...) -> 0 keys | 0 slots | 0 slaves.
192.168.1.204:6379 (b99bcf00...) -> 0 keys | 5461 slots | 1 slaves.
192.168.1.203:6379 (97a13b39...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[1365-5460],[6827-8192] (5462 slots) master
   1 additional replica(s)
M: 5adcc48cea2c2ad2fa33021606082535e7bc91ab 192.168.1.202:6379
   slots: (0 slots) master

S: 33efa3b5d3a45278e9de453cf4c88463ea5007b9 192.168.1.214:6379
   slots: (0 slots) slave
   replicates b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be
M: b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be 192.168.1.204:6379
   slots:[0-1364],[5461-6826],[8193-9557],[10923-12287] (5461 slots) master
   1 additional replica(s)
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[9558-10922],[12288-16383] (5461 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Тепер можемо вивести із кластеру і сам майстер:

# redis-cli --cluster del-node 192.168.1.201:6379 5adcc48cea2c2ad2fa33021606082535e7bc91ab
>>> Removing node 5adcc48cea2c2ad2fa33021606082535e7bc91ab from cluster 192.168.1.201:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

$ redis-cli --cluster check 192.168.1.201:6379
192.168.1.201:6379 (2c2a8802...) -> 0 keys | 5462 slots | 1 slaves.
192.168.1.204:6379 (b99bcf00...) -> 0 keys | 5461 slots | 1 slaves.
192.168.1.203:6379 (97a13b39...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.201:6379)
M: 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293 192.168.1.201:6379
   slots:[1365-5460],[6827-8192] (5462 slots) master
   1 additional replica(s)
S: 33efa3b5d3a45278e9de453cf4c88463ea5007b9 192.168.1.214:6379
   slots: (0 slots) slave
   replicates b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be
M: b99bcf00e648ff4e3b69e8e0cdca973a8fefa4be 192.168.1.204:6379
   slots:[0-1364],[5461-6826],[8193-9557],[10923-12287] (5461 slots) master
   1 additional replica(s)
S: 10b8c933f5b094e6c28782791fa58211e6078a62 192.168.1.211:6379
   slots: (0 slots) slave
   replicates 97a13b39af8ba930fcb211598c67d9e0b5ed0a01
M: 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 192.168.1.203:6379
   slots:[9558-10922],[12288-16383] (5461 slots) master
   1 additional replica(s)
S: 26ceae70be9a3679ed37bad77d5bb3999f4c4dda 192.168.1.212:6379
   slots: (0 slots) slave
   replicates 2c2a8802f1a91a5f3aa7d1a51e2de4f069e09293
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Чудово. Все як і було заплановано.


5. BOTTOM LINE

У статті ми пройшлись по конфігурації і основним операціям обслуговування Redis Cluster. Як бачимо деякі моменти потребують уважності людини, що його обслуговує. Це зовсім не рішення на кшталт Elasticsearch, де всі міграції і переміщення відбуваються без ручного втручання.



Немає коментарів:

Дописати коментар