Углубленный анализ серии Redis (3) — подробное объяснение конструкции и принципа кластерного режима Redis.

Redis задняя часть база данных Архитектура балансировки нагрузки

предисловие

существуетRedis 3.0Перед использованиемчасовой(sentinel) механизм для мониторинга состояния между каждым узлом.Redis ClusterдаRedisизРаспределенное решение,существует3.0Версия официально запущена, эффективно решаяRedisсуществуетраспределенныйпотребности аспекта. при встречеАвтономная память,параллелизм,потокВ ожидании узкого места вы можете использоватьClusterархитектурный план для достижениябалансировки нагрузкицель.

Эта статья будетКластерное решение,распределение данных,Создайте кластер,Связь узла,Масштабирование кластера,маршрутизация запросов,отказоустойчивость,Работа и обслуживание кластераПредставить в нескольких аспектахRedis Cluster.

Другие статьи

текст

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в видеиграет роль, может принимать доступ из нескольких программ, согласноправила маршрутизации, отправлено на задний планRedisServer, а затем вернуться обратно тем же путем.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

零壹技术栈

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