無効なメッセージの管理

レプリケーションが失敗したときに無効なメッセージを管理するための、DSE Advanced Replicationストラテジ。

メッセージのレプリケーション時に、DSE Advanced Replicationはレプリケーションが確実に成功するようにメッセージの操作を試みます。場合によっては、データの1つのサブセットのみでレプリケーションが発生することもあります。

また、エッジ・クラスターのスキーマとハブ・クラスターのスキーマとの間の相違が多すぎる場合にも、レプリケーションは失敗します。たとえば、ハブのカラムとエッジの同じカラムでは型が異なる場合や、エッジのテーブルにハブの同じテーブルにはあるプライマリ・キーを形成するカラムがない場合に、スキーマの非互換性が発生します。

メッセージをレプリケートできない場合、リトライの最大数を構成できます。最大数に達してもレプリケーションがまだ失敗する場合、そのメッセージは破棄され、レプリケーション・ログから削除されます。 ソース・クラスターのレプリケーション・ログは、デスティネーション・クラスターへの送信に備えて、データを保存します。

メッセージが破棄されると、CQLクエリー文字列および関連エラー・メッセージがハブ・クラスターに記録されます。失敗したメッセージ・レプリケーションに関連するCQL文字列およびエラー・メッセージを保存する場所を定義するには、以下のロギング・ストラテジのいずれかを使用します。
  • SYSTEM_LOG:CQLクエリーおよびエラー・メッセージを、ハブのシステム・ログに記録します。 これはデフォルトの値です。
  • TABLE_LOG:CQLクエリーおよびエラー・メッセージを、ハブのdse_advrep.advrep_invalid_messages_log Cassandraテーブルに保存します。
  • NONE:ロギングを実行しません。
テーブル・ロギング・ストラテジの場合、無効なメッセージごとに1件のレコードが挿入されます。そのレコードは、失敗したメッセージ・レプリケーションに関する以下のデータを格納します。
  • keyspace_name:無効なクエリーのキースペース名
  • table_name:無効なクエリーのテーブル名
  • time_bucket:Cassandraパーティションが広くなりすぎることを防止するための時間ごとのバケット
  • id:時間ベースのid(timeuuid)
  • cql_string:CQLクエリー文字列。USING TIMESTAMPオプションを含めることにより、オリジナルのタイムスタンプを明示的に指定します。
  • error_msg:エラー・メッセージ
無効なメッセージはログ・テーブルで時間順にソートされます。

グローバル設定は、エッジ・クラスター全体に適用されます。これらのグローバル設定は、自動作成されるCQLテーブルdse_system.advrep_confに保存されます。グローバル設定を変更するように構成キーを定義するには、dse advrepコマンドライン・ツールを使用するか、CQLテーブルに直接書き込みます。デフォルトのシステム・ログ・ストラテジを引き続き使用する場合は、アクションは特に必要ありません。

手順

テーブル・ロギング・ストラテジを使用して無効なメッセージを管理するには、以下のようにします。

  1. 最大回数を変更するために、invalid_message_max_retries構成キーの値を指定します。
    dse advrep edge conf invalid_message_max_retries 20
  2. CQLのクエリー文字列およびエラー・メッセージを、デフォルトのシステム・ログの場所ではなくテーブルに保存するには、invalid_message_log構成キーをTABLE_LOGとして指定します。
    dse advrep edge conf invalid_message_log TABLE_LOG
  3. 問題を特定するには、エッジおよびハブの、エラー・メッセージ、CQLクエリー文字列、およびデータのスキーマを確認します。
  4. 非互換性の問題を解決するために適切なアクションを実行します。
  5. 無効なメッセージをリプレイします。無効なメッセージはdse_advrep.advrep_invalid_messages_log Cassandraテーブルでタイムスタンプによりソートされているため、順番にメッセージをリプレイすることは意味があります。
    カウンターはサポートされません。CQL文字列はオリジナルのタイムスタンプを指定しますが、CQLクエリーはべき等であり変更されないので、順序に関係なくメッセージをリプレイできます。
    1. ログ・テーブルから、キースペースでフィルター、テーブル、および時間バケットのレコードを読み取ります。
    2. 各レコードのcql_stringカラムからCQLクエリー文字列を抽出します。
    3. 抽出したCQLクエリーをハブに対して実行します。
    4. クエリーが成功した後、ログ・テーブルからレコードを削除します。