Синхронизация master-slave redis (2) Метод после 2.8

Redis задняя часть
Синхронизация master-slave redis (2) Метод после 2.8

В продолжение предыдущей статьи,«Главная-ведомая синхронизация 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Команда та же, кстати, повторим, процесс такой:

同步(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 МБ
  • Очередь固定长度а также先进先出из
  • Когда главный сервер выполняет подчиненный сервер命令传播, мало того, что все команды будут отправлены на все подчиненные службы
  • также напишет все команды复制积压缓存区, как показано на рисунке:

image.png

  • потому что复制积压缓存区да队列, заключается в записи байтов каждой команды основного сервиса в очередь, состоящую из двух частей,偏移量а также命令字节值
  • Структура очереди следующая:
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.Приглашаем к общению и указанию на некоторые ошибки в тексте, чтобы я мог углубить свое понимание.Надеюсь, у вас нет ошибок, спасибо!