2012-03-01 44 views
0

Redisと組み合わせてNode.JSを使用しており、データ損失の問題が発生しています。 私たちは統計収集システムを持っていますので、私たちはサーバーに送られた各リクエストを収集する必要があります。同時実行要求が多い(平均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コマンドを使用して、実際にRedisサーバーに送信されたすべてのトラフィックが実際に格納されていることを確認することもできます。問題がサーバー側かクライアント側かを判断するのに役立ちます。

+0

私はNode.JSが本当に問題であるか、より正確には、Node.JS redisドライバ、node_redisのように思えます。 私たちは本当にmysqlメモリに移動しました。これはかなり良い結果をもたらします。 – Screatch

0

確かに、DBSIZEはすべてのキーを返すと思われますか? KEYSコマンドで同じことを試しましたか?

編集: これも役立ちます。 Accuracy of redis dbsize command

+0

KEYSコマンドは、DBSIZEと同じ番号、不正な番号を返します。 – Screatch