将两张Redis的情况下,到一个单一的实例有两个DBS(Combine two Redis inst

2019-06-23 12:14发布

我有两个Redis的情况下(或两个各自dump.rdb文件),我想他们两个DBS,每一个相应的初始实例结合成一个单一实例。

我可以做到这一点使用迁徙,但它只是在Redis的2.6.0,这不是由我目前的Redis服务器支持可用。

Answer 1:

编辑

这个答案不再是准确的Redis的的新版本。 离开历史原因的答案。


如果你愿意玩了一下周围二进制文件,您可以轻松地在两个dump.rdb文件合并成一个。

假设:

  1. 每个转储有只是一个单一的数据库 - 默认数据库
  2. 您正在使用Redis的2.4.x的,因此转储版本是2或3

如果你在一个十六进制编辑器打开该文件,这是RDB文件的格式 -

REDIS000x FE 00 <actual data > FF

这里 -

  • 000x是RDB版本号。 这很可能是技术或者0003你的情况
  • FE是数据库选择器, 00是数据库数
  • <actual data>是在当前数据库中的键-值对。 你可以把这个作为当前的意图二进制BLOB。
  • FF是文件中的最后一个字节,并指示RDB文件的末尾

因此,合并两个RDB文件,请执行下列操作 -

  1. 创建一个新的目标文件
  2. 从除了最后的第一个文件复制一切FF
  3. 复制两个字节FE 01 ,表示第二个数据库的开始
  4. 注:如果您确定这两个数据库没有重复键,并且希望将它们组合成一个单一的数据库,直接跳过这两个字节FE 01如上所述。
  5. 第二个文件,跳过前11个字节-即跳过REDIS000x FE 00
  6. 复制过第二个文件的其余部分,包括最后一个字节FF

现在,您可以在Redis的并重新启动这个新dump.rdb复制到相应的目录。

如果你有兴趣, 这里是Redis的的完整文档转储文件格式 ,但你并不需要了解这一切对于这个简单的用例。



Answer 2:

下面是我用于合并4台Redis的服务器(运行的2.4.x)到2(I,两次含有两个分开的DBS,合并的2个独立的Redis实例(每个与DB0数据)转换成1)的技术:

  1. 让新的实例,富,你的实例的奴隶A(即编辑redis.conf和使用slaveof )。
  2. 一旦富完成从A同步,slaveof除去所以它成为主站。 所有的数据将在DB0。
  3. 使用Redis的转储 (Ruby库,但有命令行使用率)导出或转储从实例B.所有的数据。这将创建一个JSON文件。
  4. 如果数据是在实例B DB0,你需要现在编辑从步骤#3所产生的JSON文件。 这为B / C,你不希望B的数据导入到Foo的DB0它现在包含的数据。
    • Redis的转储的格式包含每个键的源数据库; 因此,你需要编辑文档的分贝从0更改为别的东西 - 1,2,等等。
    • 我的JSON文件很大,所以我用的sed: sed -e 's/\"db\":0/\"db\":3/' orig.json > db_3.json
  5. 使用Redis的转储的redis-load命令导入包含从实例B中的数据转化为富JSON文件。
    • 如果您编辑JSON文件,并改变了分贝如此不同的东西,比如3,那么你就需要将数据导入到数据库,即<new.json redis-load -u host:port -d 3
    • 如果你有足够的数据(我是进口GBS) 可能需要数小时。 您可以通过在同一个盒子作为目标的Redis实例(美孚)运行这个进程加快速度。

现在你有一个在DB0数据和B在DB1数据的单一实例的Redis(美孚)。



Answer 3:

我有很多与它的烦恼,所以我创建了一个使用dump和restore一个Python脚本。 它系列化1分贝Dictionary对象和picles它。 与不同的开关的picled文件被加载并在数据被上传到其它redis的实例。

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



文章来源: Combine two Redis instances into a single instance with two dbs
标签: redis