Cassandra pod 不會在次要區域啟動

您目前查看的是 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

問題

在多區域 Apigee Hybrid 設定中,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. 嘗試在具有 Cassandra 種子主機設定的區域中,重新安裝 Apigee 執行階段叢集 (如這篇文章所述)。overrides.yaml
  3. 刪除 Apigee 執行階段叢集不會移除 Cassandra 叢集中的參照。因此,系統會保留已刪除叢集中 Cassandra Pod 的過時參照。因此,當您嘗試在次要區域重新安裝 Apigee 執行階段叢集時,Cassandra Pod 會回報特定 IP 位址已存在。這是因為系統可能會從先前使用的相同子網路指派 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 的過時參照。如要驗證這一點,請在主要區域中執行 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)

    如您所見,keyspaces 會同時參照 Primary-DC1Secondary-DC2,即使 Apigee 執行階段叢集已在次要區域中刪除。

    必須從每個 keyspace 定義中刪除 Secondary-DC2 的過時參照。

  3. 在刪除 keyspace 定義中的過時參照之前,請使用下列指令刪除整個 Apigee Hybrid 安裝項目,但 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 的參照。如要取得 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 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
          

參考資料