我们将 Node.JS 与 Redis 结合使用,我们遇到了数据丢失问题。 我们有统计收集系统,所以我们必须收集处理到我们服务器的每个请求。 对于高并发请求(平均 1000/秒),我们在 Redis 中遇到数据丢失问题。
我们已经在 Node.JS 和 Redis 中记录了每个请求,问题是 Node.JS 显示的请求数量与发送的请求数量完全相同,Redis 监视器调试的数量相同,但 Redis DBSIZE 向我们显示的值不正确。它总是比预期少 40%-50%。
我们的服务器配置是:
Intel® Core™ i7-920 24 GB DDR3 RAM From Hetzner
We are running Debian Squeeze, here is our 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)。
非常感谢有关此问题的任何帮助。
最佳答案
第一步是检查有关内存管理的 Redis 配置。 根据 maxmemory 和 maxmemory-policy 参数的值,Redis 可以从内存中逐出对象。您可能需要检查 maxmemory 条目是否已被注释掉,并且 maxmemory-policy 未设置为 allkeys-*
然后还应该检查 Node.js 代码。 Node.js 是异步的,它可以在处理来自 Redis 的相应 ack 数据包之前将大量项目推送到 Redis。代码应设计为在某个时候限制客户端命令队列中的项目数。您可以统计并比较发送命令的数量和回复的数量(通过定义回调来计算)来检查这一点。
最后,您可能还想使用 MONITOR Redis命令检查所有真正发送到Redis服务器的流量是否确实存储了。这可能有助于评估问题是在服务器端还是客户端。
关于node.js - Redis 数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9512974/