1

1 秒あたりの読み取り回数が非常に多く、書き込み回数が非常に少ない6ノードの cassandra クラスターがあります。アプリケーション全体は次のもので構成されます。

  • 1 つの cassandra ノードを使用する Web アプリケーション サーバー
  • それぞれ独自の cassandra ノードを使用する 5 つの Web サービス マシン (pycassa のプール server_list は常に 1 つのノードです)

cassandra と通信する Web アプリは、読み取り操作と書き込み操作を行っています (ただし、非常に少数であり、誰かが実際にアプリ UI を使用している場合のみであり、これは頻繁には発生しません)。ただし、Web サービスは、サードパーティ サービスからのトラフィックで非常に大きな負荷がかかります。ロード バランサーはトラフィックを 5 つのサーバーすべてに転送し、各サーバーは独自の cassandra ノード (物理的には別のサーバーにある) に大量の get() および multiget() リクエストを送信します。ときどき set() が使用されますが、それは 1 万回の読み取りに 1 回程度です。

このような使用法があるため、レプリケーション ファクター 6 を使用することにしました。各 Cassandra に 100% のデータがある場合、読み取りはより高速になり、負荷はより均等に分散されるはずです。キースペースの strategy_options を更新し、各ノードで nodetool repair を実行してデータを転送しました。うまくいきました。

非常に奇妙なことに、6 つすべての cassandra ノードの CPU 使用率が非常に高くなっています。Web サービスで使用される 5 つのノードの場合は理解できますが、webapp cassandra ノードも大量の読み取りを実行しているかのように大量の CPU を消費する理由を説明できません。レプリケーションがまったく機能しなかったかのようです。get() が発生し、リング全体に極度の負荷がかかるたびに、各 cassandra ノードが他のすべてのノードと通信しているように見えます。

これを証明するために、さらに別の実験を行いました。Web サーバーの 1 つを停止し、対応する Cassandra ノードを調べました。サーバーがダウンした後、この cassandra ノードの CPU 使用率はゼロに近いと予想しました。これは、他のマシンがそれを指していないためです。しかし、それはゼロではなく、わずかに低下しましたが、それでも非常に高いレベル (60% の CPU 使用率) でした。

pycassa を使用しており、整合性レベルを操作していないため、デフォルトの ConsistencyLevel.ONE になっています。

私が言いたいことを理解していただければ幸いです...レプリケーション係数がリング内のノード数に等しく、読み取り整合性レベルがデフォルト (ONE) の場合、各ノードは読み取りに関して一種独立している必要があります: 誰も実行していない場合特定のノードからの読み取りがあれば、このノードの CPU 使用率は最小限に抑える必要があります。正しいですか? ただし、ノードを認識している唯一のクライアントを切断しても、誰かがまだノードから読み取りを続けているかのように、高い CPU 使用率が観察されます。この負荷はどこから来ているのか、何が起こっているのかを調査するにはどうすればよいでしょうか?

4

1 に答える 1

3

間違っている場合は訂正してください。クラスター内のノードで見られる負荷は、バックグラウンドで発生する読み取り修復であると思います。クラスター内のノードで ConsistencyLevel.ONE を読み取ると、データがすぐに返され、読み取りによってバックグラウンドで読み取り修復がトリガーされ、要求されたデータの他のすべてのレプリカにダイジェスト クエリが送信され、一貫性が確保されます。
レプリケーション係数は 6 (すべてのノード上のすべてのデータ) であるため、読み取りごとに、読み取り修復要求が 6 つのノードすべてに送信されます。

Cassandra 読み取り修復

于 2012-10-12T16:58:48.200 に答える