Redis数据丢失

时间:2012-03-01 08:36:50

标签: node.js redis data-loss

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

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

我们的服务器配置是:

Intel® Core™ i7-920
24 GB DDR3 RAM
From Hetzner

我们正在运行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)。

对此问题的任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

您确定DBSIZE应该返回所有密钥吗?您是否尝试过KEYS命令?

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