【发布时间】:2020-10-05 22:03:10
【问题描述】:
我们使用 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 与here 列出的所有 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
我几乎在整个互联网上搜索了这个错误,但没有人提供解决方案,也没有人解释出了什么问题。
幸运的是,进程“有时”会显示错误堆栈。它指向 ioredis 代码中的lib/redis/index.ts:711。我不知道它是做什么的。
(stream || this.stream).write(command.toWritable());
https://github.com/luin/ioredis/blob/master/lib/redis/index.ts#L711
我在 ioredis github 存储库上发现了一些问题,其中提到了一些 EPIPE 错误。但其中大部分是关于错误处理的内容,并且都标记为已解决。
我还在 google 上发现了一些常见的 EPIPE 错误(其中大部分是关于 socket.io 的,这不是我使用的东西。)
总结
这东西有什么问题?
【问题讨论】:
-
请版主在stackoverflow中添加
keydb或key-db标签。 -
我设法克服了这个问题,但仍然不知道为什么会这样。如果在赏金结束时没有人回答,我会将我的经验发布为任何可能遇到此问题的人的答案。
-
您收到该错误是因为流以某种方式被关闭,要么是通过将
null写入它,要么在实例上调用.end(),要么是一些致命的流错误。这是我没有看到任何应用程序代码的最佳猜测。 -
@EddieDean 在服务器上做了一些
DEBUG=ioredis:* node app.js但没有注意到任何错误。我认为一切都指向在 docker 内部安装。 -
如果是这种情况,那么有关您的堆栈和 docker 使用的更多信息会有所帮助。无论如何,如果你让它工作,那就太好了。我很想知道您的解决方案是什么。
标签: javascript node.js redis ioredis keydb