web-dev-qa-db-ja.com

Cassandra頻繁な読み取り/書き込みタイムアウト

datastax Java driver 1.0.1cassandra 1.2.6..を使用して、コードベース全体をThriftからCQLに変更しました。

倹約により、最初から頻繁にタイムアウトが発生し、続行できませんでした... CQLを採用し、成功し、タイムアウトが少なくなるように設計されたテーブル...

それで私は節約で働いていなかった巨大なデータを挿入することができました...しかし、ステージの後、約3.5GBのデータフォルダ。書き込みタイムアウトの例外が頻繁に発生します。以前の同じユースケースをもう一度実行しても、タイムアウト例外がスローされます。一度動作したランダムISフレッシュセットアップ後も動作しません。

CASSADNRAサーバーログ

これはcassandraサーバーの部分ログデバッグモードで、エラーが発生しました:

http://Pastebin.com/rW0B4MD

クライアントの例外は次のとおりです。

Caused by: com.datastax.driver.core.exceptions.WriteTimeoutException: Cassandra timeout during write query at consistency ONE (1 replica were required but only 0 acknowledged the write)
    at com.datastax.driver.core.exceptions.WriteTimeoutException.copy(WriteTimeoutException.Java:54)
    at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.Java:214)
    at com.datastax.driver.core.ResultSetFuture.getUninterruptibly(ResultSetFuture.Java:169)
    at com.datastax.driver.core.Session.execute(Session.Java:107)
    at com.datastax.driver.core.Session.execute(Session.Java:76)

インフラストラクチャ:8GBヒープがcassandra、i7プロセッサに与えられた16GBマシン..私はSINGLEノードを使用していますcassandra yamlはタイムアウト用に調整され、それ以外はすべてデフォルトです:

  • read_request_timeout_in_ms:30000
  • range_request_timeout_in_ms:30000
  • write_request_timeout_in_ms:30000
  • truncate_request_timeout_in_ms:60000
  • request_timeout_in_ms:30000

ユースケース:組み合わせ(私のプロジェクト用語)をcassandraに格納するユースケースを実行しています....現在、100の並列スレッドで250000の組み合わせを格納することをテストしています..各スレッドが1つの組み合わせを格納しています...実際には数千万のサポートが必要ですが、異なるハードウェアとマルチノードクラスターが必要になります...

保管では、1つの組み合わせは約2秒かかり、以下が含まれます。

  • 527 INSERTINTOクエリ
  • 506UPDATEクエリ
  • 954SELECTクエリ

100の組み合わせを並列に格納する100の並列スレッド。

WRITE TIMEOUTSの動作は、200 000まで機能し、その後タイムアウトをスローし、10kの組み合わせでも機能しない場合があります。ランダムな動作。

10
user2572801

一部のcassandra-stress読み取り操作中に、レートスレッドを高く設定しすぎると、CLエラーが発生することがわかりました。テスト中にスレッドの数を減らして、プールが維持できる手頃な価格にすることを検討してください。

  • read_request_timeout_in_ms

私の意見では、cassandra.yamlでそれを変更することは必ずしも良い考えではありません。マシンが使用するハードウェアリソースを検討してください。

卵の場合:

cassandra-stress read n=100000 cl=ONE -rate threads=200 -node N1

エラーが発生しますが

cassandra-stress read n=100000 cl=ONE -rate threads=121 -node N1

スムーズに仕事をします。

それがみんなを助けることができることを願っています。

P.S.読み取りテストを行うときは、「-pop dist = UNIFORM(1..1000000)」または必要な量のデータに対しても読み取りを分散させてください。

2
Mr'Black

同様の問題があったため、dev cassandra nodes config yamlを読み取るのに少し時間を費やしました。開発ノードに約30億のsha2ハッシュをロードしようとすると、システムが停止してタイムアウトになります600MBのみRAM;)

キャッシュサイズを減らし、フラッシュする前に待機するなどして修正しました。これにより、書き込み時にノードの速度が低下しましたが、安定していました。その後、必要な数のデータをロードすることができました。

しかし、申し訳ありませんが、どのオプションがあったのかわかりませんでした。パフォーマンスチューニングと、CPUコア、RAMなどに基づいてシステムの正しい値を計算する方法に関するドキュメントを読んだことを覚えています。

私が抱えていた問題は、キャッシュがディスクに十分な速度で書き込まれなかったため、すべてをブロックし始めることでした。言った後、もっと頻繁に書いて新しいリクエストを待たせてください、ノードは安定していて、私のインポートは少し遅くなりました。

cassandraのデフォルトオプションは、負荷を分散できるマルチノードクラスター内に多数のコアを備えた重いRAMマシン用であると考えられます。ローカル開発環境で実行するには、ねじ込みます。ライフシステムではなく、その開発環境で、コーヒーを1つか2つ手に入れるのに時間がかかります;)

それが正しい方法で考えるのに役立つことを願っています

1
Rene M.

ログスニペットから、4 GBのヒープのみがCassandraに渡され、いっぱいになっています。それはおそらくあなたの問題です:

DEBUG [ScheduledTasks:1] 2013-08-07 15:08:09,434 GCInspector.Java (line 121) GC for ParNew: 155 ms for 6 collections, 3230372760 used; max is 4277534720

最大は4277534720 == 4GBヒープです。 cassandra-env.shにアクセスして、最大ヒープサイズと新しいヒープサイズを明示的に設定する必要があります。説明したノードの場合、最大8GBのヒープと800MBの新しいヒープがおそらく出発点として適しています。

0
Zanson

また、この問題も発生しました。「一貫性のあるwriteクエリ中のCassandraタイムアウトLOCAL_ONE(0レプリカ)は、1を超える書き込みが必要であることを確認しました」「Cassandraタイムアウト中一貫性のあるreadクエリLOCAL_ONE(0レプリカ)は、1を超える書き込みが必要であることを確認しました。 cassandra.yamlのパラメーターを変更して対処しました。 cassandra.yamlで「timeout」を検索すると、read_request_timeout_in_ms:5000 write_request_timeout_in_ms:2000が見つかります。数を増やして、「cassandra-f」を再起動します。問題は解決しました。それがあなたにも役立つことを願っています!

0
David