Как переместить базу данных Redis с одного сервера на другой?

179

В настоящее время у меня есть работающий сервер Redis, работающий в облачном экземпляре, и я хочу перенести этот сервер Redis в новый облачный экземпляр и использовать этот экземпляр в качестве моего нового сервера Redis. Если бы это был MySQL, я бы экспортировал БД со старого сервера и импортировал ее на новый сервер. Как я должен сделать это с Redis?

PS: я не ищу настройки репликации. Я хочу полностью перенести сервер Redis на новый экземпляр.

ErJab
источник
5
Годы спустя ... Разобравшись с различными вещами, связанными с Redis, я бы предложил использовать подход Тома Кларксона, который заключается в создании экземпляра подчиненного, позволяющего синхронизировать его с мастером, а затем продвигать подчиненного к мастеру. Это приведет к гораздо более короткому времени простоя по сравнению с принятым мною ответом, особенно если вы работаете с несколькими ГБ данных redis. Если вы можете добавить в этот микс redis sentinel, вы можете выполнить миграцию практически без простоев.
ErJab
У меня есть удаленный сервер Redis, и я хочу скопировать его данные на мой локально работающий сервер Redis ... использование dump.rdb может быть сложным, потому что мне придется переместить эти данные по сети ..
Александр Миллс

Ответы:

110

Сохраните снимок базы данных в dump.rdb, запустив BGSAVEили SAVEиз командной строки. Это создаст файл с именем dump.rdb в той же папке, что и ваш сервер Redis. Смотрите список всех команд сервера .

Скопируйте этот dump.rdb на другой сервер Redis, на который вы хотите выполнить миграцию. Когда Redis запускается, он ищет этот файл для инициализации базы данных.

Анураг
источник
16
Это заставляет меня догадываться о нескольких вещах: куда команда SAVE помещает свой дамп? Где Redis ищет файл "dump.rdb" для загрузки запуска? В моей конфигурации redis для dbfilename установлено значение /var/db/redis/redis_state.rdb ... это имя файла, которое я использую вместо "dump.rdb"?
Моджо
23
Также имейте в виду, что вы не можете сделать этот обмен во время работы вашего сервера, так как вызов SHUTDOWN на работающем сервере сохранит содержимое его памяти в файл дампа, перезаписав копию, которую вы только что там поместили. Сначала выключите сервер. Затем перезаписать файл дампа. Затем снова запустите сервер.
Houen
9
Если вы используете протоколирование AOF (в redis.conf, appendonly = yes), установите его noдо запуска сервера Redis - в противном случае он не будет загружать новый набор данных. Как только набор данных загружен в память, включите его снова, как в memory ( config set appendonly yes), так и в файле конфигурации.
Мэтью Ратцлофф,
5
В Ubuntu конф файл Redis хранится в /etc/redis/redis.conf, и вы можете искать через него , чтобы найти , где ваши .rdbфайлы: cat /etc/redis/redis.conf | grep "rdb". В моем случае это/var/lib/redis
Herman Schaaf
5
redis-cli config get dirдаст вам каталог, в котором .rdbхранится.
Кишор Павар
253

Сначала создайте дамп на сервере А.

A$ redis-cli
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/var/lib/redis/"
127.0.0.1:6379> SAVE
OK

Это обеспечивает dump.rdbполную актуальность и показывает нам, где оно хранится ( /var/lib/redis/dump.rdbв данном случае). dump.rdbтакже периодически записывается на диск автоматически.

Затем скопируйте его на сервер B:

A$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb

Остановите сервер Redis на B, скопируйте dump.rdb (убедитесь, что разрешения такие же, как и раньше), затем запустите.

B$ sudo service redis-server stop
B$ sudo cp /tmp/dump.rdb /var/lib/redis/dump.rdb
B$ sudo chown redis: /var/lib/redis/dump.rdb
B$ sudo service redis-server start

Версия Redis на B должна быть больше или равна версии A, иначе вы можете столкнуться с проблемами совместимости .

Уилфред Хьюз
источник
32
Способ лучше, чем принятый ответ, имеет все детали.
БТК
1
Это сэкономило мне много времени, показав, что импорт в redis выполняется путем перетаскивания дампа в папку
redis
7
на Mac резервная копия redis хранится в / usr / local / var / db / redis /
Донован Томсон
3
@DonovanThomson Спасибо. (Я использовал homebrew для установки Redis на Mac) ... Более общий способ найти ваш путь - использовать команду Redis CONFIG GET dir, которая вернулась"/usr/local/var/db/redis"
Джулиан Соро
И что делать с записями, которые пошли к A во время этого процесса?
Майк Граф
34

Если у вас есть соединение между серверами, лучше настроить репликацию (что тривиально, в отличие от SQL) с новым экземпляром в качестве подчиненного узла - тогда вы можете переключить новый узел на ведущий с помощью одной команды и выполнить перемещение с помощью нулевое время простоя

Том Кларксон
источник
1
У меня есть связь. Поэтому я могу использовать конфигурацию slaveof на новом сервере и установить для нее IP-адрес старого сервера. Но как узнать, когда передача данных между ведущим и ведомым завершена? И после этого, как мне продвинуть раба к господину?
ErJab
Я думаю, что команда INFO скажет вам, когда она будет готова. Однако это не имеет большого значения - поскольку это репликация, а не разовая копия, вы можете оставить оба узла на месте так долго, как захотите, прежде чем отключать старый узел. SLAVEOF NONE - это команда для продвижения нового узла для освоения.
Том Кларксон
9
Звучит как отличное решение - было бы неплохо с некоторыми примерами команд!
Кнутоль
16

Также возможно перенести данные с помощью команды SLAVEOF:

SLAVEOF old_instance_name old_instance_port

Убедитесь, что вы получили ключи с KEYS *. Вы также можете протестировать новый экземпляр любым другим способом, а когда закончите, просто включите репликацию:

SLAVEOF NO ONE
estani
источник
Это самый безболезненный подход!
noooooooob
13

В настоящее время вы также можете использовать MIGRATE, начиная с версии 2.6.

Я должен был использовать это, так как я хотел переместить данные только в одну базу данных, а не во все. Два экземпляра Redis живут на двух разных машинах.

Если вы не можете подключиться напрямую к Redis-2 из Redis-1, используйте привязку порта ssh:

 ssh user@redis-2.foo.com -L 1234:127.0.0.1:6379

Небольшой скрипт для зацикливания всех ключей с использованием KEYS и MIGRATE каждого ключа. Это Perl, но, надеюсь, вы поняли:

 foreach ( $redis_from->keys('*') ) {

    $redis_from->migrate(
        $destination{host},    # localhost in my example
        $destination{port},    # 1234
        $_,                    # The key
        $destination{db},
        $destination{timeout} 
    );
 }

См. Http://redis.io/commands/migrate для получения дополнительной информации.

Ойвинд Скаар
источник
какой удаленный редис, на который вы хотите мигрировать, имеет ПАРОЛЬ?
noooooooob
4

Чтобы проверить, куда должен быть помещен файл dump.rdb при импорте данных redis,

запустить клиент

$redis-cli

и

затем

redis 127.0.0.1:6379> CONFIG GET *
 1) "dir"
 2) "/Users/Admin"

Здесь / Users / Admin - это расположение файла dump.rdb, который читается с сервера, и поэтому этот файл необходимо заменить.

Vinay Vemula
источник
2

Вы также можете использовать RDD

он может создавать и восстанавливать работающий сервер Redis и разрешать фильтровать / сопоставлять / переименовывать ключи дампа

r043v
источник
2

Ключевые элементы миграции с нулевым временем простоя:

  • репликация ( http://redis.io/commands/SLAVEOF )
  • возможность записи в ведомое устройство во время переключения приложения ( CONFIG SET slave-read-only no)

Коротко:

  1. установить целевой redis (пустой) в качестве подчиненного источника redis (с вашими данными)
  2. дождитесь окончания репликации
  3. разрешить запись в целевой Redis (который в настоящее время является подчиненным)
  4. переключите ваши приложения на целевой Redis
  5. ждать завершения потока данных от хозяина к рабу
  6. превратить целевой редис от хозяина до раба

Кроме того, у redis есть параметры, позволяющие отключить повторный доступ к источнику для приема записей сразу после отсоединения цели:

  • min-slaves-to-write
  • min-slaves-max-lag

Эта тема покрыта

Очень хорошее объяснение от команды RedisLabs https://redislabs.com/blog/real-time-synchronization-tool-for-redis-migration

И даже их интерактивный инструмент для миграции: https://github.com/RedisLabs/redis-migrate

x'ES
источник
1

Я также хочу сделать то же самое: перенести базу данных из автономного экземпляра redis в другой экземпляр redis (redis sentinel).

Поскольку данные не являются критическими (данные сеанса), я попробую https://github.com/yaauie/redis-copy .

tangxinfa
источник
1

Простой способ экспорта / резервного копирования данных Redis (создания файла дампа), который я нашел, состоит в том, чтобы запустить сервер через командную строку с флагом slaveof и создать живую реплику следующим образом (при условии, что исходный Redis - это 1.2.3.4 на порту 6379):

/usr/bin/redis-server --port 6399 --dbfilename backup_of_master.rdb --slaveof 1.2.3.4 6379
Маоз Садок
источник
У меня есть Redis, работающий на Linux-машине, к которой у меня есть доступ. У меня есть Redis на моей машине Windows. Можно ли скопировать данные для такой комбинации?
Камран Шахид
1
Я полагаю, что вы можете, если оба с одинаковой версией
Maoz Zadok
Да, мне нужно проверить версию также. Но версия выпуска Windows не выше 3.0, как я знаю в последний раз
Kamran Shahid
0

Я только что опубликовал утилиту интерфейса командной строки для npm и github, которая позволяет копировать ключи, соответствующие заданному шаблону (даже *), из одной базы данных Redis в другую.

Вы можете найти утилиту здесь:

https://www.npmjs.com/package/redis-utils-cli

Габриэль МакАдамс
источник
-2

Редис-дамп наконец-то сработал для меня. Его документация содержит пример того, как вывести базу данных Redis и вставить данные в другую.

JustAC0der
источник