предисловие
существуетRedis 3.0
Перед использованиемчасовой(sentinel
) механизм для мониторинга состояния между каждым узлом.Redis Cluster
даRedis
изРаспределенное решение,существует3.0
Версия официально запущена, эффективно решаяRedis
существуетраспределенныйпотребности аспекта. при встречеАвтономная память,параллелизм,потокВ ожидании узкого места вы можете использоватьCluster
архитектурный план для достижениябалансировки нагрузкицель.
Эта статья будетКластерное решение,распределение данных,Создайте кластер,Связь узла,Масштабирование кластера,маршрутизация запросов,отказоустойчивость,Работа и обслуживание кластераПредставить в нескольких аспектахRedis Cluster
.
Другие статьи
-
Углубленный анализ серии Redis (1) — введение в Redis и построение master-slave
-
Углубленный анализ серии Redis (2) — контрольный режим Redis и кластер высокой доступности
-
Углубленный анализ серии Redis (4) — Обзор структуры данных Redis и глобальных команд
-
Углубленный анализ серии Redis (5) — Строка структуры данных Redis
-
Углубленный анализ серии Redis (6) — хэш структуры данных Redis
-
Углубленный анализ серии Redis (7) — Список структур данных Redis
-
Углубленный анализ серии Redis (8) — коллекции структур данных Redis.
текст
1. Кластерное решение Redis
Redis Cluster
Кластерный режим обычно имеетВысокая доступность,Масштабируемость,распределенный,Отказоустойчивостьи другие характеристики.Redis
Обычно существует два типа распределенных решений:
1.1 Схема разбиения клиента
клиентрешил, что данные будутместо хранениякоторомуredis
узел или из которогоredis
узелчитать данные. Основная идея заключается в использованиихеш-алгоритмбудетRedis
данныеkey
хэш, поhash
функция, спец.key
встречакартак конкретномуRedis
на узле.
Схема разбиения клиентапредставленRedis Sharding
,Redis Sharding
даRedis Cluster
До того, как он вышел, в отрасли обычно использовалисьRedis
кластер с несколькими экземплярамиметод.Java
изRedis
Библиотека клиентских драйверовJedis
,служба поддержкиRedis Sharding
функция, т.е.ShardedJedis
а такжеВ сочетании с буферным пуломизShardedJedisPool
.
- преимущество
Не используйстороннее промежуточное ПО,логика разделовконтролируемый,настроитьПростой, нет связи между узлами, легкоЛинейное расширение, гибкий.
- недостаток
клиентневозможноДинамические добавления и удаленияСервисный узел, клиент должен обслуживать его самостоятельнологика распределения, между клиентамиобмен без установления соединения, вызоветотходы соединения.
1.2 Схема прокси-раздела
клиентотправить запрос напрокси-компонент,играет рольРазобратьклиентданные, перенаправить запрос на правильный узел и, наконец, отправить результат клиенту.
-
преимущество:упрощатьклиентраспределенная логика,клиентПрозрачный доступ, низкая стоимость переключения, проксиВпередиместо храненияразделение.
-
недостаток: еще один слойпрокси-уровень, в совокупностиСложность развертывания архитектурыипотеря производительности.
прокси-разделОсновные реализацииTwemproxy
иCodis
.
1.2.1. Twemproxy
Twemproxy
Также известен какnutcraker
,Даtwitter
с открытым исходным кодом одинredis
иmemcache
изПромежуточный прокси-серверпрограмма.Twemproxy
в видеиграет роль, может принимать доступ из нескольких программ, согласноправила маршрутизации, отправлено на задний планRedis
Server, а затем вернуться обратно тем же путем.Twemproxy
существуетединая точка отказапроблема, нужно совместитьLvs
иKeepalived
ДелатьРешение высокой доступности.
-
преимущество: Широкий диапазон приложений, высокая стабильность, промежуточный прокси-уровеньВысокая доступность.
-
недостаток: Невозможно плавноГоризонтальное расширение/уменьшение,никтоВизуальный интерфейс управления, эксплуатация и техническое обслуживание не являются дружественными, есть сбой, не можетавтоматическая передача.
1.2.2. Codis
Codis
Являетсяраспределенный Redis
Решение для приложений верхнего уровня состоит в том, чтобы подключитьCodis-Proxy
и прямое подключениеоригинальный Redis-Server
Нет никакой разницы.Codis
нижняя встречаОбработка переадресации запросов, без остановкиперенос данныхждать работы.Codis
лица без гражданствапрокси-уровень,заклиентДругими словами, все прозрачно.
- преимущество
верхний слойProxy
и нижний слойRedis
изВысокая доступность,разделение данныхиавтоматический баланс,поставкаИнтерфейс командной строкииRESTful API
,поставкамониториуправлятьинтерфейс, может быть динамическимДобавить киУдалить Redis
узел.
- недостаток
Архитектура развертыванияинастроитьсложный, не поддерживаетсячерез компьютерные комнатыимульти аренды,не поддерживаетсяУправление аутентификацией.
1.3 Схема маршрутизации запросов
Клиент случайнозапросить любойRedis
экземпляр, то поRedis
запроситВпереддаватьправильныйизRedis
узел.Redis Cluster
понялсмешанная формаизмаршрут запроса, но нетнепосредственныйотправить запрос отRedis
узелВпередк другомуRedis
узел, но вклиентнепосредственно с помощьюперенаправить(redirected
) к правильномуRedis
узел.
- преимущество
Нет центрального узла, данные согласноканавкаХранилище распределено по несколькимRedis
На экземпляре узел можно плавно выполнитьРасширение/усадка,служба поддержкиВысокая доступностьиавтоматический переход на другой ресурс, стоимость эксплуатации и обслуживания низкая.
- недостаток
сильно зависимыйRedis-trib
инструменты, отсутствиеУправление мониторингом, нужно зависеть отSmart Client
(поддерживать связь,таблица маршрутизации кеша,MultiOp
иPipeline
служба поддержки).Failover
узлаОбнаружение слишком медленное, скорее, чемцентральный узел ZooKeeper
своевременный.Gossip
Сообщения имеют некоторые накладные расходы. нельзя отличить по статистикеГорячие и холодные данные.
2. Распространение данных
2.1 Теория распределения данных
Распределенная база данныхСначала решитьвесь набор данныхв соответствии сПравила разбиениясопоставить снесколько узловпроблема, то естьнабор данныхразделен нанесколько узлов, каждый узел отвечает заОбщие данныеодин изПодмножество.
Распределение данных обычно имеетхэш-разделипоследовательный разделЭти два метода сравниваются следующим образом:
Разделение | Функции | сопутствующие товары |
---|---|---|
хэш-раздел | Степень дисперсии хорошая, распределение данных не имеет никакого отношения к бизнесу и не может быть доступно последовательно. | Кластер Redis, Cassandra, Dynamo |
последовательный раздел | Степень дискретности легко изменить, а распределение данных связано с бизнесом и может быть доступно последовательно. | БигТабл, HBase, Гипертаблица |
так какRedis Cluster
использоватьПравила разбиения хэша, обсуждалось здесьхэш-раздел. Общийхэш-разделЕсть несколько правил, которые описаны ниже:
2.1.1 Разделение остатка узла
Используйте конкретные данные, такие какRedis
изключилиПользователь ID
, то согласноколичество узлов N
Используйте формулу:hash(key)% N
Рассчитатьхэш-значение, используемый для определения данныхкартак какому узлу.
- преимущество
Выдающимся преимуществом этого метода является то, чтопростота, часто используется длябаза данныхизПравила подбиблиотеки и подтаблицы. обычно используетсяпредварительный разделобразом, заранее в соответствии сОбъем данныххорошо спланированныйКоличество разделовнапример, разделить на512
или1024
Таблица, чтобы убедиться, что она может поддерживать будущий период времениемкость данных, то согласноситуация с нагрузкойбудетповерхностьПеренести на другойбаза данныхсередина. Обычно используется при расширенииУдвойте емкость,избегатьотображение данныхвсе былирасстроена, Привести кполная миграцияСлучай.
- недостаток
когдаколичество узловизменения, такие какРасширениеилисокращатьузел, узел данныхСопоставление отношенийнеобходимо пересчитать, что приведет к получению данныхповторно мигрировать.
2.1.2 Согласованное разбиение хэша
Согласованное хешированиеможно очень хорошо решитьпроблемы со стабильностью, вы можете конвертировать всеузел хранениярасположены вконцы с концамиизHash
кольцо, каждыйkey
в вычисленияхHash
После встречипо часовой стрелкеоказатьсяСоседнийизузел храненияхранить. И когда есть узлыПрисоединяйсяилипокидать, влияет только на узел вHash
звонитьрядом по часовой стрелкеизпоследующий узел.
- преимущество
ПрисоединяйсяиУдалитьУзел влияет толькохэш кольцосерединаНаправление по часовой стрелкеизсоседние узлы, не влияет на другие узлы.
- недостаток
Узлы сложения и вычитаниявызоветхэш кольцоСредние данныеНе могу попасть. когда используешьнесколько узловчас,Изменения узлабудет иметь широкое влияниехэш кольцосерединаотображение данных,Неподходящийнесколько узлов данныхраспределенная схема.обычныйизСогласованное разбиение хэшаТребуется при добавлении или удалении узловудвоенныйилиминус половинаузел может гарантироватьданныеибалансировки нагрузки.
Уведомление:так какСогласованное разбиение хэшаиз этих недостатков некоторые распределенные системы используютвиртуальный слотправильноСогласованное хешированиевносить улучшения, например
Dynamo
система.
2.1.3 Разделение виртуального слота
раздел виртуального слотаиспользовать с умомхэш-пространство,использоватьхорошая дисперсияизхэш-функцияпоставить все данныекартаКФиксированный диапазонизколлекция целых чисел, целое число определяется какканавка(slot
). Этот диапазон, как правило,намного больше, чемколичество узлов, напримерRedis Cluster
Диапазон слотов0 ~ 16383
.канавканаходится внутри кластерауправление даннымиимигрироватьизосновная единица. использоватьслот широкого диапазонаОсновная цель – облегчитьразделение данныхиРасширение кластера. Каждый узел будет отвечать заопределенное количество слотов, как показано на рисунке:
Текущий кластер имеет5
узлов, каждый узел отвечает примерно за3276
Кусокканавка. Из-за использованиявысокое качествоизхеш-алгоритм, данные, отображаемые каждым слотом, обычно сравниваютсяуниформа, разделите данные поровну на5
узлы дляраздел данных.Redis Cluster
состоит в том, чтобы принятьраздел виртуального слота.
-
Узел 1: Включают
0
прибыть3276
количество хеш-слотов. -
Узел 2:Включают
3277
прибыть6553
количество хеш-слотов. -
Узел 3:Включают
6554
прибыть9830
количество хеш-слотов. -
Узел 4:Включают
9831
прибыть13107
количество хеш-слотов. -
Узел 5:Включают
13108
прибыть16383
количество хеш-слотов.
Эта структура легкоДобавить килиУдалитьузел. еслиУвеличиватьузел6
, вам нужно подчиненный узел1 ~ 5
получить частьканавканазначенный узлу6
начальство. если ты хочешьУдалитьузел1
, узел должен быть1
серединаканавкаперейти к узлу2 ~ 5
на, а затемнет слотовузел1
из кластераУдалитьВот и все.
Поскольку один узел будетхэш-слотпереход на другой узел неНе работает, так что вседобавить удалитьилиИзменятьузлаколичество хэш-слотовне вызоветКластер недоступенстатус.
2.2 Раздел данных Redis
Redis Cluster
использоватьраздел виртуального слота,всеключв соответствии схэш-функциясопоставить с0~16383
В целочисленном слоте формула расчета такова:slot = CRC16(key)& 16383
. Каждый узел отвечает за обслуживание части слотов и сопоставленных слотов.данные типа "ключ-значение", как показано на рисунке:
2.2.1 Особенности раздела виртуального слота Redis
-
разъединениеданныеиузелОтношения между узлами упрощаютРасширениеисокращатьтрудность.
-
сам узелслот обслуживанияСопоставление отношений,ненужныйклиентилиПрокси-сервисподдерживатьМетаданные раздела слота.
-
служба поддержкиузел,канавка,ключмеждузапрос карты, замаршрутизация данных,Онлайн масштабированиесцена.
2.3 Функциональные ограничения кластера Redis
Redis
относительный кластеравтономныйСуществуют некоторые ограничения в функциональности, которые требуютРазработчикЗнайте заранее и избегайте его, когда вы его используете.
-
key
Массовые операцииПоддержка ограничена.
похожийmset
,mget
операции, в настоящее время поддерживаются только пары с одинаковымиslot
стоило тогоkey
воплощать в жизньМассовые операции. закарта на разные slot
стоило тогоkey
из-за исполненияmget
,mget
и т. д. операции могут существовать на нескольких узлах и поэтому не поддерживаются.
-
key
транзакционная операцияПоддержка ограничена.
только поддержкамногие key
существуетна том же узлеизтранзакционная операция, когда несколькоkey
распространяется вразныена узленевозможноИспользуйте функцию транзакции.
-
key
в видераздел данныхминимальная степень детализации
не может разместитьбольшое значение ключаобъекты, такие какhash
,list
и т. д. сопоставитьразные узлы.
- не поддерживаетсяНесколько пространств баз данных
автономныйвнизRedis
может поддерживать16
база данных (db0 ~ db15
),кластерный режимможно использовать толькоОдинпространство базы данных, т.е.db0
.
- копировать структуруподдерживает только один слой
подчиненный узелтолько копироватьглавный узел,не поддерживаетсякопия вложенного дереваструктура.
3. Создание кластера Redis
Redis-Cluster
даRedis
официальныйВысокая доступностьрешение,Cluster
серединаRedis
общий2^14(16384)
Кусокslot
канавка. СоздайтеCluster
Задний,канавкавстречапоровнудля каждогоRedis
на узле.
Ниже описано, как запустить машину.6
КусокRedis
изКластерный сервиси использоватьredis-trib.rb
Создайте3 главных 3 подчиненныхизкластер. Создание кластера требует следующих трех шагов:
3.1. Подготовка узлов
Redis
Кластеры обычно состоят изнесколько узловсостав, количество узлов не менее6
убедиться, что составполная высокая доступностькластер. Каждый узел требуетвключить конфигурацию cluster-enabled yes
,позволятьRedis
Бегкластерный режимВниз.
Redis
Планирование узла кластера выглядит следующим образом:
имя узла | Номер порта | хозяин или раб | владелец мастер-узла |
---|---|---|---|
redis-6379 | 6379 | главный узел | --- |
redis-6389 | 6389 | подчиненный узел | redis-6379 |
redis-6380 | 6380 | главный узел | --- |
redis-6390 | 6390 | подчиненный узел | redis-6380 |
redis-6381 | 6381 | главный узел | --- |
redis-6391 | 6391 | подчиненный узел | redis-6381 |
Уведомление: рекомендуется для внутрикластерноговсе узлыЕдиный каталог, обычно разделенный на три каталога:
conf
,data
,log
, хранится отдельнонастроить,данныеибревноСвязанные документы. Пучок6
Конфигурация каждого узла размещена в единомconf
Под содержанием.
3.1.1 Создание каталогов экземпляров Redis
$ sudo mkdir -p /usr/local/redis-cluster
$ cd /usr/local/redis-cluster
$ sudo mkdir conf data log
$ sudo mkdir -p data/redis-6379 data/redis-6389 data/redis-6380 data/redis-6390 data/redis-6381 data/redis-6391
3.1.2 Управление файлом конфигурации Redis
Согласно следующемушаблоннастроить каждый экземплярredis.conf
, следующее необходимо только для построения кластерабазовая конфигурация, возможно, потребуется изменить в соответствии с реальной ситуацией.
# redis后台运行
daemonize yes
# 绑定的主机端口
bind 127.0.0.1
# 数据存放目录
dir /usr/local/redis-cluster/data/redis-6379
# 进程文件
pidfile /var/run/redis-cluster/${自定义}.pid
# 日志文件
logfile /usr/local/redis-cluster/log/${自定义}.log
# 端口号
port 6379
# 开启集群模式,把注释#去掉
cluster-enabled yes
# 集群的配置,配置文件首次启动自动生成
cluster-config-file /usr/local/redis-cluster/conf/${自定义}.conf
# 请求超时,设置10秒
cluster-node-timeout 10000
# aof日志开启,有需要就开启,它会每次写操作都记录一条日志
appendonly yes
- redis-6379.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6379
pidfile /var/run/redis-cluster/redis-6379.pid
logfile /usr/local/redis-cluster/log/redis-6379.log
port 6379
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6379.conf
cluster-node-timeout 10000
appendonly yes
- redis-6389.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6389
pidfile /var/run/redis-cluster/redis-6389.pid
logfile /usr/local/redis-cluster/log/redis-6389.log
port 6389
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6389.conf
cluster-node-timeout 10000
appendonly yes
- redis-6380.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6380
pidfile /var/run/redis-cluster/redis-6380.pid
logfile /usr/local/redis-cluster/log/redis-6380.log
port 6380
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6380.conf
cluster-node-timeout 10000
appendonly yes
- redis-6390.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6390
pidfile /var/run/redis-cluster/redis-6390.pid
logfile /usr/local/redis-cluster/log/redis-6390.log
port 6390
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6390.conf
cluster-node-timeout 10000
appendonly yes
- redis-6381.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6381
pidfile /var/run/redis-cluster/redis-6381.pid
logfile /usr/local/redis-cluster/log/redis-6381.log
port 6381
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6381.conf
cluster-node-timeout 10000
appendonly yes
- redis-6391.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6391
pidfile /var/run/redis-cluster/redis-6391.pid
logfile /usr/local/redis-cluster/log/redis-6391.log
port 6391
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6391.conf
cluster-node-timeout 10000
appendonly yes
3.2 Подготовка окружающей среды
3.2.1 Установите среду Ruby
$ sudo brew install ruby
3.2.2 Подготовка зависимостей rubygem redis
$ sudo gem install redis
Password:
Fetching: redis-4.0.2.gem (100%)
Successfully installed redis-4.0.2
Parsing documentation for redis-4.0.2
Installing ri documentation for redis-4.0.2
Done installing documentation for redis after 1 seconds
1 gem installed
3.2.3 Скопируйте redis-trib.rb в корневой каталог кластера
redis-trib.rb
даredis
Официально запущенное управлениеredis
кластеринструменты, интегрированные вredis
исходный кодsrc
каталог, будет основан наredis
который предоставилкластерная командаупаковано вПростой,удобный,практичныйизОперационный инструмент.
$ sudo cp /usr/local/redis-4.0.11/src/redis-trib.rb /usr/local/redis-cluster
Проверятьredis-trib.rb
Корректна ли командная среда?Вывод выглядит следующим образом:
$ ./redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
redis-trib.rb
даredis
для автораruby
Законченный.redis-trib.rb
инструмент командной строкиКонкретные функции заключаются в следующем:
Заказ | эффект |
---|---|
create | Создать кластер |
check | Проверить кластер |
info | Просмотр информации о кластере |
fix | Восстановить кластер |
reshard | Миграция слотов онлайн |
rebalance | Сбалансируйте количество слотов узлов кластера |
add-node | Присоединить новый узел к кластеру |
del-node | Удалить узел из кластера |
set-timeout | Устанавливает тайм-аут для пульсирующих соединений между узлами кластера. |
call | Выполнить команду на всех узлах кластера |
import | Импорт внешних данных Redis в кластер |
3.3 Установка кластера
3.3.1 Запустите сервисный узел Redis
Выполните следующую команду, чтобы начать6
башняredis
узел:
sudo redis-server conf/redis-6379.conf
sudo redis-server conf/redis-6389.conf
sudo redis-server conf/redis-6380.conf
sudo redis-server conf/redis-6390.conf
sudo redis-server conf/redis-6381.conf
sudo redis-server conf/redis-6391.conf
После завершения запускаredis
Запустите в режиме кластера, см. каждыйredis
Статус процесса узла:
$ ps -ef | grep redis-server
0 1908 1 0 4:59下午 ?? 0:00.01 redis-server *:6379 [cluster]
0 1911 1 0 4:59下午 ?? 0:00.01 redis-server *:6389 [cluster]
0 1914 1 0 4:59下午 ?? 0:00.01 redis-server *:6380 [cluster]
0 1917 1 0 4:59下午 ?? 0:00.01 redis-server *:6390 [cluster]
0 1920 1 0 4:59下午 ?? 0:00.01 redis-server *:6381 [cluster]
0 1923 1 0 4:59下午 ?? 0:00.01 redis-server *:6391 [cluster]
в каждомredis
узлаredis.conf
В файле мы настроилиcluster-config-file
Путь к файлу при запуске кластера,conf
Каталог будет заново сгенерированкластерФайл конфигурации узла. Просмотрите список файлов следующим образом:
$ tree -L 3 .
.
├── appendonly.aof
├── conf
│ ├── node-6379.conf
│ ├── node-6380.conf
│ ├── node-6381.conf
│ ├── node-6389.conf
│ ├── node-6390.conf
│ ├── node-6391.conf
│ ├── redis-6379.conf
│ ├── redis-6380.conf
│ ├── redis-6381.conf
│ ├── redis-6389.conf
│ ├── redis-6390.conf
│ └── redis-6391.conf
├── data
│ ├── redis-6379
│ ├── redis-6380
│ ├── redis-6381
│ ├── redis-6389
│ ├── redis-6390
│ └── redis-6391
├── log
│ ├── redis-6379.log
│ ├── redis-6380.log
│ ├── redis-6381.log
│ ├── redis-6389.log
│ ├── redis-6390.log
│ └── redis-6391.log
└── redis-trib.rb
9 directories, 20 files
3.3.2 перераспределение связанных узлов кластера
в соответствии сОт хозяина к рабуПутьслева направочтобы6
Кусокredis
узел.
$ sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391
После создания кластераredis-trib
сначала будет16384
Кусокхэш-слотНазначен3
Кусокглавный узел,Сейчасredis-6379
,redis-6380
иredis-6381
. Затем поместите каждыйподчиненный узелнаправлениеглавный узел,провестисинхронизация данных.
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:6379
127.0.0.1:6380
127.0.0.1:6381
Adding replica 127.0.0.1:6390 to 127.0.0.1:6379
Adding replica 127.0.0.1:6391 to 127.0.0.1:6380
Adding replica 127.0.0.1:6389 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
slots:0-5460 (5461 slots) master
M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
slots:5461-10922 (5462 slots) master
M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
slots:10923-16383 (5461 slots) master
S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
replicates ad4b9ffceba062492ed67ab336657426f55874b7
S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
replicates df23c6cad0654ba83f0422e352a81ecee822702e
S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
replicates ab9da92d37125f24fe60f1f33688b4f8644612ee
затем введитеyes
,redis-trib.rb
Начать выполнениеРукопожатие узлаираспределение слотовоперации, вывод следующий:
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:6379)
M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
slots: (0 slots) slave
replicates df23c6cad0654ba83f0422e352a81ecee822702e
S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
slots: (0 slots) slave
replicates ab9da92d37125f24fe60f1f33688b4f8644612ee
M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
slots: (0 slots) slave
replicates ad4b9ffceba062492ed67ab336657426f55874b7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
воплощать в жизньКластерная проверка, проверьте каждыйredis
узел занятхэш-слот(slot
) и количествоslot
покрытие.16384
в слотах,главный узел redis-6379
,redis-6380
иredis-6381
соответственно заняты5461
,5461
и5462
слот.
3.3.3 Журнал мастер-узла Redis
можно найти поBGSAVE
Заказ,подчиненный узел redis-6389
существуетЗа кулисамиасинхронно отглавный узел redis-6379
Синхронные данные.
$ cat log/redis-6379.log
1907:C 05 Sep 16:59:52.960 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1907:C 05 Sep 16:59:52.961 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1907, just started
1907:C 05 Sep 16:59:52.961 # Configuration loaded
1908:M 05 Sep 16:59:52.964 * Increased maximum number of open files to 10032 (it was originally set to 256).
1908:M 05 Sep 16:59:52.965 * No cluster configuration found, I'm ad4b9ffceba062492ed67ab336657426f55874b7
1908:M 05 Sep 16:59:52.967 * Running mode=cluster, port=6379.
1908:M 05 Sep 16:59:52.967 # Server initialized
1908:M 05 Sep 16:59:52.967 * Ready to accept connections
1908:M 05 Sep 17:01:17.782 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
1908:M 05 Sep 17:01:17.812 # IP address for this node updated to 127.0.0.1
1908:M 05 Sep 17:01:22.740 # Cluster state changed: ok
1908:M 05 Sep 17:01:23.681 * Slave 127.0.0.1:6389 asks for synchronization
1908:M 05 Sep 17:01:23.681 * Partial resynchronization not accepted: Replication ID mismatch (Slave asked for '4c5afe96cac51cde56039f96383ea7217ef2af41', my replication IDs are '037b661bf48c80c577d1fa937ba55367a3692921' and '0000000000000000000000000000000000000000')
1908:M 05 Sep 17:01:23.681 * Starting BGSAVE for SYNC with target: disk
1908:M 05 Sep 17:01:23.682 * Background saving started by pid 1952
1952:C 05 Sep 17:01:23.683 * DB saved on disk
1908:M 05 Sep 17:01:23.749 * Background saving terminated with success
1908:M 05 Sep 17:01:23.752 * Synchronization with slave 127.0.0.1:6389 succeeded
3.3.4 Проверка целостности кластера Redis
использоватьredis-trib.rb check
обнаружение команды, созданное додва кластераполучится ли,check
Команду нужно давать только в кластерелюбой адрес узлаэто может быть сделановесь кластеризпроверка работы, команда выглядит следующим образом:
$ ./redis-trib.rb check 127.0.0.1:6379
Когда следующая информация будет наконец выведена, кластеру будет предложеновсе слотыприсваиваются узлам:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
резюме
В этой статье описываетсяRedis
Кластерное решение,распределение данныхиКластерная конструкция. Кластерные планы включаютклиентский разделплан,прокси-разделпрограмма имаршрут запросаплан.распределение данныхчасть простоОстаток узлараздел,Согласованное хешированиераздел ивиртуальный слотРазделы описаны и сравнены. последняя пара с использованиемRedis-trib
построилТри господа и три рабаизвиртуальный слотКластерный пример.
Ссылаться на
«Разработка и эксплуатация Redis»
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.