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


179

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

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


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

Это самый безболезненный подход!
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, который читается с сервера, и поэтому этот файл необходимо заменить.


2

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

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


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


1

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

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


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 и вставить данные в другую.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.