Переключение между Redis'ами с помощью репликации.
Совсем недавно, появилась необходимость перенести инстанс Redis'а с одного узла на другой. Необходимо это было сделать без остановки работы, приложению никак нельзя терять хранилище. Выходом в такой ситуации стало использование встроенной в Redis репликации и смена ip-адресов в DNS именах.Важным свойством репликации в Redis является то, что слейв доступен для записи (однако мастер не увидит изменений сделанных в слейв, но в моем случае это и не нужно).
Работает репликация следующим образом:
- клиент подключается к мастеру и выдаёт команду SYNC;
- мастер начинает фоновое сохранение данных,
- в процессе сохранения записываются все новые команды, которые привели к изменению данных;
- после завершения сохранения мастер передает на слейв файл с данными;
- слейв сохраняет файл на сохраняет на диск и загружает в память;
- мастер посылает накопившиеся и новые команды от клиентов, которые приводят к изменению данных.
slave # redis-cli
redis 127.0.0.1:6379> slaveof 172.31.28.62 6379
OK
[28806] 14 Aug 15:26:24 * Slave ask for synchronization
[28806] 14 Aug 15:26:24 * Starting BGSAVE for SYNC
[28806] 14 Aug 15:26:24 * Background saving started by pid 6288
[6288] 14 Aug 15:26:45 * DB saved on disk
[28806] 14 Aug 15:26:45 * Background saving terminated with success
[28806] 14 Aug 15:26:52 * Synchronization with slave succeeded
Смотрим журналы /var/log/redis/redis.log на слейве
[2739] 14 Aug 15:26:24 * SLAVE OF 172.31.28.62:6379 enabled (user request)
[2739] 14 Aug 15:26:24 * Connecting to MASTER...
[2739] 14 Aug 15:26:24 * MASTER <-> SLAVE sync started: SYNC sent
[2739] 14 Aug 15:26:45 * MASTER <-> SLAVE sync: receiving 578033004 bytes from master
[2739] 14 Aug 15:26:53 * MASTER <-> SLAVE sync: Loading DB in memory
[2739] 14 Aug 15:27:03 * MASTER <-> SLAVE sync: Finished with success
Как только увидели характерные записи о завершении синхронизации выполняем смену ip-адресов в DNS записях. Серверам приложений инстанс редиса известен как redis.local. Соответственно меняем у этой записи ip-адрес, со старого на новый. После смены, проверяем на серверах приложений что они обращаются к новому инстансу Redis. Это делается через ping redis.local (ответы должны быть от нового инстанса) или netstat -lntp |grep 6379 (соединения должны быть переустановлены на новый инстанс).
Теперь отключаемся от мастера, и становимся самим мастером.
redis 127.0.0.1:6379> SLAVEOF NO ONE
OK
Смотрим журнал redis.log
[2739] 14 Aug 15:27:18 * MASTER MODE enabled (user request)
Старый мастер можно останавливать. На этом все.
На главную "Virtualizing Lunux"
Комментариев нет:
Отправить комментарий