3 минуты на изучение конструкции и принципов репликации master-slave в redis.

Redis
3 минуты на изучение конструкции и принципов репликации master-slave в redis.

айтишник

一个在大厂做高级Java开发的程序猿

Обратите внимание на публичный аккаунт WeChat: IT-брат

Ответ: Видеоруководство по практическому проекту Java: вы можете получить 200G, 27 комплектов видеоурока по практическому проекту

Re: Маршрут обучения Java, вы можете получить самую последнюю и самую полную дорожную карту обучения

Re: Java eBook, вы можете получить 13 обязательных к прочтению книг для лучших программистов

Ответ: полный набор учебных пособий по Java, которые вы можете получить: основы Java, веб-приложение Java, все учебные пособия по JavaEE, включая весеннюю загрузку и т. д.

Re: Шаблон резюме, вы можете получить 100 красивых резюме

предисловие

До老哥Говоря об обычном использовании Redis命令大全, Редис持久化备份и容灾恢复обработка. Сегодня мы поговорим о Redis主从复制Как добиться.

Репликация Redis master-slave

концепция

Концепция репликации master-slave в Redis примерно аналогична той, что используется в MySQL. один主机master, один从机slaver. master主机数据更新后根据配置和策略,自动同步到slaver从机,Master以写为主, Slave начинается с读为主.

Главная цель

  • 读写分离: подходит для приложений, которые больше читают и меньше пишут, добавляют несколько ведомых устройств, повышают скорость чтения и улучшают параллелизм программ.

  • 数据容灾恢复: ведомое устройство копирует данные ведущего, что эквивалентно резервному копированию данных.Если основные данные потеряны, их можно восстановить с помощью данных, хранящихся в ведомом устройстве.

  • 高并发、高可用集群实现的基础: В сценарии с высокой степенью параллелизма, даже если хост зависает, ведомое устройство может主从切换, ведомое устройство автоматически становится ведущим для предоставления внешних услуг.

Конфигурация одного ведущего с несколькими ведомыми

Подготовка окружающей среды

Старик был слишком беден, поэтому он использовал одну машину для имитации трех машин.

  • 第一步:Скопируйте redis.conf 3 копии, а именно redis6379.conf, redis6380.conf, redis6381.conf

  • 第二步:Измените порт порта, имя файла pid, имя файла журнала и имя файла rdb в трех файлах redis.conf.

  • 第三步:Откройте три окна, чтобы смоделировать три сервера, и запустите службу Redis.

Просмотр текущих ролей master-slave для 3 машин

команда перваяinfo replicationПроверьте текущее состояние 3 машин角色что.

# 三台机器都是这个状态
127.0.0.1:6379> info replication
# 角色是master主机
role:master
# 从机个数为0
connected_slaves:0

Настроить отношения ведущий-ведомый

Обратите внимание, что нам нужно установить только подчиненную машину, а не главную. Мы выбираем6380и6381в виде从机.6379в виде主机.

# 6380 端口
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379

# 6381 端口
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379

Просмотрите текущие роли 3 машин еще раз

Выполните команду еще раз:info replication

# 主机
127.0.0.1:6379> info replication
role:master # 角色:主机
connected_slaves:2 #连接的从机个数,以及从机IP和端口
slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=98,lag=1

# 从机1
127.0.0.1:6380> info replication
role:slave # 角色:从机
master_host:127.0.0.1 # 主机的IP和端口
master_port:6379

# 从机2
127.0.0.1:6381> info replication
role:slave # 角色:从机
master_host:127.0.0.1 # 主机的IP和端口
master_port:6379

Постройте его успешно, попробуйте

  • 全量复制:У слейва есть возможность синхронизировать все данные раньше мастера.Можно попробовать получить ключ на слейве.

  • 增量复制:Когда хост добавляет новые данные, ведомое устройство синхронизирует новые данные.Вы можете выполнить команду set key value на узле, а затем получить ключ на ведомом устройстве, чтобы узнать, можно ли его получить.

разделение чтения-записи

Раб Редиса默认не допускается写操作, вы можете выполнять команды на ведомомset key value, будет сообщено об ошибке.

# 6380从机
127.0.0.1:6380> set k3 v3
(error) READONLY You can't write against a read only slave.

"ха, так устал", репликация master-slave почти завершена! !

Принцип репликации master-slave

полная копия

""Слейв отправляет psync.Поскольку это первая репликация, то он не знает runid мастера, и естественно не знает смещения, так что отправляете psync? -1

""Мастер получает запрос и отправляет runid и смещение мастера подчиненному узлу.

""Сохранить основную информацию из подчиненного узла

""Главный узел bgsave сохраняет файл rdb

""Хост-точка отправляет файл rdb

И в""и""Данные, сгенерированные в этом процессе, будут записаны в буфер копирования repl_back_buffer.

""Главный узел отправляет буфер, сгенерированный на двух предыдущих шагах, подчиненному узлу.

""Очистите исходные данные от узла, если у него были данные раньше, он будет очищать данные в течение длительного времени.

""Загрузите данные rdb-файла из ведомого узла в себя.

Стоимость полной репликации

""бгсэкономить время

""время передачи файла rdb по сети

""Очистить данные от узла

""Время загрузки rdb с узла

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

По вышеуказанным причинам в некоторых случаях нецелесообразно использовать полную репликацию, например, после дрожания сети ведомому узлу необходимо передать только часть данных, а не все данные.redis2.8Затем реализуется часть функции копирования

частичная копия

""Предположим, передающая сеть дрожит или что-то еще, и связь временно потеряна.

""В это время мастер продолжает записывать данные в буфер

""ведомый снова подключается к ведущему

""Слейв отправляет мастеру свое смещение и runid

""Мастер оценивает, находится ли смещение слейва в очереди буфера, если да, то возвращает continue слейву, в противном случае ему нужно выполнить полную репликацию (потому что это означает, что много данных было пропущено)

""Ведущее устройство отправляет подчиненному данные со смещения подчиненного устройства до конца буферной очереди.