Обзор построения кластера
Redis обычно требует 6 узлов для формирования полного кластера высокой доступности, здесь мы используемdocker-compose
Чтобы быстро построить кластер.
Кластерное здание обычно разделено на три шага:
- подготовить узел
- Рукопожатие узла
- слот распределения
Шаг 1: Подготовьте узел
Загрузите код с GitHub
Адрес проекта GitHub:GitHub.com/будет кошка/горячая…
Уведомление
Из-за обновления кода имя контейнера задается вручную в конфигурационном файле, поэтому имя контейнера в статье и код отличаются, например, в статьеredis-cluster_redis-cluster-6380_1
, в коде и в реальной работеnode-80
, в статьеredis-cluster_redis-cluster-6381_1
, в коде и в реальной работеnode-81
Откройте фоновую службу, запустите все узлы
Войдите в каталог redis-cluster-docker и выполнитеdocker-compose up -d
Проверить текущий статус кластера
Просто введите контейнер, напримерredis-cluster_redis-cluster-6380_1
[1],docker exec -it redis-cluster_redis-cluster-6380_1 redis-cli -p 6380
, затем запуститеcluster nodes
команда, весь процесс выглядит следующим образом:
$ docker exec -it redis-cluster_redis-cluster-6380_1 redis-cli -p 6380
127.0.0.1:6380> cluster nodes
3914fe7597f9ad9e9c485cf473bcaa461973baaa :6380@16380 myself,master - 0 0 0 connected
Видно, что каждый узел в настоящее время может возвращать только свою информацию, и каждый узел не может воспринимать друг друга.
[1] Этоdocker-compose
По нашему мнениюdocker-compose.yml
Настроенное имя службы генерируется автоматически. Если вы не хотите использовать имя по умолчанию, вы можете использовать его в файле конфигурации.container_name
Укажите имя контейнераdocker exec
Шаг 2. Рукопожатие узла
Рукопожатие узла относится к пакету узлов, работающих в режиме кластера, проходящих черезGossip
Протоколы взаимодействуют друг с другом для достижения процесса восприятия друг друга.
- Выполняется на узле
cluster meet {ip} {port}
Команда, чтобы добиться рукопожатия между двумя узлами, эти два узла образуют реальный кластер, который осознает друг друга, а затем два узла будут периодически проходитьping/pong
сообщение для нормальной связи узла - Выполнение на любом узле в кластере
cluster meet {ip} {port}
команда для добавления нового узла, который еще не присоединился к кластеру - После того, как все узлы добавлены, вы можете увидеть информацию обо всех узлах в кластере.
127.0.0.1:6380> cluster nodes
c6db83c252a072407707917474001c70da649407 172.26.0.6:6385@16385 master - 0 1565199856348 3 connected
e356c336482f7a8a3f786674b96ac06030b0dcb4 172.26.0.3:6381@16381 master - 0 1565199855000 0 connected
dae83c485b9fb1357947944b36007c3371a750f2 172.26.0.7:6383@16383 master - 0 1565199857362 5 connected
c87aba899473356f25a919dc2d477340f5222ba4 172.26.0.2:6382@16382 master - 0 1565199855000 4 connected
5ebbd85dfbe1e4e01bae5f4954418a436453876c 172.26.0.5:6384@16384 master - 0 1565199855339 2 connected
3914fe7597f9ad9e9c485cf473bcaa461973baaa 172.26.0.4:6380@16380 myself,master - 0 1565199855000 1 connected
Дополнительные знания: сеть docker-compose по умолчанию
- После запуска контейнера с помощью docker-compose up эти контейнеры будут добавлены
{app_name}_default
В сети - использовать
docker network ls
Вы можете просмотреть список сетей,docker network inspect <network_name>
Вы можете просмотреть конфигурацию соответствующей сети и IP-адрес каждого контейнера. - также через
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-cluster_redis-cluster-6385_1
Команда напрямую проверяет IP-адрес контейнера.
Шаг три распределительных канавок
После того, как узлы установили рукопожатие, кластер по-прежнему находится в автономном режиме и не может выполнять операции записи.
127.0.0.1:6380> set hello world
(error) CLUSTERDOWN Hash slot not served
Глядя на информацию о кластере, вы можете видеть, что кластерfail
государство
127.0.0.1:6380> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:718
cluster_stats_messages_pong_sent:283
cluster_stats_messages_meet_sent:8
cluster_stats_messages_sent:1009
cluster_stats_messages_ping_received:283
cluster_stats_messages_pong_received:285
cluster_stats_messages_received:568
Выполните команду, чтобы выделить слот
Сделайте что-нибудь вродеcluster addslots {0...5461}
команда для равномерного распределения слотов от 0 до 16383 на все узлы. Здесь мы выделяем только три узла, а остальные три узла соответственно используются в качестве подчиненных узлов первых трех узлов, так что аварийное переключение может быть выполнено автоматически при сбое главного узла.
//分配三个节点,注意,以下三个命令在登录redis-cli之后是不成功的,只能使用redis-cli -p 6380 cluster addslots {0..5461}这种模式
$ docker exec -it redis-cluster_redis-cluster-6380_1 redis-cli -p 6380 cluster addslots {0..5461}
$ docker exec -it redis-cluster_redis-cluster-6381_1 redis-cli -p 6381 cluster addslots {5462..10922}
$ docker exec -it redis-cluster_redis-cluster-6382_1 redis-cli -p 6382 cluster addslots {10923..16282}
// 将三个未分配槽的节点设置为从节点
127.0.0.1:6383> CLUSTER REPLICATE 3914fe7597f9ad9e9c485cf473bcaa461973baaa
OK
127.0.0.1:6384> CLUSTER REPLICATE e356c336482f7a8a3f786674b96ac06030b0dcb4
OK
127.0.0.1:6385> CLUSTER REPLICATE c87aba899473356f25a919dc2d477340f5222ba4
OK
Официальный кластер быстрого строительства инструмента
Таким образом, кластер из 3-х мастеров и 3-х слейвов собран, и чувствуется, что это довольно хлопотно, так что Redis официально вredis3.x
иredis4.x
при условииredis-trib.rb
Инструмент удобен нам для быстрого построения кластера, вredis5.x
можно использовать напрямуюredis-cli
команду для непосредственного завершения построения кластера одним щелчком мыши, устраняя необходимость вredis-trib.rb
Проблема зависимости от среды ruby.В коде README.MD для обеспечения быстрой сборки.
//官方指出: 可以使用redis5.x 的redis-cli命令模式来搭建由redis-4.x组成的集群。
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
Использование кластера
запросить перенаправление
Чтение и запись данных, не принадлежащих этому узлу, на узле в кластере вернет ошибку.(error) MOVED 5798 172.20.0.6:6381
, дабы уменьшить процесс ручного переключения можно добавить при открытии клиента-c
параметр, включить перенаправление запроса, подробная командаredis-cli -p 6380 -c
, чтобы он автоматически переходил к соответствующему узлу при работе с другими узлами в будущем.
УМНЫЙ клиент
Клиенты Redis для большинства языков разработки используют Smart client для поддержки кластерного протокола.Для выбора клиента см.clients.
- Смарт-клиент поддерживает отношение сопоставления слот->узел в содержимом и может выполнять поиск по ключу к узлу локально, тем самым обеспечивая максимальную эффективность ввода-вывода.
- и
Moved
Перенаправление отвечает за помощь Smart-клиенту в обновлении отношения отображения слот->узел.
СПРОСИТЕ перенаправление
При масштабировании кластера слот будет перенесен, а затем чтение и запись на исходный узел вернутся.(error) ASK {slot} {targetIP}:{targetPort}
Ошибка, клиент извлекает информацию о целевом узле из исключения перенаправления ASK и отправляетasking
команду на целевой узел, чтобы открыть идентификатор подключения клиента, а затем выполнить ключевую команду. Если он существует, он будет выполнен, если он не существует, он вернет сообщение о несуществовании.
Отказоустойчивость кластера
TODO