Мы настроили 2 сервера keydb с Active Replica, как описано здесь: https://docs.keydb.dev/docs/active-rep/
Мы используем HAproxy для перенаправления трафика на нужный сервер. Итак, имеем текущую ситуацию:
ключевая база данных 001 - 10.0.0.7
ключевая база данных 002 - 10.0.0.8
Мы хотим обновить и перезагрузить keydb 01.Мы поставили его на обслуживание в HAproxy, и все соединения сброшены. Таким образом, сервер больше не используется, и все живые подключения идут к keydb 02.
Теперь, когда keydb 01 возвращается снова, он запрашивает keydb 02 для полной синхронизации db. После этого мы видим, что keydb 02 также запрашивает полную синхронизацию db с keydb 01!!! Это приводит к тому, что keydb 02 переходит в состояние LOADING, в то время как это единственный работающий сервер в Haproxy.
Так что результат в том, что есть в течение короткого периода времени, сервер keydb не работает. Это приводит к таким ошибкам, как: ЗАГРУЗКА Redis загружает набор данных в память
Вся идея этой установки активной реплики заключается в том, что она надежна, отказоустойчива и создает настройку высокой доступности. Однако в этой ситуации это означает, что каждый раз, когда сервер завершает работу, он создает короткий момент полного простоя. Это неприемлемо для нашей установки.
Мы поступаем неправильно? Это по дизайну? Или нам нужно что-то перенастроить?
Мы протестировали с дисковой и бездисковой синхронизацией. Это не имеет значения. Наша настройка конфигурации (из ansible playbook, поэтому форматирование может выглядеть немного странно):
привязка: "127.0.0.1 {{my_private_ips[inventory_hostname] }}"
требуется пароль: "{{ keydb_auth }}"
masterauth: "{{ keydb_auth }}"
реплика: "xxx 6379"
предел буфера вывода клиента:
- нормальный 0 0 0
- реплика 1024мб 256мб 60
- пабсаб 32мб 8мб 60
repl-бездисковая синхронизация: да
порт: 6379
максимальная память: 3000 м
активная реплика: да
Мы используем Ubuntu 20.04.2 LTS с keydb версии 6.0.16.
Вот файл журнала keydb из keydb 01, который отключается для обслуживания и снова восстанавливается.
3812319:1439:C 18 июня 2021 г. 09:08:36.048 * БД сохранена на диске
3812319:1439:C 18 июня 2021 г. 09:08:36.054 * RDB: 3 МБ памяти используется копированием при записи
958:1439:S 18 июня 2021 г. 09:08:36.094 * Фоновое сохранение успешно завершено
958: обработчик сигнала (1624000133) Получено сообщение об отключении планирования SIGTERM...
958: обработчик сигнала (1624000133) Получено сообщение об отключении планирования SIGTERM...
958:1439:S 18 июня 2021 09:08:53.194 # Пользователь запросил выключение...
958:1439:S 18 июня 2021 г. 09:08:53.194 # запрошен контроль systemd, но NOTIFY_SOCKET не найден
958:1439:S 18 июня 2021 г. 09:08:53.194 * Сохранение окончательного снимка RDB перед выходом.
958:1439:S 18 июня 2021 г. 09:08:53.194 # запрошен контроль systemd, но NOTIFY_SOCKET не найден
958:1439:S 18 июня 2021 г. 09:08:54.159 * БД сохранена на диске
958:1439:S 18 июня 2021 г., 09:08:54.159 * Удаление pid-файла.
958:1439:S 18 июня 2021 09:08:54.159 # Теперь KeyDB готов к выходу, пока-пока...
874:874:C 18 июня 2021 г. 09:09:04.528 * Прежде чем превратиться в реплику, используя параметры моего собственного мастера для синтеза кэшированного мастера: я могу синхронизироваться с новым мастером только с частичным переносом.
874:874:C 18 июня 2021 г. 09:09:04.531 * Примечание: «активная реплика да» подразумевает «реплика только для чтения нет»
874:874:C 18 июня 2021 г. 09:09:04.531 # oO0OoO0OoO0Oo KeyDB запускается oO0OoO0OoO0Oo
874:874:C 18 июня 2021 г. 09:09:04.531 # Версия KeyDB = 6.0.16, биты = 64, фиксация = 00000000, изменено = 0, pid = 874, только что запущено
874:874:C 18 июня 2021 г. 09:09:04.531 # Конфигурация загружена
874:874:C 18 июня 2021 г. 09:09:04.531 # ВНИМАНИЕ, контролируется systemd — вы ДОЛЖНЫ установить соответствующие значения для TimeoutStartSec и TimeoutStopSec в вашем сервисном блоке.
874:874:C 18 июня 2021 г. 09:09:04.531 # запрошен контроль systemd, но NOTIFY_SOCKET не найден
KeyDB 6.0.16 (00000000/0) 64 бит
Работает в автономном режиме
Порт: 6379
ПИД-код: 957
Присоединяйтесь к сообществу KeyDB! https://community.keydb.dev/
957:874:S 18 июня 2021 г. 09:09:04.781 # Сервер инициализирован
957:874:S, 18 июня 2021 г., 09:09:04.781 # ВНИМАНИЕ, значение overcommit_memory равно 0! Фоновое сохранение может завершиться ошибкой из-за нехватки памяти.Чтобы решить эту проблему, добавьте «vm.overcommit_memory = 1» в /etc/sysctl.conf, а затем перезагрузитесь или выполните команду «sysctl vm.overcommit_memory=1», чтобы это вступило в силу.
957:874:S 18 июня 2021 г. 09:09:04.781 # ВНИМАНИЕ, в вашем ядре включена поддержка Transparent Huge Pages (THP). Это создаст проблемы с задержкой и использованием памяти в KeyDB. Чтобы решить эту проблему, выполните команду «echo never > /sys/kernel/mm/transparent_hugepage/enabled» от имени пользователя root и добавьте ее в свой файл /etc/rc.local, чтобы сохранить настройки после перезагрузки. KeyDB необходимо перезапустить после отключения THP.
957:874:S 18 июня 2021 г. 09:09:04.789 * Загрузка RDB, созданная версией 6.0.16
957:874:S 18 июня 2021 г. 09:09:04.789 * Возраст RDB 11 секунд
957:874:S 18 июня 2021 г. 09:09:04.789 * Использование памяти RDB при создании 100,16 Мб
957:874:S 18 июня 2021 г. 09:09:05.563 * Загрузка БД с диска: 0,778 секунды
957:874:S 18 июня 2021 г. 09:09:05.563 * Прежде чем превратиться в реплику, используя параметры моего собственного мастера для синтеза кэшированного мастера: я могу синхронизироваться с новым мастером только с частичным переносом.
957:874:S 18 июня 2021 г. 09:09:05.563 # запрошен контроль systemd, но NOTIFY_SOCKET не найден
957:1345:S 18 июня 2021 г. 09:09:05.563 Тема 1 жива.
957:1344:S 18 июня 2021 г. 09:09:05.564 Тема 0 жива.
957:1344:S 18 июня 2021 г. 09:09:05.564 * Подключение к MASTER 10.0.0.8:6379
957:1344:S 18 июня 2021 г. 09:09:05.564 * Синхронизация MASTER <-> REPLICA запущена
957:1344:S 18 июня 2021 г. 09:09:05.566 * Неблокирующее соединение для SYNC инициировало событие.
957:1344:S 18 июня 2021 г., 09:09:05.567 * Мастер ответил на PING, репликация может продолжаться...
957:1344:S 18 июня 2021 г. 09:09:05.571 * Реплика 10.0.0.8:6379 запрашивает синхронизацию
957:1344:S 18 июня 2021 г. 09:09:05.571 * Полная повторная синхронизация запрошена репликой 10.0.0.8:6379
957:1344:S 18 июня 2021 г. 09:09:05.571 * Журнал невыполненной репликации создан, мои новые идентификаторы репликации: «60759691a4adca42cced2fd1895a470ab7b9eebb» и «000000000000000000000000000000000000000000000»
957:1344:S 18 июня 2021 г. 09:09:05.571 * Задержка следующего BGSAVE для бездисковой синхронизации
957:1344:S 18 июня 2021 г. 09:09:05.573 * Частичная повторная синхронизация невозможна (нет кэшированного мастера)
957:1344:S 18 июня 2021 г. 09:09:11.521 * Полная повторная синхронизация с мастером: 3eb1532df27d6815eea8a420c7c72b04e03618dc:516117186158
957:1344:S 18 июня 2021 г. 09:09:11.521 * Отбрасывание ранее кэшированного основного состояния.
957:1344:S 18 июня 2021 г. 09:09:11.530 * MASTER <-> REPLICA sync: получение потоковой RDB от мастера с EOF на диск
957:1344:S 18 июня 2021 г. 09:09:11.603 * Запуск BGSAVE для SYNC с целью: сокеты реплик
957:1344:S 18 июня 2021 г. 09:09:11.606 * Фоновая передача RDB запущена pid 2412
2412:1344:C 18 июня 2021 г., 09:09:12.488 * RDB: 1 МБ памяти используется копированием при записи
957:1344:S 18 июня 2021 09:09:12.488 # Бездисковая передача rdb, завершено чтение из канала, 1 реплика еще активна.
957:1344:S 18 июня 2021 г. 09:09:12.507 * Фоновая передача RDB завершена успешно
957:1344:S 18 июня 2021 г. 09:09:12.507 * Потоковая передача RDB с репликой 10.0.0.8:6379 выполнена успешно (сокет). Ожидание REPLCONF ACK от подчиненного устройства для включения потоковой передачи
957:1344:S 18 июня 2021 г. 09:09:12.872 * Синхронизация с репликой 10.0.0.8:6379 выполнена успешно
957:1344:S 18 июня 2021 г. 09:10:12.799 # Ошибка ввода-вывода при попытке синхронизации с MASTER: соединение потеряно
957:1344:S 18 июня 2021 г. 09:10:13.429 * Подключение к MASTER 10.0.0.8:6379
957:1344:S 18 июня 2021 г. 09:10:13.429 * Синхронизация MASTER <-> REPLICA запущена
957:1344:S 18 июня 2021 г. 09:10:13.429 * Неблокирующее соединение для SYNC инициировало событие.
957:1344:S 18 июня 2021 г. 09:10:13.429 * Мастер ответил на PING, репликация может продолжаться...
957:1344:S 18 июня 2021 г. 09:10:13.430 * Частичная повторная синхронизация невозможна (нет кэшированного мастера)
957:1344:S 18 июня 2021 г. 09:10:19.943 * Полная повторная синхронизация с мастером: 349f88c33a6dc9d67a3cb4d623727d9f1047033d:516121643991
957:1344:S 18 июня 2021 г. 09:10:19.952 * MASTER <-> REPLICA sync: получение потоковой RDB от мастера с EOF на диск
957:1344:S 18 июня 2021 г. 09:10:20.856 * MASTER <-> REPLICA sync: загрузка БД в память
957:1344:S 18 июня 2021 г. 09:10:20.856 * Загрузка RDB, созданная версией 6.0.16
957:1344:S 18 июня 2021 г. 09:10:20.856 * Возраст RDB 1 секунда
957:1344:S 18 июня 2021 г. 09:10:20.856 * Использование памяти RDB при создании 102,08 Мб
957:1344:S 18 июня 2021 г. 09:10:21.431 * Синхронизация MASTER <-> REPLICA: завершено успешно
957:1344:S 18 июня 2021 г. 09:10:21.431 # запрошен контроль systemd, но NOTIFY_SOCKET не найден
957:1344:S 18 июня 2021 г. 09:10:21.431 # запрошен контроль systemd, но NOTIFY_SOCKET не найден
957:1344:S 18 июня 2021 г. 09:11:03.197 * 10000 изменений за 60 секунд. Сохранение...
957:1344:S 18 июня 2021 г. 09:11:03.200 * Сохранение в фоновом режиме запущено pid 4845
4845:1344:C 18 июня 2021 г. 09:11:04.015 * БД сохранена на диске
4845:1344:C 18 июня 2021 г. 09:11:04.018 * RDB: 2 МБ памяти, используемой копированием при записи
957:1344:S 18 июня 2021 г. 09:11:04.104 * Фоновое сохранение успешно завершено
957:1344:S 18 июня 2021 г. 09:12:05.071 * 10000 изменений за 60 секунд. Сохранение...
957:1344:S 18 июня 2021 г. 09:12:05.075 * Сохранение в фоновом режиме запущено pid 4870
4870:1344:C 18 июня 2021 г. 09:12:05.963 * БД сохранена на диске
Вот журнал keydb 02. Этот сервер оставался в рабочем состоянии, но вскоре был недоступен:
960:1388:S 18 июня 2021 г. 09:08:29.066 * Сохранение в фоновом режиме запущено pid 3814844
3814844:1388:C 18 июня 2021 г. 09:08:29.896 * БД сохранена на диске
3814844:1388:C 18 июня 2021 г. 09:08:29.901 * RDB: 3 МБ памяти, используемой копированием при записи
960:1388:S 18 июня 2021 г. 09:08:29.974 * Фоновое сохранение успешно завершено
960:1388:S 18 июня 2021 09:08:54.176 # Соединение с мастером потеряно.
960:1388:S 18 июня 2021 г. 09:08:54.176 * Кэширование состояния отключенного главного устройства.
960:1388:S, 18 июня 2021 г., 09:08:54.177 # Потеряно соединение с идентификатором клиента реплики #11.
960:1388:S 18 июня 2021 г. 09:08:54.957 * Подключение к MASTER 10.0.0.7:6379
960:1388:S 18 июня 2021 г. 09:08:54.957 * Синхронизация MASTER <-> REPLICA запущена
960:1388:S 18 июня 2021 г. 09:09:02.073 # Состояние ошибки на сокете для SYNC: ресурс временно недоступен
960:1388:S 18 июня 2021 г. 09:09:02.988 * Подключение к MASTER 10.0.0.7:6379
960:1388:S 18 июня 2021 г. 09:09:02.988 * Синхронизация MASTER <-> REPLICA запущена
960:1388:S 18 июня 2021 г. 09:09:02.988 # Состояние ошибки на сокете для SYNC: операция выполняется.
960:1388:S 18 июня 2021 г. 09:09:03.998 * Подключение к MASTER 10.0.0.7:6379
960:1388:S 18 июня 2021 г. 09:09:03.998 * Синхронизация MASTER <-> REPLICA запущена
960:1388:S 18 июня 2021 г. 09:09:03.999 * Неблокирующее соединение для SYNC инициировало событие.
960:1388:S 18 июня 2021 г., 09:09:04.068 * Мастер ответил на PING, репликация может продолжаться...
960:1388:S 18 июня 2021 г. 09:09:04.084 * Частичная повторная синхронизация невозможна (нет кэшированного мастера)
960:1388:S 18 июня 2021 г. 09:09:04.087 * Реплика 10.0.0.7:6379 запрашивает синхронизацию
960:1388:S 18 июня 2021 г. 09:09:04.087 * Полная повторная синхронизация запрошена репликой 10.0.0.7:6379
960:1388:S 18 июня 2021 г. 09:09:04.087 * Задержка следующего BGSAVE для бездисковой синхронизации
960:1388:S 18 июня 2021 г. 09:09:10.035 * Запуск BGSAVE для SYNC с целью: сокеты реплик
960:1388:S 18 июня 2021 г. 09:09:10.042 * Фоновая передача RDB запущена pid 3814859
960:1388:S 18 июня 2021 г. 09:09:10.117 * Полная повторная синхронизация с мастером: 640f9e48636076058722301cc52ea8a21bc8e450:453896462998
960:1388:S 18 июня 2021 г. 09:09:10.118 * Отбрасывание ранее кэшированного основного состояния.
960:1388:S 18 июня 2021 г. 09:09:10.122 * MASTER <-> REPLICA sync: получение потоковой RDB от мастера с EOF на диск
960:1388:S 18 июня 2021 г. 09:09:10.999 * MASTER <-> REPLICA sync: Загрузка БД в память
960:1388:S, 18 июня 2021 г., 09:09:11.000 * Реплика собирается загрузить файл RDB, полученный от мастера, но есть ожидающий выполнения дочерний RDB. Убить процесс 3814859 и удалить его временный файл, чтобы избежать гонки
3814859:signal-handler (1624000150) Получен SIGUSR1 в дочернем, выход сейчас.
960:1388:S 18 июня 2021 г. 09:09:11.000 * Загрузка RDB, созданная версией 6.0.16
960:1388:S 18 июня 2021 г. 09:09:11.000 * Возраст RDB 0 секунд
960:1388:S 18 июня 2021 г. 09:09:11.000 * Использование памяти RDB при создании 95,02 Мб
960:1388:S 18 июня 2021 09:09:11.018 # Бездисковая передача rdb, завершено чтение из канала, 1 реплика еще активна.
960:1388:S 18 июня 2021 09:09:11.019 # Фоновая передача завершена сигналом 10
960:1388:S 18 июня 2021 г. 09:09:11.019 * Потоковая передача RDB с репликой 10.0.0.7:6379 выполнена успешно (сокет). Ожидание REPLCONF ACK от подчиненного устройства для включения потоковой передачи
960:1388:S 18 июня 2021 г. 09:09:11.386 * MASTER <-> REPLICA sync: завершено успешно
960:1388:S 18 июня 2021 г. 09:09:11.386 # запрошен контроль systemd, но NOTIFY_SOCKET не найден
960:1388:S 18 июня 2021 г. 09:09:11.386 # запрошен контроль systemd, но NOTIFY_SOCKET не найден
960:1388:S 18 июня 2021 г. 09:09:30.096 * 10000 изменений за 60 секунд. Сохранение...
960:1388:S 18 июня 2021 г. 09:09:30.101 * Сохранение в фоновом режиме запущено pid 3814875
3814875:1388:C 18 июня 2021 г. 09:09:30.970 * БД сохранена на диске
3814875:1388:C 18 июня 2021 г. 09:09:30.975 * RDB: 5 МБ памяти используется копированием при записи
960:1388:S 18 июня 2021 г. 09:09:31.022 * Фоновое сохранение успешно завершено
960:1388:S 18 июня 2021 г. 09:10:12.795 # Отключение реплики с тайм-аутом: 10.0.0.7:6379
960:1388:S 18 июня 2021 09:10:12.795 # Соединение с репликой 10.0.0.7:6379 потеряно.
960:1389:S 18 июня 2021 г. 09:10:13.429 * Реплика 10.0.0.7:6379 запрашивает синхронизацию
960:1389:S 18 июня 2021 г. 09:10:13.429 * Полная повторная синхронизация запрошена репликой 10.0.0.7:6379
960:1389:S 18 июня 2021 г. 09:10:13.429 * Задержка следующего BGSAVE для бездисковой синхронизации
960:1388:S 18 июня 2021 г. 09:10:19.941 * Запуск BGSAVE для SYNC с целью: сокеты реплик
960:1388:S 18 июня 2021 г. 09:10:19.948 * Фоновая передача RDB запущена pid 3815442
3815442:1388:C 18 июня 2021 г. 09:10:20.860 * RDB: 5 МБ памяти, используемой копированием при записи
960:1388:S 18 июня 2021 09:10:20.860 # Бездисковая передача rdb, завершено чтение из канала, 1 реплика еще активна.
960:1388:S 18 июня 2021 г. 09:10:20.958 * Фоновая передача RDB успешно завершена
960:1388:S 18 июня 2021 г. 09:10:20.958 * Потоковая передача RDB с репликой 10.0.0.7:6379 выполнена успешно (сокет). Ожидание REPLCONF ACK от подчиненного устройства для включения потоковой передачи
960:1389:S 18 июня 2021 г. 09:10:22.034 * Синхронизация с репликой 10.0.0.7:6379 выполнена успешно
960:1388:S 18 июня 2021 г. 09:10:32.013 * 10000 изменений за 60 секунд. Сохранение...
960:1388:S 18 июня 2021 г. 09:10:32.018 * Сохранение в фоновом режиме запущено pid 3816278
3816278:1388:C 18 июня 2021 г. 09:10:32.845 * БД сохранена на диске
3816278:1388:C 18 июня 2021 г. 09:10:32.850 * RDB: 4 МБ памяти, используемой копированием при записи
960:1388:S 18 июня 2021 г. 09:10:32.921 * Фоновое сохранение успешно завершено
960:1388:S 18 июня 2021 г. 09:11:33.101 * 10000 изменений за 60 секунд. Сохранение...