Cassandra Pod がセカンダリ リージョンで起動しない

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

症状

マルチリージョンの Apigee ハイブリッド セットアップのいずれかで、Cassandra Pod の起動に失敗します。overrides.yaml ファイルを適用すると、Cassandra Pod が正常に起動しません。

エラー メッセージ

  1. Cassandra Pod のログに次のエラー メッセージが記録されています。
    Exception (java.lang.RuntimeException) encountered during startup:
    A node with address 10.52.18.40 already exists, cancelling join.
    use cassandra.replace_addrees if you want to replace this node.
  2. Cassandra Pod のステータスで、次の警告が表示される場合があります。

考えられる原因

通常、この問題は次のような状況で発生します。

  1. いずれかのリージョンで Apigee ランタイム クラスタが削除されています。
  2. GKE と GKE On-Prem でのマルチリージョン デプロイで説明しているように、Apigee ランタイム クラスタの再インストールは、overrides.yaml ファイルで Cassandra シードホスト構成が使用されているリージョンで試行されます。
  3. Apigee ランタイム クラスタを削除しても、Cassandra クラスタ内の参照は削除されません。したがって、削除されたクラスタ内の Cassandra Pod の古い参照は保持されます。そのため、セカンダリ リージョンに Apigee ランタイム クラスタを再インストールしようとすると、特定の IP アドレスがすでに存在するというエラーが Cassandra Pod に表示されます。これは、IP アドレスが以前に使用したサブネットから割り当てられる可能性があるためです。
原因 説明
Cassandra クラスタ内の削除されたセカンダリ リージョン Pod への古い参照 セカンダリ リージョンで Apigee ランタイム クラスタを削除しても、セカンダリ リージョンに存在する Cassandra Pod の IP アドレスへの参照は削除されません。

原因: Cassandra クラスタ内の削除されたセカンダリ リージョン Pod への古い参照

診断

  1. Cassandra Pod のログ A node with address 10.52.18.40 already exists のエラー メッセージは、IP アドレス 10.52.18.40 を持つセカンダリ リージョン Cassandra Pod の 1 つに古い参照が存在することを示しています。プライマリ リージョンで nodetool status コマンドを実行して、これを検証します。

    出力例:

    上の例では、セカンダリ リージョンの Cassandra Pod に関連付けられた IP アドレス 10.52.18.40 が、引き続き出力に一覧表示されます。

  2. 出力にセカンダリ リージョンの Cassandra Pod への古い参照が含まれている場合は、セカンダリ リージョンは削除されたものの、セカンダリ リージョンの Cassandra Pod の IP アドレスが削除されていないことを示しています。

解決策

削除済みクラスタの Cassandra Pod の古い参照を削除するには、次の操作を行います。

  1. クライアント コンテナを作成するの手順に沿って、コンテナにログインし、Cassandra コマンドライン インターフェースに接続します。
  2. コンテナにログインして Cassandra cqlsh インターフェースに接続したら、次の SQL クエリを実行して現在の keyspace 定義を一覧表示します。
    select * from system_schema.keyspaces;

    現在のキースペースを示す出力例:

    次の出力で、Primary-DC1 はプライマリ リージョン、Secondary-DC2 はセカンダリ リージョンを指しています。

    bash-4.4# cqlsh 10.50.112.194 -u admin_user -p ADMIN.PASSWORD --ssl
    Connected to apigeecluster at 10.50.112.194:9042.
    [cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
    Use HELP for help.
    
    admin_user@cqlsh> Select * from system_schema.keyspaces;
    
    keyspace_name                        | durable_writes | replication
    -------------------------------------+----------------+--------------------------------------------------------------------------------------------------
    system_auth                          |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    kvm_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    kms_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system_schema                        |           True |                                           {'class': 'org.apache.cassandra.locator.LocalStrategy'}
    system_distributed                   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system                               |           True |                                           {'class': 'org.apache.cassandra.locator.LocalStrategy'}
    perses                               |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    cache_tsg1_apigee_hybrid_prod_hybrid |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    rtc_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    quota_tsg1_apigee_hybrid_prod_hybrid |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system_traces                        |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    (11 rows)

    ご覧のとおり、Apigee ランタイム クラスタがセカンダリ リージョンで削除されているにもかかわらず、keyspacesPrimary-DC1Secondary-DC2 の両方を参照しています。

    Secondary-DC2 への古い参照を、keyspace の各定義から削除する必要があります。

  3. keyspace の定義で古い参照を削除するには、その前に次のコマンドを使用して、ASM(Istio)と cert-manager を除く Apigee のインストール全体を Secondary-DC2 から削除します。詳細については、ハイブリッド ランタイムをアンインストールするをご覧ください。
    apigeectl delete -f YOUR_OVERRIDES_FILE.yaml --all
  4. keyspace 定義を変更して、各 keyspaces から Secondary-DC2 への古い参照を削除します。
    ALTER KEYSPACE system_auth WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kvm_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kms_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE system_distributed WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE perses WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE cache_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE rtc_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE quota_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE system_traces WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
  5. 次のコマンドを実行して、Secondary-DC2 リージョンへの古い参照がすべての keyspaces から削除されていることを確認します。
    select * from system_schema.keyspaces;
  6. Primary-DC1 の Cassandra Pod にログインし、Secondary-DC2 のすべての Cassandra Pod の UUID への参照を削除します。UUID は、前述の診断で説明されているように nodetool status コマンドで取得できます。
    kubectl exec -it -n apigee apigee-cassandra-default-0 -- bash
    nodetool -u admin_user -pw ADMIN.PASSWORD removenode UUID_OF_CASSANDRA_POD_IN_SECONDARY_DC2
  7. nodetool status コマンドを再度実行して、Secondary-DC2 の Cassandra Pod が存在しないことを確認します。
  8. GKE と GKE On-Prem でのマルチリージョン デプロイの手順に沿って、セカンダリ ランタイム(Secondary-DC2)に Apigee ランタイム クラスタをインストールします。

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

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

  1. Google Cloud プロジェクト ID
  2. Apigee ハイブリッド組織の名前
  3. 機密情報をマスキングしているプライマリ リージョンとセカンダリ リージョンの両方の overrides.yaml ファイル
  4. プライマリ リージョンとセカンダリ リージョンの両方のすべての名前空間における Kubernetes Pod のステータス:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. プライマリ リージョンとセカンダリ リージョンの両方からの Kubernetes cluster-info ダンプ:
    # generate kubernetes cluster-info dump
    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    
    # zip kubernetes cluster-info dump
    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*
  6. プライマリ リージョンからの以下の nodetool コマンドの出力。
    export u=`kubectl -n apigee get secrets apigee-datastore-default-creds -o jsonpath='{.data.jmx\.user}' | base64 -d`
    export pw=`kubectl -n apigee get secrets apigee-datastore-default-creds -o jsonpath='{.data.jmx\.password}' | base64 -d`
    
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw info 2>&1 | tee /tmp/k_nodetool_info_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw describecluster 2>&1 | tee /tmp/k_nodetool_describecluster_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw failuredetector 2>&1 | tee /tmp/k_nodetool_failuredetector_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw status 2>&1 | tee /tmp/k_nodetool_status_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw gossipinfo 2>&1 | tee /tmp/k_nodetool_gossipinfo_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw netstats 2>&1 | tee /tmp/k_nodetool_netstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw proxyhistograms 2>&1 | tee /tmp/k_nodetool_proxyhistograms_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw tpstats 2>&1 | tee /tmp/k_nodetool_tpstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw gcstats 2>&1 | tee /tmp/k_nodetool_gcstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw version 2>&1 | tee /tmp/k_nodetool_version_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw ring 2>&1 | tee /tmp/k_nodetool_ring_$(date +%Y.%m.%d_%H.%M.%S).txt
          

リファレンス