Страницы

Сохранить статью у себя в соцсети:

воскресенье, 19 августа 2012 г.

§ Redis replication.

Переключение между Redis'ами с помощью репликации.

Совсем недавно, появилась необходимость перенести инстанс Redis'а с одного узла на другой. Необходимо это было сделать без остановки работы, приложению никак нельзя терять хранилище. Выходом в такой ситуации стало использование встроенной в Redis репликации и смена ip-адресов в DNS именах.
Важным свойством репликации в Redis является то, что слейв доступен для записи (однако мастер не увидит изменений сделанных в слейв, но в моем случае это и не нужно). 
Работает репликация следующим образом:
  • клиент подключается к мастеру и выдаёт команду SYNC;
  • мастер начинает фоновое сохранение данных, 
  • в процессе сохранения записываются все новые команды, которые привели к изменению данных;
  • после завершения сохранения мастер передает на слейв файл с данными; 
  • слейв сохраняет файл на сохраняет на диск и загружает в память;
  • мастер посылает накопившиеся и новые команды от клиентов, которые приводят к изменению данных.
Итак, подключаемся к мастеру:
slave # redis-cli
redis 127.0.0.1:6379> slaveof 172.31.28.62 6379
OK

Смотрим журналы /var/log/redis/redis.log на мастере
[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"

Комментариев нет:

Отправить комментарий

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика