Redis: как скопировать базу без простоя проекта
Ага. У нас проблемы: нам нужно переехать сервер редиса без даунтайма проекта. Но нам надо не только переехать, но еще и данные сохранить.
Чаще всего предлагается решение в виде остановки проекта, копирования базы в новый инстанс, его запуск, переключение проекта и другие танцы.
Существует даже команда migrate, которая гарантирует атомарное копирование ключей и данных.
Но она работает в рамках одной бд (а по дефолту у редиса их целых 16), а так же обладает рядом негативных последствий ввиду своей атомарности. Поэтому подходит она совершенно для других целей.
Сразу на ум приходят репликации :) А данное решение их умеет.
Допустим у нас два сервера (у меня они на портах 6379 и 6479 соответственно). И нам нужно переключить проект с первого на второй сервер. Второй нулевой только что поднятый. А с первым ведется работа.
Посмотрим, что в каждой из баз покажет команда
keys *
Основной редис
Новый редис
Как видим пока базы не синхронизированы.
Теперь нужно сделать новую базу репликой старой
> slaveof 127.0.0.1 6379
OK
> info
...
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
Дополнительно может потребоваться авторизоваться на мастере чтобы началась репликация
config set masterauth <password>
После этого можем опять посмотреть, что в базу скопировалось
keys *
Как видим: все данные успешно засинхронизировались (вполне возможно это займет продолжительное время ввиду объема данных).
После того, как репликация завершена нам нужно сделать две вещи:
- превратить слейва в мастер
- настроить приложение на работу с новым мастером
slaveof no one
Эта команда выключает копирование данных с мастера (но не удаляет их) и теперь уже дело за настройкой приложения.
Да. Небольшой даунтайм все же был (секунд 10-15), но это гораздо лучше, чем предлагаемые решения.
Однако, обратите внимание, что если вы активно пишете в редис, то при такой миграции баз часть данных можно и потерять.
Категории: Разработка HowTo