В продолжение предыдущей статьи,«Главная-ведомая синхронизация Redis (1) Путь до версии 2.8», В конце я рассказал о недостатках метода до версии 2.8.Помните, сегодня я расскажу об улучшении синхронизации master-slave redis с версии 2.8.
Давайте рассмотрим дефекты синхронизации master-slave redis до версии 2.8.
- Если операция синхронизации (синхронизации) завершена, существующие данные синхронизируются.В это время главный и подчиненный серверы находятся в стадии распространения команды (распространения команды).В это время будут передаваться последующие команды, а затем ведущий и подчиненные серверы будут отключены.
- Когда главный-подчиненный сервер повторно устанавливает соединение, главный-подчиненный сервер снова начинает выполнять операцию синхронизации (синхронизации).
- В операции синхронизации (синхронизации) в это время главный сервер генерирует файл RDB, и ключ, содержащийся в файле RDB, начинается с разработки первой команды в первой синхронизации.
- Хотя операцию синхронизации (синхронизации) еще можно завершить, на самом деле есть много ключей, которые не нужно снова синхронизировать.
- Поскольку для операции синхронизации (синхронизации) требуется, чтобы главный сервер сгенерировал файл RDB, эта операция будет занимать много ресурсов сервера: ЦП, память, ввод-вывод.
- Передача файлов RDB между главным и подчиненным серверами будет занимать полосу пропускания сервера.
- При загрузке файлов RDB с сервера это также будет занимать много ресурсов сервера: ЦП, память, ввод-вывод.
- Так что никакие лишние операции синхронизации (синхронизации) не будут потреблять ресурсы сервера и снижать производительность сервиса
Подводя итог, старый метод синхронизации master-slave имеет очень низкую скорость отключения и повторного подключения, поэтому версия 2.8 стала проходитьPSYNC
команда вместо этогоSYNC
команда для выполнения синхронной операции
Команда PSYNC
-
PSYNC
Команда имеет два режима:完整同步模式(full resynchronization)
а также部分同步模式(partial resynchronization)
два режима
полная ресинхронизация
- режим полной синхронизации для обработки
初次复制
условие - Выполнение режима полной синхронизации и
SYNC
Команда та же, кстати, повторим, процесс такой:
- 1. Отправьте команду slaveof с сервера на главный сервер.
- 2. После получения мастер-сервером команды slaveof
- 3. Начните выполнять команду BGSAVE.
- 4. Создайте файл RDB в фоновом режиме
- 5. И используйте буфер для записи всех команд, выполняемых с самого начала.
- 6. Выполняется команда главного сервера BGSAVE
- 7. Главный сервер отправляет файл RDB, сгенерированный командой BGSAVE, на подчиненный сервер.
- 8. Примите файл RDB с сервера и загрузите его.
- 9. Обновите статус своей базы данных до состояния базы данных, когда главный сервер выполняет команду BGSAVE.
- 10. Главный сервер отправляет все записанные в буфере команды записи на подчиненный сервер
- 11. Выполните эти команды с сервера, чтобы завершить весь процесс синхронизации.
Частичная ресинхронизация
- Режим частичной синхронизации в основном используется для
断线重连后的复制场景
- другое и
SYNC
Команды одинаковые, только после отключения и повторного подключения мастер-узел синхронизирует команды во время отключения с подчиненным узлом, а не ресинхронизирует все команды.
Рассмотрим случай отключения и повторного подключения.PSYNC
процесс выполнения команды
время | главный сервер | подчиненный сервер |
---|---|---|
T0 | Главный-подчиненный сервер завершает синхронизацию | Главный-подчиненный сервер завершает синхронизацию |
T1 | Выполните команду распространения, которая распространяет команду set k1 v1 | Выполните команду set k1 v1, переданную с главного сервера. |
T2 | Выполните команду распространения, которая распространяет команду set k2 v2 | Выполните команду set k2 v2, переданную с главного сервера. |
T3 | В этот момент происходит сбой, и главный и подчиненный серверы отключаются. | В этот момент происходит сбой, и главный и подчиненный серверы отключаются. |
T4 | set k3 v3 | На данный момент он отключен от основного сервера, и установка k3 v3 не распространялась. |
T5 | set k4 v4 | На данный момент он отключен от основного сервера, и установка k4 v4 не распространялась. |
T6 | В этот момент сбой восстанавливается, и главный и подчиненный серверы снова подключаются. | В этот момент сбой восстанавливается, и главный и подчиненный серверы снова подключаются. |
T7 | Отправьте команду PSYNC на главный сервер | |
T8 | Отправить подтверждающий ответ подчиненному устройству, выполнить частичную синхронизацию | Получите подтверждение от мастера, выполните частичную синхронизацию |
T9 | Отправьте две команды set k3 v3 и set k4 v4 на подчиненный сервер. | |
T10 | Получите две команды set k3 v3 и set k4 v4, отправленные главным сервером, и выполните | |
T11 | В этот момент мастер-подчиненный сервер завершает частичную синхронизацию. | В этот момент мастер-подчиненный сервер завершает частичную синхронизацию. |
- Этот процесс в основном зависит от трех частей
Смещение репликации ведущего и ведомого
- И главные, и подчиненные службы поддерживают смещение репликации.
- Каждый раз, когда главный сервер передает n байт подчиненному серверу, он добавляет n к смещению, поддерживаемому им самим.
- Каждый раз, когда подчиненная служба получает данные от главного сервера, она добавляет поддерживаемое ею смещение к количеству байтов размера данных.
- Смещенный каштан Master-Slave:
主服务器偏移量:offset=100
从服务器A偏移量:offset=100
从服务器B偏移量:offset=100
- На данный момент это означает, что главная служба, подчиненный сервер A и подчиненный сервер B находятся в состоянии синхронизации и согласованности.
- Когда главная служба синхронизирует 100 байт данных с подчиненной службой
主服务器偏移量:offset=100
从服务器A偏移量:offset=200
(从服务器B和主服务器断开链接)从服务器B偏移量:offset=100
- На данный момент это означает, что главная служба и подчиненный сервер A находятся в состоянии синхронизации и согласованности.
- А смещение подчиненного сервера B равно offset=100 из-за отключения службы B, можно судить, что они не находятся в состоянии синхронизации данных
Буфер невыполненной репликации основного сервера
-
复制积压缓存区
это очередь, поддерживаемая главным сервером, с размером по умолчанию 1 МБ - Очередь
固定长度
а также先进先出
из - Когда главный сервер выполняет подчиненный сервер
命令传播
, мало того, что все команды будут отправлены на все подчиненные службы - также напишет все команды
复制积压缓存区
, как показано на рисунке:
- потому что
复制积压缓存区
да队列
, заключается в записи байтов каждой команды основного сервиса в очередь, состоящую из двух частей,偏移量
а также命令字节值
- Структура очереди следующая:
Node1:
offset=1
val=s
Node2:
offset=2
val=e
Node3:
offset=3
val=t
Node4:
offset=4
val=k
Node5:
offset=5
val=1
Node6:
offset=6
val=v
Node7:
offset=7
val=1
- Увидев структуру очереди - это команда первичной службы
set k1 v1
Каждый байт и байт, соответствующие偏移量
хранить в复制积压缓存区
середина - Когда подчиненный сервер повторно подключается к главному серверу, подчиненный сервер
PSYNC
поставить свой собственный复制偏移量offset
Отправленный на главный сервер, главный сервер будет использовать это смещение репликации, чтобы определить, следует ли использовать完整同步
еще部分同步
, конкретные операции заключаются в следующем:
время | главный сервер | подчиненный сервер |
---|---|---|
T0 | В этот момент происходит сбой, и главный и подчиненный серверы отключаются. | В этот момент происходит сбой, и главный и подчиненный серверы отключаются. |
T1 | В этот момент сбой восстанавливается, и главный и подчиненный серверы снова подключаются. | В этот момент сбой восстанавливается, и главный и подчиненный серверы снова подключаются. |
T2 | Отправьте команду PSYNC на сервер, и команда отправит собственное смещение копии в прошлое. | |
T3 | Получите смещение репликации, переданное с сервера, для оценки | |
T4 | Если данные после смещения репликации все еще существуют в буфере репликации, выполняется частичная синхронизация, и данные извлекаются из буфера репликации. | |
T5 | Если данные после смещения копии не существуют (поскольку очередь в порядке очереди), выполните полную синхронизацию. |
Текущий идентификатор службы Redis
- Когда каждый сервис Redis запускается, он будет иметь свой собственный рабочий идентификатор.
- Каждый идентификатор не будет повторяться, я не понимаю, как это реализовано.
- Когда подчиненная служба и главный сервер реплицируются в первый раз, подчиненная служба сохранит текущий идентификатор главной службы.
- После отключения и повторного подключения выполнить
PSYNC
Команда заключается в том, что идентификатор будет сравниваться, если идентификатор до и после одинаков, основная служба выносит решение.复制偏移量
Определите, требуется ли полная синхронизация или частичная синхронизация. Если идентификаторы до и после несовместимы, это означает, что основные службы до и после отличаются, поэтому выберите完整同步
PSYNC
Подробный процесс выполнения команды
время | главный сервер | подчиненный сервер |
---|---|---|
T0 | Главный сервер запускается, генерирует уникальный идентификатор запуска (притворяется, что имитирует один) = 1 | Запустите с сервера, сгенерируйте уникальный идентификатор запуска (притворитесь, что имитируете один) = 2 |
T1 | На этом этапе первичная репликация ведущего и ведомого устройств завершена (при условии отсутствия команды), смещение ведущего равно 0, а в середине буфера невыполненной репликации нет данных. | В этот момент первичная репликация ведущего и ведомого завершена (при условии отсутствия команды), а смещение ведомого устройства offset=0. |
T2 | Выполните команду распространения, распространите команду set k1 v1, запишите команду в буфер невыполненной репликации, основное смещение offset=9 | Выполните команду set k1 v1, переданную с главного сервера, со смещением offset=9. |
T3 | Выполните команду распространения, распространите команду set k2 v2 и запишите команду в буфер невыполненной репликации, основное смещение offset=18 | Выполните команду set k2 v2, переданную с главного сервера, со смещением offset=18. |
T4 | В этот момент происходит сбой, и главный и подчиненный серверы отключаются. | В этот момент происходит сбой, и главный и подчиненный серверы отключаются. |
T5 | Выполните команду set k3 v3, запишите команду в буфер невыполненной репликации, основное смещение offset=27 | На данный момент он отключен от основного сервера, и установка k3 v3 не распространялась. |
T6 | Выполните команду set k4 v4, запишите команду в буфер невыполненной репликации, основное смещение offset=36 | На данный момент он отключен от основного сервера, и установка k4 v4 не распространялась. |
T7 | В этот момент сбой восстанавливается, и главный и подчиненный серверы снова подключаются. | В этот момент сбой восстанавливается, и главный и подчиненный серверы снова подключаются. |
T8 | Отправьте команду PSYNC на главный сервер с последней синхронизированной главной службой с идентификатором = 1 и смещением подчиненного сервера offset = 18. | |
T9 | Главный сервер получает команду PSYNC, и через запущенный id выясняется, что два сервера перед отключением | |
T10 | Главный сервер оценивает смещение подчиненной службы, отправленной с сервера, смещение, отправленное с сервера, равно смещению = 18, главная служба оценивает, существуют ли данные после смещения = 18 в буфере невыполненной репликации, и обнаруживает, что данные существует, главный сервер оценивает Использовать частичную синхронизацию | |
T11 | Отправить подтверждающий ответ подчиненному устройству, выполнить частичную синхронизацию | Получите подтверждение от мастера, выполните частичную синхронизацию |
T12 | Ведущему сервису удобно работать со смещением offset=18 в буфере невыполненной репликации, и он отправляет подчиненному серверу две команды set k3 v3 и set k4 v4. | |
T13 | Получите две команды set k3 v3 и set k4 v4, отправленные главным сервером, выполните их и обновите смещение подчиненного сервера offset=36. | |
T14 | В этот момент главный и подчиненный серверы завершают частичную синхронизацию, и их смещения равны offset=36. | В этот момент главный и подчиненный серверы завершают частичную синхронизацию, и их смещения равны offset=36. |
Сегодня я рассказал о способе синхронизации redis master-slave после версии 2.8.Приглашаем к общению и указанию на некоторые ошибки в тексте, чтобы я мог углубить свое понимание.Надеюсь, у вас нет ошибок, спасибо!