我们使用 Redis 已经有很长一段时间了,直到我们得出结论,迁移到 KeyDB 可能是其功能的一个不错的选择。
环境
OS: Centos 7
NodeJs: v12.18.0
Redis: v6.0.5
Targeted KeyDB: v0.0.0 (git:1069d0b4) // keydb-cli -v showed this. Installed Using Docker.
ioredis: v4.17.3
pm2: v4.2.1 // used for clustering my application.
背景
参考 KeyDB 文档,KeyDB 兼容最新版本的 Redis。
KeyDB 与 Redis 模块 API 和协议保持完全兼容。因此,从 Redis 到 KeyDB 的迁移非常简单,并且类似于您在 Redis 到 Redis 方案中的迁移。https://docs.keydb.dev/docs/migration/
在同一页面中,他们提供了与 KeyDB 兼容的 redis 客户端列表。该列表包含我正在使用的 ioredis。
KeyDB 与此处列出的所有 Redis 客户端兼容,因此不必担心。只需像使用 Redis 一样使用您的客户端。 https://docs.keydb.dev/docs/migration/
问题
如文档中所述。我应该能够在几个小时内轻松迁移到 KeyDB。好吧,事实并非如此!至少对我来说不是!我花了我最后 3 天在互联网上搜索解决方案。我得出的结论是我应该写信给 stackoverflow :)
这个问题有点有趣。客户端实际上正在使用 KeyDb,并且该过程实际上正在设置和检索密钥(不确定,但可能会在错误期间丢失一些数据。)。但是在 10% 的时间里,它给了我以下错误,并在一段时间后继续工作。当我使用 Redis 在我的生产环境中存储会话和其他内容时;我不能冒险忽略这种坚持错误。
error: message=write EPIPE, stack=Error: write EPIPE
./app-error-1.log:37: at WriteWrap.onWriteComplete [as oncomplete] (internal/stream_base_commons.js:92:16), errno=EPIPE, code=EPIPE, syscall=write
我几乎在所有互联网上搜索了这个错误,但没有人提供解决方案,也没有人解释出了什么问题。
幸运的是,该过程“有时”会显示错误堆栈。它指向lib/redis/index.ts:711
ioredis 代码内部。我不知道它做了什么。
(stream || this.stream).write(command.toWritable());
https://github.com/luin/ioredis/blob/master/lib/redis/index.ts#L711
我在 ioredis github 存储库上发现了一些问题,提到了一些 EPIPE 错误。但它们中的大多数都是关于错误处理的东西,并且都标记为已解决。
我还在谷歌上发现了一些一般的 EPIPE 错误(其中大部分是关于 socket.io 的,这不是我使用的东西。)
包起来
这件事有什么问题?