您正在查看 Apigee 和 Apigee Hybrid 說明文件。
查看
Apigee Edge 說明文件。
問題
在多區域 Apigee 混合式設定中,Cassandra 容器無法在其中一個區域啟動。套用 overrides.yaml
檔案時,Cassandra pod 無法順利啟動。
錯誤訊息
- 您會在 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.
您可能會在 Cassandra pod 狀態中看到以下警告:
可能原因
這個問題通常會在以下情況下發生:
- 在其中一個地區刪除 Apigee 執行階段叢集。
- 嘗試在
overrides.yaml
檔案中使用 Cassandra 種子主機設定,在區域中重新安裝 Apigee 執行階段叢集,如「GKE 和 GKE On-Prem 的多區域部署」一文所述。 - 刪除 Apigee 執行階段叢集不會移除 Cassandra 叢集中的參照。因此,系統會保留已刪除叢集中 Cassandra Pod 的陳舊參照。因此,當您嘗試在次要區域重新安裝 Apigee 執行階段叢集時,Cassandra 容器會回報特定 IP 位址已存在。這是因為 IP 位址可能會從先前使用的相同子網路指派。
原因 | 說明 |
---|---|
對 Cassandra 叢集中已刪除的次要區域 pod 的陳舊參照 | 刪除次要區域中的 Apigee 執行階段叢集,並不會移除次要區域中 Cassandra pod IP 位址的參照。 |
原因:Cassandra 叢集中的次要區域 Pod 參照過時
診斷
- 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
仍會列在輸出內容中。 - 如果輸出內容包含次要區域中 Cassandra pod 的舊參照,表示次要區域已刪除,但次要區域中 Cassandra pod 的 IP 位址並未移除。
解決方法
請按照下列步驟移除已刪除叢集的 Cassandra Pod 陳舊參照:
- 請按照「建立用戶端容器」一節中的步驟,登入容器並連線至 Cassandra 指令列介面。
- 登入容器並連線至 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-DC1
和Secondary-DC2
。您必須從每個
keyspace
定義中刪除Secondary-DC2
的陳舊參照。 - 刪除
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
- 變更
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'};
- 執行下列指令,確認已從所有
keyspaces
移除對Secondary-DC2
區域的舊參照:select * from system_schema.keyspaces;
- 登入
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
- 再次執行
nodetool status
指令,確認沒有Secondary-DC2
的 Cassandra Pod。 - 按照「
GKE 和 GKE On-Prem 的多區域部署」一文中的步驟,在次要區域 (
Secondary-DC2
) 中安裝 Apigee 執行階段叢集。
必須收集診斷資訊
如果問題在按照上述操作說明後仍未解決,請收集下列診斷資訊,然後與 Google Cloud Customer Care 團隊聯絡:
- Google Cloud 專案 ID
- Apigee Hybrid 機構的名稱
- 來自主要和次要區域的
overrides.yaml
檔案,遮蓋任何機密資訊 - 主要和次要區域的所有命名空間中的 Kubernetes Pod 狀態:
kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
- 主要和次要區域的 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/*
- 主區域的以下
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