Cassandra pod 不會在次要區域啟動

您正在查看 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

問題

在多區域 Apigee 混合式設定中,Cassandra 容器無法在其中一個區域啟動。套用 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. 嘗試在 overrides.yaml 檔案中使用 Cassandra 種子主機設定,在區域中重新安裝 Apigee 執行階段叢集,如「GKE 和 GKE On-Prem 的多區域部署」一文所述。
  3. 刪除 Apigee 執行階段叢集不會移除 Cassandra 叢集中的參照。因此,系統會保留已刪除叢集中 Cassandra Pod 的陳舊參照。因此,當您嘗試在次要區域重新安裝 Apigee 執行階段叢集時,Cassandra 容器會回報特定 IP 位址已存在。這是因為 IP 位址可能會從先前使用的相同子網路指派。
原因 說明
對 Cassandra 叢集中已刪除的次要區域 pod 的陳舊參照 刪除次要區域中的 Apigee 執行階段叢集,並不會移除次要區域中 Cassandra pod IP 位址的參照。

原因:Cassandra 叢集中的次要區域 Pod 參照過時

診斷

  1. Cassandra pod 記錄 A node with address 10.52.18.40 already exists 中的錯誤訊息指出,其中一個次要區域 Cassandra pod 具有 IP 位址 10.52.18.40 的舊參照。如要驗證這項資訊,請在主要區域中執行 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 執行階段叢集已在次要區域中刪除,keyspaces 仍會同時參照 Primary-DC1Secondary-DC2

    您必須從每個 keyspace 定義中刪除 Secondary-DC2 的陳舊參照。

  3. 刪除 keyspace 定義中的陳舊參照之前,請使用下列指令刪除整個 Apigee 混合式安裝作業 (除了 ASM (Istio) 和 cert-manager 以外),從 Secondary-DC2 中刪除。詳情請參閱「 卸除混合式執行階段」。
    helm uninstall -n APIGEE_NAMESPACE ENV_GROUP_RELEASE_NAME ENV_RELEASE_NAME $ORG_NAME ingress-manager telemetry redis datastore

    另外,請解除安裝 apigee-operator

    helm uninstall -n APIGEE_NAMESPACE operator
  4. 變更 keyspace 定義,從每個 keyspaces 中移除對 Secondary-DC2 的舊參照。
    ALTER KEYSPACE system_auth WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kvm_ORG_NAME_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kms_ORG_NAME_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_ORG_NAME_apigee_hybrid_ENV_NAME_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE rtc_ORG_NAME_apigee_hybrid_ENV_NAME_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE quota_ORG_NAME_apigee_hybrid_ENV_NAME_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. 執行下列指令,確認已從所有 keyspaces 移除對 Secondary-DC2 區域的舊參照:
    select * from system_schema.keyspaces;
  6. 登入 Primary-DC1 的 Cassandra pod,然後移除 Secondary-DC2 所有 Cassandra pod 的 UUID 參照。如前述「診斷」一節所述,您可以透過 nodetool status 指令取得 UUID。
    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 Customer Care 團隊聯絡:

  1. Google Cloud 專案 ID
  2. Apigee Hybrid 機構的名稱
  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
          

參考資料