【发布时间】:2023-04-06 07:56:01
【问题描述】:
我有两个 Redis 实例(或两个各自的 dump.rdb 文件),我想将它们组合成一个带有两个 dbs 的实例,一个用于各自的初始实例。
我可以使用 MIGRATE 执行此操作,但它仅在 Redis 2.6.0 中可用,我当前的 Redis 服务器不支持。
【问题讨论】:
标签: redis
我有两个 Redis 实例(或两个各自的 dump.rdb 文件),我想将它们组合成一个带有两个 dbs 的实例,一个用于各自的初始实例。
我可以使用 MIGRATE 执行此操作,但它仅在 Redis 2.6.0 中可用,我当前的 Redis 服务器不支持。
【问题讨论】:
标签: redis
对于较新版本的 redis,此答案不再准确。由于历史原因留下了答案。
如果您愿意尝试一下二进制文件,您可以轻松地将两个 dump.rdb 文件合并为一个。
假设:
如果您在十六进制编辑器中打开文件,这是 RDB 文件的格式 -
REDIS000x FE 00 <actual data > FF
这里-
000x 是 rdb 版本号。在您的情况下,它很可能是 0002 或 0003FE 是数据库选择器,00 是数据库编号<actual data> 是当前数据库中的键值对。您可以将其视为当前用途的二进制 blob。FF是文件的最后一个字节,表示rdb文件的结束所以要合并两个 rdb 文件,请执行以下操作 -
FF
FE 01 表示第二个数据库的开始FE 01。REDIS000x FE 00
FF
您现在可以将这个新的 dump.rdb 复制到 redis 中的相应目录并重新启动。
如果您有兴趣,here is complete documentation of redis dump file format,但对于这个简单的用例,您不需要了解所有内容。
【讨论】:
这是我用来将 4 个 Redis 服务器(运行 2.4.x)合并为 2 个的技术(我,两次,将 2 个单独的 Redis 实例(每个在 db0 中的数据)合并为 1 个包含两个单独的 dbs):
redis.conf 并使用 slaveof)。sed -e 's/\"db\":0/\"db\":3/' orig.json > db_3.json redis-load 命令将包含实例B 数据的JSON 文件导入Foo。
<new.json redis-load -u host:port -d 3 现在您有了一个 Redis 实例 (Foo),A 的数据在 db0 中,B 的数据在 db1 中。
【讨论】:
我遇到了很多麻烦,所以我创建了一个使用转储和恢复的 python 脚本。 它将一个数据库序列化为一个字典对象并对其进行图片化。使用不同的开关加载 picled 文件并将数据上传到其他 redis 实例。
【讨论】: