2012-03-01 107 views
0

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

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

我们的服务器配置为:

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

我们正在运行Debian挤压,这里是我们的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

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

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

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

+0

我想我发现Node.JS确实似乎是问题,或者更确切地说,Node.JS redis驱动程序node_redis。 的确我们已经转移到了mysql内存,它给出了相当不错的结果。 – Screatch 2012-03-03 10:51:17

0

你确定,DBSIZE应该返回所有键?您是否尝试过使用KEYS命令?

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

+0

KEYS命令返回与DBSIZE相同的号码,不正确的号码。 – Screatch 2012-03-01 09:17:54