Як перенести базу даних Redis з одного сервера на інший?


179

Наразі у мене є сервер redis, який працює в режимі хмари, і я хочу перенести цей сервер redis на новий хмарний екземпляр і використовувати цей екземпляр як мій новий сервер redis. Якби це MySQL, я б експортував БД зі старого сервера та імпортував його на новий сервер. Як мені це зробити з redis?

PS: Я не шукаю налаштування реплікації. Я хочу повністю перенести сервер redis на новий екземпляр.


5
Роками пізніше ... Після роботи з різними предметами, пов'язаними з переробленням, я б запропонував підійти до підходу Тома Кларксона створити рабський екземпляр, дозволити йому синхронізуватися з господарем, а потім просунути раба до господаря. Це спричинить набагато коротший час простою в порівнянні з відповіді, яку я прийняв, особливо якщо ви маєте справу з декількома ГБ даних про перегляд даних. Якщо ви можете вписати в цю суміш дозорну панель, ви можете зробити майже нульову міграцію простою.
ErJab

У мене є віддалений сервер Redis і хочу скопіювати його дані на мій локально запущений сервер Redis ... за допомогою dump.rdb може бути складним, бо мені доведеться переміщувати ці дані по мережі ..
Олександр Міллз

Відповіді:


110

Збережіть знімок бази даних у dump.rdb, запустивши BGSAVEабо SAVEз командного рядка. Це створить файл з назвою dump.rdb у тій самій папці, що і ваш сервер redis. Перегляньте список усіх команд сервера .

Скопіюйте цей dump.rdb на інший сервер redis, на який потрібно перейти. Коли редіс запускається, він шукає цей файл для ініціалізації бази даних.


16
Це дозволяє мені здогадуватися про пару речей: Де команда SAVE кладе свій дамп? Де Redis шукає файл "dump.rdb" для завантаження запуску? У моєму конфігурації redis встановлено dbfilename на /var/db/redis/redis_state.rdb ... це ім'я файлу, яке я використовую замість "dump.rdb"?
Моджо

23
Також пам’ятайте, що ви не можете робити цю заміну під час роботи вашого сервера, оскільки виклик SHUTDOWN на запущеному сервері збереже вміст пам’яті у своєму дамп-файлі, перезаписавши копію, яку ви тільки що розмістили там. Перше відключення сервера. Потім перезапишіть файл дампа. Потім знову запустіть сервер.
Хоуен

9
Якщо ви використовуєте журнал AOF (у redis.conf, appendonly = yes), встановіть його noперед запуском сервера Redis - інакше він не завантажить новий набір даних. Як тільки набір даних завантажується в пам'ять, увімкніть його як в пам'яті ( config set appendonly yes), так і в конфігураційному файлі.
Меттью Ратфлофф

5
В Ubuntu конф файл Redis зберігається в /etc/redis/redis.conf, і ви можете шукати через нього , щоб знайти , де ваші .rdbфайли: cat /etc/redis/redis.conf | grep "rdb". У моєму випадку це/var/lib/redis
Герман Шааф

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 on B повинна бути більшою або рівною, ніж версія A, інакше можуть виникнути проблеми сумісності .


32
Шлях краще, ніж прийнятий відповідь, має всі деталі.
btk

1
Це заощадило мені багато часу, показавши, що імпорт у redis відбувається шляхом скидання дампа в папку
redis

7
на mac резервна копія Redis зберігається за адресою / usr / local / var / db / redis /
Донован Томсон

3
@DonovanThomson Дякую (Я використовував домашню мову для встановлення redis на mac) ... Більш загальний спосіб знайти ваш шлях - це використовувати команду redis CONFIG GET dir, яка повернулася"/usr/local/var/db/redis"
Julian Soro

І що робити з написами, які під час цього процесу дійшли до А?
Майк Граф

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 для отримання додаткової інформації.


що таке віддалений редис, на який ви хочете перенести, має PASSWORD?
noooooooob

4

Щоб перевірити, де dump.rdb повинен бути розміщений під час імпорту даних Redis,

запустити клієнта

$redis-cli

і

тоді

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

Тут / Користувачі / Адміністратор - це місце dump.rdb, яке зчитується з сервера, і тому це файл, який потрібно замінити.


2

ви також можете використовувати rdd

він може скидати та відновлювати працюючий сервер Redis та дозволяти фільтри / відповідати / перейменовувати дампські ключі


2

Основними елементами міграції з нульовим простоєм є:

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

Коротко:

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

Крім того, у redis є параметри, які дозволяють відключити джерело 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

Я також хочу зробити те ж саме: перемістити db з окремого екземпляра 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

У мене є редіс, що працює на машині Linux, до якої я маю доступ. У мене є переділ на моїй машині Windows. чи можна скопіювати дані для такої комбінації?
Камран Шахід

1
Я вважаю, що ви можете, якщо обидва з однаковою версією
Маоз Садок

Так, мені також потрібно перевірити версію. Але версія випуску Windows не вище 3.0, як я останній знаю
Камран Шахід

0

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

Ви можете знайти утиліту тут:

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


-2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.