1

Java クライアント アプリケーションで使用される 4 ノードの Cassandra (2.2.1) クラスターがあります。レプリケーション ファクターは 3、整合性レベルは読み取りと書き込みの LOCAL_QUORUM です。各ノードには約 5 GB のデータがあります。リクエストの量は、1 秒あたり約 2 ~ 4k です。削除操作はほとんどないため、少量のトゥームストーンが作成されます。

少し前に読み取りと書き込みのパフォーマンスが低下していることに気付きましたが、時間の経過とともに悪化しています。クラスターが非常に遅くなっています。読み取り (ほとんどの場合) と書き込みのタイムアウトが非常に頻繁になりました。ハードウェアが問題を引き起こすことはありません。クラスターが展開されているサーバーは、ディスク パフォーマンス、CPU および RAM リソースの点で非常に優れています。

問題の原因は不明ですが、根本的な原因を示している可能性があるいくつかのログ エントリに気付きました。

  1. Java クライアント アプリケーション ログの例外スタック トレース:

    com.datastax.driver.core.exceptions.ReadTimeoutException: 整合性 LOCAL_QUORUM で読み取りクエリ中に Cassandra タイムアウトが発生しました (2 つの応答が必要でしたが、応答したレプリカは 1 つだけでした)

興味深いのは、1 つのノードがまだ応答していることです。

  1. 失敗したヒント エラーのいくつかのエントリ:

    /1.1.1.1 へのヒントの再生に失敗しました。中止中 (135922 配信済み)、エラー: 操作がタイムアウトしました - 0 応答しか受信しませんでした。

  2. Cassandra ログのいくつかの次の例外:

    リクエスト中に予期しない例外が発生しました。channel = [id: 0x10fc77df, /2.2.2.2:54459 :> /1.1.1.1:9042] java.io.IOException: 読み取り中にエラーが発生しました (...): io.netty.channel.epoll.Native で接続がタイムアウトしました.readAddress(ネイティブ メソッド) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] at io.netty.channel.epoll.EpollSocketChannel$EpollSocketUnsafe.doReadBytes(EpollSocketChannel.java:675) ~[netty -all-4.0.23.Final.jar:4.0.23.Final] at io.netty.channel.epoll.EpollSocketChannel$EpollSocketUnsafe.epollInReady(EpollSocketChannel.java:714) ~[netty-all-4.0.23.Final. jar:4.0.23.Final] at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:326) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] at io. netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:264) ~[netty-all-4.0.23.Final.jar:4.0.23.Final] at io.netty.util.concurrent.

  3. 失敗したバッチ エラー:

    [<...>] の準備済みステートメントのバッチのサイズは 3453794 で、指定されたしきい値の 1024000 を 2429794 超えています。 (batch_size_fail_threshold_in_kb を参照)

バッチが大きすぎるようです。ところで、バッチ操作がたくさんあります。多分バッチはシステムに影響しますか?

  1. 最後に、ほとんどの場合に見られる例外です。ログ レベルを DEBUG に切り替えた後、これらのエントリが次々と表示されます。

    TIOStreamTransport.java:112 - 出力ストリームを閉じるときにエラーが発生しました。java.net.SocketException: java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116) でソケットが閉じられました ~[na:1.8.0_66] java.net.SocketOutputStream.write(SocketOutputStream.java:153) で ~[na: 1.8.0_66] java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) で ~[na:1.8.0_66] java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) で ~[na:1.8.0_66] java.io.FilterOutputStream.close(FilterOutputStream.java:158) で ~[na:1.8.0_66] org.apache.thrift.transport.TIOStreamTransport.close(TIOStreamTransport.java:110) で ~[libthrift-0.9.2. jar:0.9.2] org.apache.cassandra.thrift.TCustomSocket.close(TCustomSocket.java:197) で [apache-cassandra-2.2.1.jar:2.2.1] org.apache.thrift.transport.TFramedTransport で.close(TFramedTransport.java:

この問題の原因について何か考えはありますか?

ありがとうございました!

4

2 に答える 2

0

実際には、ヒントを処理できないスレッドの限られたメモリに接続されている可能性があります。-Xss を増やすことで解決する場合があります。

于 2016-10-18T20:10:31.707 に答える