2012-03-01 108 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