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

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

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

13 ответов


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

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


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

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, скопируйте дамп.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 должна быть больше или равна этому или вы можете ударить проблемы совместимости.


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


верьте или нет, я только что сделал статью для него:

http://redis4you.com/articles.php?id=005&name=Seamless+migration+from+one+Redis+server+to+another

но как узнать, когда передача данных завершена между хозяином и подчиненным? Вы можете использовать команду INFO.


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

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

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

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

небольшой скрипт для цикла всех ключей с помощью ключей и переноса каждого ключа. Это 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 для получения дополнительной информации.


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

SLAVEOF old_instance_name old_instance_port

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

SLAVEOF NO ONE

чтобы проверить, где свалка.rdb должен быть размещен при импорте данных redis,

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

$redis-cli

и

затем

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

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


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

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


простой способ, который я нашел для экспорта / резервного копирования данных 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 в другой экземпляр redis(Redis sentinel).

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


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

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

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


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

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

короче:

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

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

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

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

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

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


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