如何将使用模块创建的Redis RDB文件迁移到没有该模块的部署?(Redis Stack 7.2+版本中不再包含RedisGraph)

mjqavswn  于 8个月前  发布在  Redis
关注(0)|答案(2)|浏览(88)

当我尝试从一个用以前版本的RS创建的RDB文件中加载一个Redis Stack 7.2的Redis数据库时,它无法加载,并打印出以下错误:

* Loading RDB produced by version 6.2.13
* RDB age 848231 seconds
* RDB memory usage when created 1.50 Mb
# The RDB file contains AUX module data I can't load: no matching module 'graphdata'

这可能是由于Redis逐步淘汰RedisGraph,article about that提到RG“从版本7.2开始不再是Redis Stack的一部分”。
我假设这一切都很好,因为我从来没有使用过任何图形相关的功能。然而,RDB文件似乎引用了RedisGraph模块**,尽管**没有任何与之相关的条目,我认为这没有逻辑原因。
如果用户需要RDB持久化,那么他们打算用什么方法来保持Redis Stack版本最新?看起来7.2版本根本不接受任何以前版本的RDB文件。
有没有一个简单的方法来迁移它并继续使用这个文件?

q0qdq0h2

q0qdq0h21#

我也被吓到了。特别是,我一直在本地使用redis-stack做一个小项目,一周前Homebrew cask从redis-stack-server 6.2.6-v9更新到了7.2.0(commit)。
尽管我们从未使用过RedisGraph,但我们无法加载RDB的原因是,加载模块会将元数据保存到AUX字段(自定义数据类型?),新版Redis在没有模块的情况下无法读取。这也禁止您在运行时使用MODULE UNLOAD卸载模块。
这是古怪的,他们正在讨论如何修复pull requests #11056和现在的#11374
无论如何,拯救数据的一个基本策略是在以前的工作配置中加载它,以不包括对旧模块的违规引用的方式将其导出为纯文本AOF日志,再次升级到7.2.0-删除违规RDB文件-并加载我们生成的AOF。SAVE,你得到了一个新的RDB。
我在本地处理大约5 MB的数据,没有生产示例可用。这种方法假设除了您之外,没有客户端连接并尝试修改数据。这是一个基本的大纲,但可以根据你的情况进行修改。
1.在你做任何其他事情之前,备份你的RDB文件,所以如果这些步骤在第一次尝试时没有准确地工作,你有一个安全网。对我来说,用Homebrew,我只是做了例如。
cp /opt/homebrew/var/db/redis-stack/dump.rdb ~/Desktop/dump.orig.rdb
1.降级回6.2.x。同样,这将取决于您的操作系统和配置。对于Homebrew,你可以尝试通过下载你想要的公式版本并从磁盘安装来降级一个桶。下载the previous version of the cask formula for redis-stack-server.rb
brew install --cask ~/Downloads/redis-stack-server.rb
1.尝试启动redis-stack-server。你该回来了
1.通过检查RDB文件,我们可以看到这些有问题的模块引用,顺便说一句:

$ redis-check-rdb /opt/homebrew/var/db/redis-stack/dump.rdb
[offset 0] Checking RDB file dump.rdb
[offset 27] AUX FIELD redis-ver = '6.2.13'
[offset 41] AUX FIELD redis-bits = '64'
[offset 53] AUX FIELD ctime = '1692437664'
[offset 68] AUX FIELD used-mem = '5479248'
[offset 84] AUX FIELD aof-preamble = '0'
[offset 96] MODULE AUX for: graphdata
[offset 111] MODULE AUX for: scdtype00
[offset 124] MODULE AUX for: ft_index0
[offset 129] Selecting DB ID 2
[offset 2666081] MODULE AUX for: graphdata
[offset 2666096] MODULE AUX for: scdtype00
[offset 2666108] Checksum OK
[offset 2666108] \o/ RDB looks OK! \o/
[info] 4713 keys read
[info] 0 expires
[info] 0 already expired

1.导出数据。

$ redis-cli
127.0.0.1:6379> CONFIG SET aof-use-rdb-preamble no
OK
127.0.0.1:6379> CONFIG SET appendonly yes
OK
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started

检查服务器日志,然后断开客户端并停止服务器。
1.删除活动RDB文件。
rm /opt/homebrew/var/db/redis-stack/dump.rdb
现在应该有一个更大的appendonly.aof在旁边。你可以把它移到安全的地方
mv /opt/homebrew/var/db/redis-stack/appendonly.aof ~/Desktop/appendonly.6.2.aof
1.升级到7.2.0。对我来说,使用自制软件,
brew upgrade redis-stack-server
1.最后,在没有任何数据的情况下启动7.2.0(因为我们删除/移动了所有数据)
redis-stack-server
并重播日志:
redis-cli --pipe < ~/Desktop/appendonly.6.2.aof
您现在可以发出SAVEBGSAVE来生成新的RDB文件。
希望这对你有帮助!我已经有十年左右没有负责生产Redis示例了,我只是选择Redis Stack来支持JSON,因为我缓存了来自JSON API的整个响应,并且认为它可能很方便。但是模块互操作性的这个问题让我想知道我是否应该现在坚持使用vanilla Redis。
顺便说一下,Redis 7.2.0在启动时对我说:

71950:M 21 Aug 2023 04:07:05.933 * <redisgears_2> Created new data type 'GearsType'
71950:M 21 Aug 2023 04:07:05.934 * <redisgears_2> Detected redis oss
71950:M 21 Aug 2023 04:07:05.934 # <redisgears_2> could not initialize RedisAI_InitError

71950:M 21 Aug 2023 04:07:05.934 * <redisgears_2> Failed loading RedisAI API.
71950:M 21 Aug 2023 04:07:05.934 * <redisgears_2> RedisGears v2.0.11, sha='0aa55951836750ceabd9733decb200f8a5e7bac3', build_type='release', built_for='Macos-mac os12.6.3.arm64v8'.
71950:M 21 Aug 2023 04:07:05.935 * <redisgears_2> Registered backend: js.
71950:M 21 Aug 2023 04:07:05.935 * Module 'redisgears_2' loaded from /opt/homebrew/Caskroom/redis-stack-server/7.2.0-v0/lib/redisgears.so

所以...我想没问题吧。:)

txu3uszq

txu3uszq2#

我来自Redis。**我们对此表示抱歉。**我们将尽快修复(目标日期定于下周)。
我们计划发布一个新的虚拟模块- RedisGraphStub。这个模块将是极简主义的。它不支持任何命令,并且在加载时忽略图形数据。如果有一个空的图形AUX字段-模块将忽略它并继续。如果有图密钥-模块将失败(拥有图密钥的用户必须手动删除它们才能升级到Redis Stack 7.x。这将确保图形数据不会被无意中删除)。
我们还将发布Redis Stack 7.2的补丁,其中将包含RedisGraphStub模块。
如果你正在使用Redis和RedisGraph,并希望删除RedisGraph,因为它的生命周期结束,但仍然希望保留所有其他数据,你可以手动添加RedisGraphSub模块。

相关问题