【问题标题】:Redis Data LossRedis 数据丢失
【发布时间】:2012-03-01 08:36:50
【问题描述】:

我们将 Node.JS 与 Redis 结合使用,但遇到了数据丢失问题。 我们有统计收集系统,所以我们必须收集处理到我们服务器的每个请求。 在高并发请求(平均 1000 个/秒)的情况下,我们在 Redis 中存在数据丢失问题。

我们在 Node.JS 和 Redis 中记录了每个请求,问题是 Node.JS 显示的请求数量完全相同,Redis Monitor 调试的数量相同,但 Redis DBSIZE 向我们显示的值不正确。它总是比预期的少约 40%-50%。

我们的服务器配置是:

英特尔® 酷睿™ i7-920 24 GB DDR3 内存 从赫兹纳

我们正在运行 Debian Squeeze,这是我们的 sysctl:

net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.core.somaxconn = 1280
fs.file-max = 50000
vm.overcommit_memory=1

我们的“平均负载”为 0.04,并且有大量可用内存 (~20gb)。

我们将非常感谢有关此问题的任何帮助。

【问题讨论】:

    标签: node.js redis data-loss


    【解决方案1】:

    第一步是查看有关内存管理的 Redis 配置。 根据 maxmemory 和 maxmemory-policy 参数的值,Redis 可以从内存中驱逐对象。您可能需要检查 maxmemory 条目是否已注释掉,并且 maxmemory-policy 未设置为 allkeys-*

    那么 Node.js 代码也应该被审查。 Node.js 是异步的,它可以在处理来自 Redis 的相应 ack 数据包之前,将大量项目推送到 Redis。代码应设计为在某些时候限制客户端命令队列中的项目数。您可以通过统计发送命令的数量和回复的数量(通过定义回调来计算)进行比较来检查这一点。

    最后,你可能还想使用 Redis 的MONITOR 命令来检查所有真正发送到 Redis 服务器的流量是否确实被存储。它可能有助于评估问题是在服务器端还是客户端。

    【讨论】:

    • 我想我发现 Node.JS 确实似乎是问题所在,或者更准确地说,是 Node.JS redis 驱动程序 node_redis。我们确实已经转移到了 mysql 内存,它给出了相当不错的结果。
    【解决方案2】:

    您确定DBSIZE 应该返回所有密钥吗? KEYS 命令你试过了吗?

    编辑: 这也可能有帮助。 Accuracy of redis dbsize command

    【讨论】:

    • KEYS 命令返回的数字与 DBSIZE 相同,数字不正确。