Обалдеть, можно ли таким образом построить кластер Redis за секунды?

Java Redis
Обалдеть, можно ли таким образом построить кластер Redis за секунды?

Раньше мы говорили13 военных правил оптимизации производительности Redis! 》, наиболее важным является использование функции кластера Redis, то в этой статье мы увидим, как создать кластер Redis в 1 с.

Redis Cluster — это кластерное решение Redis, запущенное в Redis 3.0. Оно распределяет данные по разным служебным областям, чтобы уменьшить зависимость системы от одного главного узла и может значительно повысить производительность чтения и записи служб Redis.

Redis делит все данные на 16384 слота (слота), и каждый узел отвечает за часть слотов.Когда клиент Redis подключается к кластеру, он получает информацию о конфигурации слота кластера, чтобы он мог напрямую отправить команду запроса на соответствующий узел для обработки.

Redis Cluster — это децентрализованный режим работы без агента.Большинство команд, отправленных клиентом, будут напрямую переданы соответствующим узлам для выполнения.Таким образом, в большинстве случаев команду запроса не нужно пересылать, или запрос может быть выполнен только с одним перенаправлением ответа, поэтому производительность одного узла кластера очень близка к производительности одного сервера Redis, поэтому теоретически при удвоении главного узла по горизонтали производительность обработка запросов удваивается, поэтому производительность Redis Cluster Performance очень высока.

Схема архитектуры Redis Cluster показана ниже:

image.png

Построить кластер Redis

Существует два способа создания кластера Redis: один — использовать инструмент создания кластера, предоставленный в исходном коде Redis, для быстрого создания среды кластера Redis, а другой — вручную создать среду кластера Redis путем настройки файлов.

1. Быстро построить кластер Redis

Инструмент create-cluster находится в каталоге utils/create-cluster, как показано на следующем рисунке:

image.png
использовать команду./create-cluster startВы можете быстро создать кластер Redis следующим образом:

$ ./create-cluster start # 创建集群
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006

Далее нам нужно передать 6 узлов, созданных выше, черезcreateКоманда формирует кластер и выполняется следующим образом:

[@iZ2ze0nc5n41zomzyqtksmZ:create-cluster]$ ./create-cluster create # 组建集群
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 445f2a86fe36d397613839d8cc1ae6702c976593 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: 63bb14023c0bf58926738cbf857ea304bff8eb50 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: 64828ab44566fc5ad656e831fd33de87be1387a0 127.0.0.1:30004
   replicates 445f2a86fe36d397613839d8cc1ae6702c976593
S: 0b17b00542706343583aa73149ec5ff63419f140 127.0.0.1:30005
   replicates 63bb14023c0bf58926738cbf857ea304bff8eb50
S: e35f06ca9b700073472d72001a39ea4dfcb541cd 127.0.0.1:30006
   replicates 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc
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 127.0.0.1:30001)
M: 445f2a86fe36d397613839d8cc1ae6702c976593 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: e35f06ca9b700073472d72001a39ea4dfcb541cd 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc
S: 0b17b00542706343583aa73149ec5ff63419f140 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 63bb14023c0bf58926738cbf857ea304bff8eb50
M: 63bb14023c0bf58926738cbf857ea304bff8eb50 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 64828ab44566fc5ad656e831fd33de87be1387a0 127.0.0.1:30004
   slots: (0 slots) slave
   replicates 445f2a86fe36d397613839d8cc1ae6702c976593
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

Во время выполнения вас спросят, хотите ли вы использовать 30001, 30002, 30003 в качестве главных узлов и 30004, 30005, 30006 в качестве подчиненных узлов, введитеyesбудет выполнен после завершения.

Сначала мы можем использовать redis-cli для подключения к кластеру, команда выглядит следующим образом:

$ redis-cli -c -p 30001

Используйте команду nodes для просмотра информации об узле кластера. Команда выглядит следующим образом:

127.0.0.1:30001> cluster nodes
864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc 127.0.0.1:30003@40003 master - 0 1585125835078 3 connected 10923-16383
e35f06ca9b700073472d72001a39ea4dfcb541cd 127.0.0.1:30006@40006 slave 864d4dfe32e3e0b81a64cec8b393bbd26a65cbcc 0 1585125835078 6 connected
0b17b00542706343583aa73149ec5ff63419f140 127.0.0.1:30005@40005 slave 63bb14023c0bf58926738cbf857ea304bff8eb50 0 1585125835078 5 connected
63bb14023c0bf58926738cbf857ea304bff8eb50 127.0.0.1:30002@40002 master - 0 1585125834175 2 connected 5461-10922
445f2a86fe36d397613839d8cc1ae6702c976593 127.0.0.1:30001@40001 myself,master - 0 1585125835000 1 connected 0-5460
64828ab44566fc5ad656e831fd33de87be1387a0 127.0.0.1:30004@40004 slave 445f2a86fe36d397613839d8cc1ae6702c976593 0 1585125835000 4 connected

Можно видеть, что 30001, 30002 и 30003 являются главными узлами, соответствующие слоты 30001 — 0-5460, соответствующие слоты 30002 — 5461-10922, а соответствующие слоты 30003 — 10923-16383, с общим из 16384 слотов (от 0 до 16383).

Хотя метод создания кластера очень быстрый, количество основных и подчиненных узлов и режим распределения слотов кластера, построенного этим методом, фиксированы, и они устанавливаются на одном сервере, поэтому их можно использовать только в тесте. окружающая обстановка.

После завершения нашего теста мы можемИспользуйте следующие команды для завершения работы и очистки кластера.:

$ ./create-cluster stop # 关闭集群
Stopping 30001
Stopping 30002
Stopping 30003
Stopping 30004
Stopping 30005
Stopping 30006
$ ./create-cluster clean # 清理集群

2. Создайте кластер Redis вручную.

Из-за ограничений самого create-cluster в реальной производственной среде нам необходимо вручную добавить конфигурацию для создания кластера Redis.По этой причине нам сначала нужно скопировать установочный пакет Redis в файлы node1–node6, потому что мы необходимо установить 6 узлов, 3 ведущих и 3 подчиненных, как показано на следующем рисунке:

image.png
image.png
Далее настраиваем и запускаем кластер Redis.

① Установите файл конфигурации

Нам нужно изменить файл redis.conf в каждом узле, чтобы установитьcluster-enabled yesУказывает, что режим кластера включен и соответствующие порты изменены.Мы продолжаем использовать от 30001 до 30006, черезport 3000X настраивать.

② Запустите каждый узел

После того, как redis.conf настроен, мы можем запустить все узлы с помощью следующих команд:

cd /usr/local/soft/mycluster/node1 
./src/redis-server redis.conf

③ Создайте кластер и назначьте слоты

Ранее мы запустили 6 нод, но эти ноды не связаны между собой в соответствующих кластерах, поэтому далее нам нужно соединить эти ноды в кластер и назначить им соответствующие слоты, выполнить команду следующим образом:

redis-cli --cluster create 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006 --cluster-replicas 1

Среди них за create следуют несколько узлов, что означает, что эти узлы используются как узлы всего кластера, а 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 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30004
   replicates bdd1c913f87eacbdfeabc71befd0d06c913c891c
S: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30005
   replicates bdd1c913f87eacbdfeabc71befd0d06c913c891c
S: bdd1c913f87eacbdfeabc71befd0d06c913c891c 127.0.0.1:30006
   replicates bdd1c913f87eacbdfeabc71befd0d06c913c891c
Can I set the above configuration? (type 'yes' to accept): 

Из приведенной выше информации видно, что Redis намеревается установить 30001, 30002 и 30003 в качестве мастер-узлов и выделить для них слоты. соответствующие слоты 30003 — 5461-10922 и 30003. Слот 10923-16383, 30005 — подчиненный узел 30001, 30006 — подчиненный узел 30002, 30004 — подчиненный узел 30003, нам нужно только войтиyesНазначение может быть подтверждено и выполнено следующим образом:

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 127.0.0.1:30001)
M: 887397e6fefe8ad19ea7569e99f5eb8a803e3785 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: abec9f98f9c01208ba77346959bc35e8e274b6a3 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 887397e6fefe8ad19ea7569e99f5eb8a803e3785
S: 1a324d828430f61be6eaca7eb2a90728dd5049de 127.0.0.1:30004
   slots: (0 slots) slave
   replicates f5958382af41d4e1f5b0217c1413fe19f390b55f
S: dc0702625743c48c75ea935c87813c4060547cef 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 3da35c40c43b457a113b539259f17e7ed616d13d
M: 3da35c40c43b457a113b539259f17e7ed616d13d 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: f5958382af41d4e1f5b0217c1413fe19f390b55f 127.0.0.1:30003
   slots:[10923-16383] (5461 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.

Если отображается OK, весь кластер успешно запущен.

Затем мы используем redis-cli для подключения и проверки рабочего состояния кластера.Код выглядит следующим образом:

$ redis-cli -c -p 30001 # 连接到集群
127.0.0.1:30001> 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:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:130
cluster_stats_messages_pong_sent:127
cluster_stats_messages_sent:257
cluster_stats_messages_ping_received:122
cluster_stats_messages_pong_received:130
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:257

Описания соответствующих полей были определены в приведенном выше коде и не будут повторяться здесь.

Динамически добавлять и удалять узлы

В некоторых случаях нам нужно динамически добавлять или удалять узлы в уже работающий кластер в соответствии с реальной бизнес-ситуацией, тогда нам нужно сделать следующее.

1. Увеличьте мастер-узел

Добавить метод 1: встреча кластера

использоватьcluster meet ip:portЧтобы добавить узел в кластер, выполните команду следующим образом:

127.0.0.1:30001> cluster meet 127.0.0.1 30007
OK
127.0.0.1:30001> cluster nodes
dc0702625743c48c75ea935c87813c4060547cef 127.0.0.1:30006@40006 slave 3da35c40c43b457a113b539259f17e7ed616d13d 0 1585142916000 6 connected
df0190853a53d8e078205d0e2fa56046f20362a7 127.0.0.1:30007@40007 master - 0 1585142917740 0 connected
f5958382af41d4e1f5b0217c1413fe19f390b55f 127.0.0.1:30003@40003 master - 0 1585142916738 3 connected 10923-16383
3da35c40c43b457a113b539259f17e7ed616d13d 127.0.0.1:30002@40002 master - 0 1585142913000 2 connected 5461-10922
abec9f98f9c01208ba77346959bc35e8e274b6a3 127.0.0.1:30005@40005 slave 887397e6fefe8ad19ea7569e99f5eb8a803e3785 0 1585142917000 5 connected
887397e6fefe8ad19ea7569e99f5eb8a803e3785 127.0.0.1:30001@40001 myself,master - 0 1585142915000 1 connected 0-5460
1a324d828430f61be6eaca7eb2a90728dd5049de 127.0.0.1:30004@40004 slave f5958382af41d4e1f5b0217c1413fe19f390b55f 0 1585142916000 4 connected

Видно, что узел с портом 30007 добавлен в кластер и установлен в качестве главного узла.

Способ добавления 2: добавить узел

использоватьredis-cli --cluster add-node 添加节点ip:port 集群某节点ip:portВы также можете добавить узел в кластер, выполнив следующую команду:

$ redis-cli --cluster add-node 127.0.0.1:30008 127.0.0.1:30001
>>> Adding node 127.0.0.1:30008 to cluster 127.0.0.1:30001
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: 887397e6fefe8ad19ea7569e99f5eb8a803e3785 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: dc0702625743c48c75ea935c87813c4060547cef 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 3da35c40c43b457a113b539259f17e7ed616d13d
M: df0190853a53d8e078205d0e2fa56046f20362a7 127.0.0.1:30007
   slots: (0 slots) master
M: f5958382af41d4e1f5b0217c1413fe19f390b55f 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 1d09d26fd755298709efe60278457eaa09cefc26 127.0.0.1:30008
   slots: (0 slots) master
M: 3da35c40c43b457a113b539259f17e7ed616d13d 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: abec9f98f9c01208ba77346959bc35e8e274b6a3 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 887397e6fefe8ad19ea7569e99f5eb8a803e3785
S: 1a324d828430f61be6eaca7eb2a90728dd5049de 127.0.0.1:30004
   slots: (0 slots) slave
   replicates f5958382af41d4e1f5b0217c1413fe19f390b55f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[ERR] Node 127.0.0.1:30008 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

Из приведенных выше результатов видно, что узел 30008 также установлен в качестве главного узла.

2. Добавить подчиненный узел

использоватьcluster replicate nodeIdчтобы установить текущий узел в качестве подчиненного узла целевого узла, выполните команду следующим образом:

127.0.0.1:30008> cluster replicate df0190853a53d8e078205d0e2fa56046f20362a7
OK
127.0.0.1:30008> cluster nodes
df0190853a53d8e078205d0e2fa56046f20362a7 127.0.0.1:30007@40007 master - 0 1585147827000 0 connected
abec9f98f9c01208ba77346959bc35e8e274b6a3 127.0.0.1:30005@40005 slave 887397e6fefe8ad19ea7569e99f5eb8a803e3785 0 1585147827000 1 connected
1a324d828430f61be6eaca7eb2a90728dd5049de 127.0.0.1:30004@40004 slave f5958382af41d4e1f5b0217c1413fe19f390b55f 0 1585147823000 3 connected
887397e6fefe8ad19ea7569e99f5eb8a803e3785 127.0.0.1:30001@40001 master - 0 1585147826000 1 connected 0-5460
dc0702625743c48c75ea935c87813c4060547cef 127.0.0.1:30006@40006 slave 3da35c40c43b457a113b539259f17e7ed616d13d 0 1585147826930 2 connected
f5958382af41d4e1f5b0217c1413fe19f390b55f 127.0.0.1:30003@40003 master - 0 1585147826000 3 connected 10923-16383
1d09d26fd755298709efe60278457eaa09cefc26 127.0.0.1:30008@40008 myself,slave df0190853a53d8e078205d0e2fa56046f20362a7 0 1585147823000 7 connected
3da35c40c43b457a113b539259f17e7ed616d13d 127.0.0.1:30002@40002 master - 0 1585147827933 2 connected 5461-10922

Видно, что 30008 стал подчиненным узлом 30007.

3. Удалить узел

использоватьcluster forget nodeIdКоманда для удаления узла из кластера. Когда эта команда отличается от команды встречи, вам нужно использовать идентификатор узла для удаления узла, который можно удалить с помощьюcluster nodesКоманда для просмотра информации об идентификаторе всех узлов Комбинация первых 40 букв и массивов каждой строки является идентификатором узла, как показано на следующем рисунке:

image.png
Команда выполнения следующая:

127.0.0.1:30001> cluster forget df0190853a53d8e078205d0e2fa56046f20362a7
OK

В этот момент мы используемcluster nodesКоманда для просмотра всей информации об узле кластера:

127.0.0.1:30001> cluster nodes
dc0702625743c48c75ea935c87813c4060547cef 127.0.0.1:30006@40006 slave 3da35c40c43b457a113b539259f17e7ed616d13d 0 1585143789940 6 connected
f5958382af41d4e1f5b0217c1413fe19f390b55f 127.0.0.1:30003@40003 master - 0 1585143791000 3 connected 10923-16383
3da35c40c43b457a113b539259f17e7ed616d13d 127.0.0.1:30002@40002 master - 0 1585143789000 2 connected 5461-10922
abec9f98f9c01208ba77346959bc35e8e274b6a3 127.0.0.1:30005@40005 slave 887397e6fefe8ad19ea7569e99f5eb8a803e3785 0 1585143789000 5 connected
887397e6fefe8ad19ea7569e99f5eb8a803e3785 127.0.0.1:30001@40001 myself,master - 0 1585143786000 1 connected 0-5460
1a324d828430f61be6eaca7eb2a90728dd5049de 127.0.0.1:30004@40004 slave f5958382af41d4e1f5b0217c1413fe19f390b55f 0 1585143791945 4 connected

Видно, что предыдущий узел с портом 30007 нами успешно удален.

резюме

В этой статье рассказывается о двух способах создания кластера Redis: запуск создания кластера и создание кластера.Хотя первый метод быстрее, он может создать только фиксированное количество узлов master-slave, и все узлы находятся на одном сервере.Поэтому его можно использовать только в тестовой среде. Мы также говорили о возможности Redis Cluster динамически добавлять главные и подчиненные узлы и удалять любые узлы.

Я надеюсь, что эта статья была вам полезна, давайте попрактикуемся~

Следуйте QR-коду ниже, чтобы подписаться на более интересный контент.

Java中文社群公众号二维码