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.203 - redis-m3
192.168.1.211 - redis-s1
192.168.1.212 - redis-s2
192.168.1.213 - redis-s3
На кожній із них проінсталюємо останній Редіс із офіційного репозиторію:
# apt-get update
# apt-get install redis
Остання стабільна весія Редісу на даний момент - 6.2.6:
Дозволимо автоматичне завантаження сервісу разом із стартом операційної системи:
# systemctl enable redis-server
Дещо виправимо головний конфігураційний файл і перевантажимо сервіс:
...
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:
# ps aux | grep redis
1086:M 30 Dec 2021 01:40:10.931 * Ready to accept connections
Перейдемо до створення кластеру. Перші 3 адреси - майбутні майстри, а наступні 3 - слейви. Слейви надалі можуть ставати майстрами - тому ділення умовне:
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
Власне це і є прикладом реалізації геш-таблиць.
Переглянемо інформацію щодо кластера:
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
Перевіримо вузли, що є в кластері та яку вони роль наразі виконують:
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 новим майстром:
Та перевіримо статус кластера:
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 - то ситуація із розстановкою майстрів не зміниться, і він так і лишиться слейвом.
Пересвідчитись в тому, що кластер працює і дані зберігаються на різних вузлах можна і зі стандартної консолі редіса:
-> 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 операції можуть бути тимчасово недоступними.
Перевіримо ще раз розподілення слотів по вузлах:
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.214 - redis-s4
Для цього їх звісно необхідно створити і вручну додати до кластеру. Отже додамо новий майстер redis-m4:
>>> 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:
>>> 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 - то треба це вказати напряму:
Тож з'явився новий майстер на якому 0 слотів:
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 слотів, тож потрібно зробити перебалансування слотів. Це може бути довгою операцієї в залежності від того наскільки великий кластер:
[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 важливий, адже інакше буде спроба перебалансування лише на старих нодах, ігноруючи нові додані.
Тепер все чудово, як і має бути:
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:
--cluster-to 97a13b39af8ba930fcb211598c67d9e0b5ed0a01 \
--cluster-slots 4096 \
--cluster-yes
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):
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. Видалимо одну із непотрібних реплік:
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
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
Як бачимо слоти із двох вузлів тепер мігрували на redis-m3 тож їх знову треба перебалансувати:
[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
######################################...######################################################
Перевіримо чи справді слоти рівномірно розподілились:
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.
Тепер можемо вивести із кластеру і сам майстер:
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
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, де всі міграції і переміщення відбуваються без ручного втручання.
https://redis.io/topics/cluster-tutorial
https://redis.io/topics/cluster-spec
https://severalnines.com/database-blog/installing-redis-cluster-cluster-mode-enabled-auto-failover
https://severalnines.com/database-blog/hash-slot-resharding-and-rebalancing-redis-cluster
https://linux.m2osw.com/redis-infamous-waiting-cluster-join-message
https://computingforgeeks.com/how-to-install-redis-on-ubuntu-debian/
https://russianblogs.com/article/2447302332/
Немає коментарів:
Дописати коментар