クエリー結果の不整合の取り扱い

クエリー結果の不整合を取り扱うためのトラブルシューティングのヒント

クエリー結果の不整合をトラブルシューティングするには、セッション維持とノードのサブ範囲リペアを検討し、異なるレプリカ・ノードでの異なるソフト・コミット・ポイントのベスト・プラクティスに従います。

DSE Searchは、効率的で非常に有効に利用できる分散検索アルゴリズムをCassandraの最上部に実装してあります。このアルゴリズムは、すべてのトークン範囲を網羅するために最小限必要なレプリカ・ノードを選択し、ホット・スポットを回避しようとします。したがって、Cassandraの最終的に整合性がとれるという性質のため、一部のレプリカ・ノードはまだ最新の更新を受け取っていないか、インデックスが作成されていない場合があります。この状況により、DSE Searchは、異なるレプリカ・ノードを選択するためクエリー間で整合性のない結果(異なるnumFoundカウント)を返す原因となる場合があります。このような動作は、非常に有効に利用できる分散システム自体の仕組みに起因し、Werner Vogels氏によるACM記事「"Eventually Consistent"」に詳しく述べられています。通常、結果整合性に問題はなく、DSE Searchはセッション維持機能を適用して、後続のクエリーが、正常に安定して稼働しているクラスター上の同じノード・セットをヒットするようにするので、同じ結果が得られます。セッション維持は、以下のパラメーターを要求するセッション・シード を追加することによって機能します。

shard.shuffling.strategy=SEED
shard.shuffling.seed=session_id

障害やネットワーク・パーティションのため更新されていない不安定なクラスターがある場合は、サブ範囲リペア方法を使用してノードをリペアすることによって整合性のある結果が得られます。

結局、異なるレプリカ・ノードでの異なるソフト・コミット・ポイントが、不整合性が発生する他の小さな要因となります。指定された項目のインデックスが作成され、指定されたノードでコミットされても、まだそのノードのレプリカ上では何も行われていない可能性があります。この状況は本来、各ノード上の負荷に起因します。以下のベスト・プラクティスを実装します。

  • ノード間で読み取り/書き込み負荷のバランスを均一にすること
  • ソフト・コミット時間と、非同期インデックス作成同時実行を適切に調整すること
  • dse.yamlファイル内にバック・プレッシャーを構成すること

バック・プレッシャーのメカニズムを使用するマルチスレッド化された非同期インデックス作成の詳細については、「マルチスレッド・インデックス作成の構成」を参照してください。

挿入スループットを最大に高めるために、DSE SearchはCassandraからの挿入要求をバッファーに入れるので、できるだけ早くアプリケーションに挿入要求の確認応答を返すことができますが、バッファーに累積された要求が多くなりすぎると(構成可能な設定)、 DSE Searchは、バッファーにすでに入っている要求の処理に追いつくまで、入ってくる要求をブロックし、バッファーに入れるのを一時的に停止します。極端な場合、その一時停止により、アプリケーション側でタイムアウトが発生します。