В DeepSource мы стремимся запустить всю внутреннюю инфраструктуру и услуги в режиме высокой доступности. Это последовало за неисправностью, надежностью и устойчивостью в развертываниях. Наша сервис Redis работает в виде трехклетнего кластера HA, с одним мастером, двумя рабами и процессом Redis Sentinel, который выполняется как вспомогательный процесс для инициирования переключения. В последнее время мы развернулись Без дисков репликация В качестве особенности производства в нашем развертывании Cluster Cluster, устранение необходимости настойчивости в мастер -узле Redis для репликации. Прежде чем погрузиться дальше, давайте перейдем к брифингу.
Зачем без дисков репликации?
Репликация без диска — это функция, представленная в Redis в версии 2.8.18 . Мало кто внедрил его, что может быть связано с неотъемлемым страхом разрушения в развертываниях производства.
Обычно, когда раб ломается или существует сетевая ошибка между мастером и рабом, мастер пытается выполнить Частичная ресинхронизация данных в раб. По сути, раб воссоединяется с мастером, и репликация продолжается постепенно, вытягивая различия, накопленные до сих пор.
Однако, когда раб отключен в течение длительного периода, или перезапускается или является совершенно новым рабом, мастер должен выполнить Полная ресинхронизация . Это довольно тривиальная концепция, которая означает передачу всего набора основных данных в раб. Раб промывает старый набор данных и синхронизирует новые данные с нуля. После успешной синхронизации последовательные изменения транслируются как обычные команды Redis, постепенно, поскольку сам набор основных данных изменяется из -за команд записи, отправляемых клиентами.
Проблема возникла, когда необходимо было сделать объемные переводы во время полной ресинхронизации. Мастер создается дочерний процесс для создания Redis Database Backup (RDB) Файл (аналогичный файлу дампа SQL). После того, как дочерний процесс завершает генерацию файлов RDB, файл передается в рабы, используя не блокирующий ввод-вывод из родительского процесса. Наконец, когда перевод завершен, рабы могут перезагрузить файл RDB и выходить в интернет, получая постепенный поток новых записей.
Однако, чтобы выполнить полную ресинхронизацию, мастер обязан 1) Напишите данные RDB на диск 2) Загрузите RDB с диска, чтобы отправить его в рабыни
С неправильной установкой, особенно с нелокальными дисками или из-за непроблемной настройки параметров ядра, давление диска может привести к всплескам задержки, с которыми трудно справиться, и, следовательно Избегайте полной ресинхронизации. Таким образом, входит без дисска репликации.
Что такое без дисков репликации?
Так что же такое репликация без диска? Это процесс передачи реплицированного потока данных непосредственно в дескрипторы сокетов, а не хранение его на диске и подавать его от диска в рабские экземпляры.
Соблюдание нескольких рабов одновременно
Первоначально обслуживание нескольких рабов было сложным, так как после того, как передача RDB инициировалась, входящим рабам придется ждать, пока текущий дочерний процесс закончит писать к нынешнему рабу и перейти к новому входящему рабу.
Чтобы решить эту проблему, Redis.conf
Файл содержит параметр с именем Reply-Diskless-Sync-Delay
Анкет Этот параметр принимает свое значение за секунды. Он устанавливает задержку, чтобы позволить входящим рабам синхронизировать с дочерним процессом мастера для Массовая ресинхронизация Анкет Это важно с тех пор, как после начала передачи невозможно обслуживать новые реплики, которые будут в очереди на следующую передачу RDB, поэтому сервер ожидает задержки, чтобы позволить появиться больше реплик. Задержка указана в секундах, а по умолчанию — 5 секунды.
Чтобы облегчить это, код ввода/вывода был перепроектирован, чтобы одновременно обслуживать множество дескрипторов файлов. Антирес разработал алгоритм для решения проблемы. Более того, чтобы параллелизировать передачу данных, даже если используется блокировка ввода -вывода, код попытается написать небольшое количество данных каждому из дескрипторов сокета в цикле, чтобы ядро отправляет пакеты в несколько рабов одновременно Анкет
while(len) { size_t count = len < 1024 ? len : 1024; int broken = 0; for (j = 0; j < r->io.fdset.numfds; j++) { … error checking removed … /* Make sure to write 'count' bytes to the socket regardless * of short writes. */ size_t nwritten = 0; while(nwritten != count) { retval = write(r->io.fdset.fds[j],p+nwritten,count-nwritten); if (retval <= 0) { … error checkign removed … } nwritten += retval; } } p += count; len -= count; r->io.fdset.pos += count; … more error checking removed … }
Обработка частичных сбоев
Запись в файловые дескрипторы — это не единственное измерение этой проблемы. Большая часть этого заключается в том, чтобы на самом деле обрабатывать кучу рабов, фактически не требуя блокировки процесса для других входящих рабов.
Однако, когда RDB прекращается, ребенку необходимо выполнить обратную связь с рабами, которые получили RDB и могут продолжить процесс потоковой передачи репликации. Дочерний процесс возвращает массив подчиненных идентификаторов и связанных с ними состояний ошибки, что позволяет родительскому процессу регистрировать состояния ошибок рабов.
Предостережения
Очевидная проблема без диск -репликации заключается в том, что написание на диски отличается от написания к розеткам.
- API отличается, так как код резервного копирования базы данных REDIS традиционно записывается с указателями файлов C, в то время как наша ситуация требует записи в розетки, что в основном пишет дескрипторам сокетов.
- Диск пишет в первую очередь не склонна к выходу из строя, если не для супер жестких ошибок ввода -вывода (если диск заполнен и так далее). Для гнезда, однако, это совсем другая игра с мячом, так как записи могут быть отложены, так как приемник может стать медленным, а локальный буфер ядра может быть заполнен.
- Проблема тайм -аутов когда -либо расширяется в сфере розеток. Что, если приемный конец не может получить пакеты из -за разбивки, или только соединение TCP мертв.
Согласно Сальваторе Санфилиппо (AKA Antirez ), автор Redis, перед ним было два варианта, чтобы смягчить проблему.
- Создайте файл RDB внутри памяти, а затем выполните передачу.
- Напишите в розетки напрямую и постепенно, как генерируется RDB.
Путь 1 был более рискованным, так как у него были накладные расходы слишком большого потребления памяти. Эта функция должна была быть нацелена на среды с медленными дисками, но с более быстрыми сетями и более высокой пропускной способностью, не потребляя слишком много памяти. Следовательно, путь 2 был выбран.
Совел ландшафт репликации Redis
Идея репликации без настойчивости определенно ошеломляет и пугающая, но Redis только что прошел это. Поддержка репликации в репликации без диска удаляет нежелательные детали для движения хранилища, и, поскольку мы все знаем о том, что диск в я/ОС является медленным и вялым. Реализация этого в нашей экосистеме Kubernetes сделала значительные улучшения в показателях ввода -вывода и кэширования и сделала наши развертывания Redis Leanerer и Bener.
Вот Ссылка к фактическому сообщению.
Оригинал: «https://dev.to/deepsource/redis-diskless-replication-what-how-why-and-the-caveats-3gfi»