Как скопировать выбранные ключи Redis на другой сервер?

Redis — простое, быстрое и удобное key-value хранилище данных. При масштабирование любого приложения возникает необходимость переноса данных между серверами. Иногда не нужно переносить всю базу, а только несколько выбранных ключей.

Проверка версии redis

Первое что нужно сделать убедиться что на обоих серверах одинаковая версия Redis, выполняем команду:

redis-server --version

В ответ получим информацию о версии:

Redis server v=3.0.3 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=58013d157c63182b

Если версии не совпадают, то нужно на одном из серверов обновить redis, после чего перейти непосредственно к переносу. В redis данные можно перенести разными способами, мы рассмотрим два наиболее простых. Для удобства сервер с которого переносим назовем A, сервер куда переносим B.

Установка связи между серверами redis

Для первого способа между серверами нужно установить связь. Заходим на сервер B и открываем конфиг redis который находиться по пути /etc/redis/redis.conf, находим параметр bind и изменяем значение на 0.0.0.0.

Для проверки связи между серверами запускаем на сервере A команду:

redis-cli -h $target_host -p $target_port

$target_host и $target_port берем с сервера В, в ответ после запуска команды должны получить надпись PONG

Непосредственно перенос данных

После чего на сервере A запускаем команду переноса:

redis-cli --scan --pattern '$pattern' | while read key; do echo "Copying $key"; 
redis-cli --raw -h $source_host -p $source_port -n $source_db DUMP "$key" | head -c -1|
redis-cli -x -h $target_host -p $target_port -n $target_db RESTORE "$key" 0; done

$pattern — регулярное выражение по которому выбираем ключи;

$source_* — параметры сервера A;

$target_* — параметры сервера B;

После чего проверяем наличие ключей на обоих серверах и меняем параметр bind обратно на 127.0.0.1

Бекап в файлы и восстановление через restore

Для второго способа необходимо сделать:

  1. 1. На сервере A сделать бекап ключей redis в файлы, это просто сделать с помощью команды:
    redis-cli --scan --pattern "$pattern" | while read key; do echo "Copying $key"; 
    redis-cli --raw -h $source_host -p $source_port -n $source_db DUMP "$key" | head -c -1 > move_$key; done
    Получим много файлов с префиксом move_ это наши ключи redis которые соответствуют $pattern.
  2. 2. Переносим их на сервер B.
  3. 3. На сервере B необходимо выполнить выполнить команду restore для redis:
    cat $file_name | redis-cli -x restore $key_name 0;
    Для restore всех файлов за один раз можем использовать команду:
    for f in ~/move_t*; do cat $f | redis-cli -x restore "${f/\/root\/move_t/t}" 0; done

TL;DR

Перенос выбранных ключей redis на другой сервер можно осуществить с помощью простой команды:

redis-cli --scan --pattern '$pattern' | while read key; do echo "Copying $key"; 
redis-cli --raw -h $source_host -p $source_port -n $source_db DUMP "$key" | head -c -1|
redis-cli -x -h $target_host -p $target_port -n $target_db RESTORE "$key" 0; done


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень