Cassandra のデータ レプリケーション エラー

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge ドキュメントを表示する

症状

マルチリージョン展開中にデータを複製すると、CassandraDataReplication ステータスにエラー状態が表示され、データ レプリケーションが失敗する可能性があります。

エラー メッセージ

kubectl を使用して再ビルド ステータスを表示するには:

  kubectl -n apigee get apigeeds \
  -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"

1 つ以上の Cassandra Pod が、エラー状態と再ビルドに失敗したことを示すメッセージを表示します。次に例を示します。

{
  "rebuildDetails": {
    "apigee-cassandra-default-0": {
      "message": "failed to rebuild from us-west1: java.lang.IllegalStateException : Unable to find sufficient sources for streaming range (-8567285182390470134,-8567154549835592965] in keyspace system_distributed",
      "state": "error",
      "updated": 1641581899
    },
    …
  }
}

考えられる原因

原因 説明 トラブルシューティングの実施対象
ソース リージョンが正しくない Cassandra データ レプリケーション YAML ファイルで source.region に誤った値が指定されています。 Apigee ハイブリッド
ネットワーク接続に関する問題 異なるデータセンターにある Cassandra Pod 間でネットワーク接続の問題が発生している可能性があります。 Apigee ハイブリッド

共通の診断手順

  1. データ レプリケーションのステータスを取得します。
    kubectl -n apigee get apigeeds \
    -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
  2. エラー メッセージで指定されたメッセージと同様のものを示すエラーが表示された場合、この問題に直面していることを示しています。

原因: ソース リージョンが正しくない

データ レプリケーション YAML ファイルで、実際のソース datacenter と異なるソース リージョン(datacenter)を指定した場合、データ レプリケーションは失敗します。診断の手順でこのシナリオを分析し、解決策の手順で是正します。

診断

  1. ソース リージョンのすべての Cassandra Pod を一覧表示します。
    kubectl -n apigee get pods -l app=apigee-cassandra
    
  2. ステップ 1 で返された Cassandra Pod のいずれか 1 つから実際の datacenter 値を取得します。
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  3. マルチリージョン デプロイで作成した Cassandra データ レプリケーション カスタム リソース(YAML)ファイルの source.region に使用する値を取得します。マルチリージョン デプロイのドキュメントにあるサンプル ファイル名を使用している場合、ファイルは datareplication.yaml という名前にする必要があります。
    cat datareplication.yaml
    

    結果の例:

    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: CassandraDataReplication
    metadata:
      name: region-expansion
      namespace: apigee
    spec:
      organizationRef: apigee-hybrid-example-org
      force: false
      source:
        region: "us-west1"
  4. nodetool status 出力の結果を確認して、datacenter 値が source.region 値と一致するかどうかを確認します。

    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u jmxuser -pw iloveapis123 status
    

    結果の例:

    Datacenter: dc-1
    ================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address      Load       Tokens       Owns (effective)  Host ID                               Rack
    UN  10.104.13.2  491.84 KiB  256          100.0%            7254711c-fe0a-4b34-b50f-861109f97936  ra-1
    UN  10.104.11.3  527.36 KiB  256          100.0%            5ec389f0-fd67-4de6-9f21-172d5899ff78  ra-1
    UN  10.104.12.7  838.46 KiB  256          100.0%            7a88be82-1f81-4117-86e3-2cda434c0878  ra-1
  5. datareplication.yaml ファイルの source.regionus-west1)は、nodetool ステータス出力の実際の datacenter 値(dc-1)と一致しないことに注意してください。解決策の手順に沿って構成を修正します。

解決策

データ レプリケーションを是正するには、データ レプリケーション ジョブを削除し、正しい datacenter 名で作成する必要があります。次の手順を実施します。

  1. 現在のデータ レプリケーション プロセスを削除します。マルチリージョン デプロイのドキュメントにあるサンプル ファイル名を使用している場合、ファイルは datareplication.yaml という名前にする必要があります。
    kubectl delete -f datareplication.yaml
    
  2. YAML ファイルのリージョン名を適切な datacenter 値に(例: dc-1)更新します。
    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: CassandraDataReplication
    metadata:
      name: region-expansion
      namespace: apigee
    spec:
      organizationRef: apigee-hybrid-example-org
      force: false
      source:
        region: "dc-1"
  3. 更新されたデータ レプリケーションを適用します。
    kubectl apply -f datareplication.yaml
    
  4. 次のコマンドを使用して再ビルドのステータスを確認し、以前に報告されたエラー状態がもう表示されなくなったことを確認します。
      kubectl -n apigee get apigeeds \
      -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
    
  5. 問題が解決しない場合は、原因: ネットワーク接続の問題に進みます。

原因: ネットワーク接続性の問題

データ レプリケーション エラーは、Cassandra ノード間の接続性の問題に起因する場合もあります。

診断

このシナリオを分析する手順は次のとおりです。

  1. すべての Cassandra Pod を一覧取得します。
    # list cassandra pods
    kubectl -n=apigee get pods -l app=apigee-cassandra
  2. 次の curl コマンドを実行し、7001 ポートを使用して、最初のデータセンター(dc-1)にある最初の Cassandra Pod から、2 つめのデータセンター(dc-2)にある最初の Cassandra Pod に telnet 接続します。
    kubectl -n apigee exec -it apigee-cassandra-default-0 bash -- curl -v telnet://DC_2_APIGEE_CASSANDRA_DEFAULT_0_POD_IP:7001
  3. telnet に成功すると、次のような出力が表示されます。
    * Rebuilt URL to: telnet://10.0.4.10:7001/
    *   Trying 10.0.4.10...
    * TCP_NODELAY set
    * Connected to 10.0.4.10 (10.0.4.10) port 7001 (#0)
  4. そうでない場合は、次のようなエラーが表示されます。
    * Rebuilt URL to: telnet://10.0.4.10:7001/
    *   Trying 10.0.4.10...
    * TCP_NODELAY set
    * connect to 10.0.4.10 port 7001 failed: Connection refused
    * Failed to connect to 10.0.4.10 port 7001: Connection refused
    * Closing connection 0
    curl: (7) Failed to connect to 10.0.4.10 port 7001: Connection refused

    あるデータセンターの Cassandra Pod から別のデータセンターの Cassandra Pod への接続に失敗した場合、ファイアウォール制限やネットワーク接続の問題があることを示しています。

解決策

  1. この Apigee ハイブリッドのデプロイが GKE にある場合、あるデータセンターから別のデータセンターへのトラフィックをブロックするファイアウォール ルールが設定されているかどうかを確認し、VPC ファイアウォール ルールの概要を参照してネットワーク接続の問題を分析します。
  2. この Apigee ハイブリッド デプロイメントが GKE On-Prem 上にある場合は、関連するネットワーキング チームと連携して、ネットワーク接続性の問題を分析します。

問題が解決しない場合は、診断情報の収集が必要な場合をご覧ください。

診断情報の収集が必要な場合

前述の手順を踏んでも問題が解決しない場合は、次の診断情報を収集して Google Cloud カスタマーケアにご連絡ください。

  1. Google Cloud プロジェクト ID。
  2. Apigee ハイブリッド組織。
  3. ソースと新しいリージョンの両方の overrides.yaml ファイル。機密情報をマスキングします。
  4. CassandraDataReplication YAML ファイル。
  5. Cassandra nodetool status の出力:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  6. Cassandra nodetool describecluster の出力:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password describecluster