айтишник
一个在大厂做高级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 слейву, в противном случае ему нужно выполнить полную репликацию (потому что это означает, что много данных было пропущено)
"⑥"Ведущее устройство отправляет подчиненному данные со смещения подчиненного устройства до конца буферной очереди.