Объединить два экземпляра Redis в один экземпляр с двумя БД

У меня есть два экземпляра Redis (или два соответствующих файла dump.rdb), и я хотел бы объединить их в один экземпляр с двумя базами данных, по одному для каждого соответствующего начального экземпляра.

Я мог бы сделать это с помощью MIGRATE, но он доступен только в Redis 2.6.0, которая не поддерживается моим текущим сервером Redis.

Ответы на вопрос(3)

EDIT

авив ответ по историческим причинам.

Если вы хотите немного поиграть с двоичными файлами, вы можете легко объединить два файла dump.rdb в один.

Предположения:

Each dump has just a single database - the default database You are using Redis 2.4.x, and therefore the dump version is either 2 or 3

Если вы откроете файл в шестнадцатеричном редакторе, это формат файла RDB -

REDIS000x FE 00 <actual data > FF

Вот -

000x is the rdb version number. It will most likely be 0002 or 0003 in your case FE is the database selector, and 00 is the database number <actual data> is the key-value pairs in the current database. You can treat this as a binary blob for your current purpose. FF is the last byte in the file and indicates the end of the rdb file

Чтобы объединить два файла rdb, сделайте следующее:

Create a new destination file Copy everything from the first file except the last FF Copy two bytes FE 01 to indicate start of second database NOTE : If you are sure the two databases don't have duplicate keys, and you want to combine them into a single database, simply skip the two bytes FE 01 mentioned above. From the second file, skip the first 11 bytes - i.e. skip REDIS000x FE 00 Copy over the rest of the second file, including the last byte FF

Теперь вы можете скопировать этот новый dump.rdb в соответствующий каталог в redis и перезапустить.

Если ты заинтересован,Вот полная документация формата файла дампа Redis, но вам не нужно понимать все это для этого простого варианта использования.

 10 апр. 2012 г., 19:10
Интересный трюк!
 11 апр. 2012 г., 00:17
Хорошо, спасибо за документирование.
 24 янв. 2016 г., 10:25
Этот ответ слишком старый и может вводить в заблуждение. Теперь файл дампа redis больше не заканчивается на FF, а содержит один байт «FF». и восемь байтов контрольной суммы. Обратите внимание, что вы не усекаете свой файл rdb неправильно.

которую я использовал для объединения 4 серверов Redis (работающих под управлением 2.4.x) в 2 (я два раза объединял 2 отдельных экземпляра Redis (каждый с данными в db0) в 1, содержащий два отдельных dbs):

Make the new instance, Foo, a slave of your instance A (i.e. edit redis.conf and use slaveof). Once Foo finishes syncing from A, remove slaveof so it becomes master. All data will be in db0. Use redis-dump (Ruby library but has command line util) to export or dump all the data from instance B. This'll create a JSON file. If the data was in db0 in instance B, you'll need to now edit the resultant JSON file from step #3. This is b/c you don't want to import B's data into Foo's db0 which now contains A's data. redis-dump's format contains the source db for each key; thus, you'll need to edit the document to change the db from 0 to something else -- 1, 2, etc. My JSON files were large, so I used sed: sed -e 's/\"db\":0/\"db\":3/' orig.json > db_3.json Use redis-dump's redis-load command to import the JSON file containing the data from instance B into Foo. If you edited the JSON file and changed the db so something different, such as 3, then you'll need to import the data into that db, i.e <new.json redis-load -u host:port -d 3 If you have sufficient data (I was importing GBs) it might take hours. You can speed things up by running this process on the same box as the target Redis instance (Foo).

Теперь у вас есть единственный экземпляр Redis (Foo) с данными A в db0 и данными B в db1.

поэтому я создал скрипт на python, который использует dump и restore. Он сериализует один дБ для объекта словаря и выбирает его. С другим переключателем загруженный файл загружается, а данные загружаются в другой экземпляр Redis.

https://gist.github.com/romanmah/9664407

Ваш ответ на вопрос