您目前查看的是 Apigee 和 Apigee Hybrid 說明文件。
查看
Apigee Edge 說明文件。
問題
使用者透過 Apigee 混合式使用者介面 (UI) 和 Management API,間歇性地觀察到 API 產品、應用程式、開發人員、鍵值對應 (KVM) 和快取等實體資料不一致或沒有資料。
錯誤訊息
據瞭解,這種情況不會顯示任何錯誤訊息。
可能原因
| 原因 | 說明 |
|---|---|
| Cassandra Pod 未連線至環狀拓撲 | 所有資料中心的 Cassandra Pod 可能不會連線至通用 Cassandra 環。 |
| 未執行 nodetool repair | nodetool repair 指令可能未定期執行。 |
| 網路連線問題 | 不同資料中心內的 Cassandra Pod 之間可能發生網路連線問題。 |
常見的診斷步驟
- 使用 Management API 擷取發生問題的一或多個實體 (例如 API 產品、應用程式等) 的資訊,並驗證多次呼叫時是否會看到不同的結果。
在指令列中,使用下列範例取得
gcloud驗證憑證、設定環境變數,以及執行 API 指令:取得 API 產品:
TOKEN=$(gcloud auth print-access-token) ORG=ORGANIZATION_NAME curl -i -H "Authorization: Bearer $TOKEN" \ "https://apigee.googleapis.com/v1/organizations/$ORG/apiproducts"
取得應用程式:
TOKEN=$(gcloud auth print-access-token) ORG=ORGANIZATION_NAME curl -i -H "Authorization: Bearer $TOKEN" \ "https://apigee.googleapis.com/v1/organizations/$ORG/apps"
取得開發人員:
TOKEN=$(gcloud auth print-access-token) ORG=ORGANIZATION_NAME curl -i -H "Authorization: Bearer $TOKEN" \ "https://apigee.googleapis.com/v1/organizations/$ORG/developers"
取得鍵值對應 (KVM):
TOKEN=$(gcloud auth print-access-token) ORG=ORGANIZATION_NAME curl -i -H "Authorization: Bearer $TOKEN" \ "https://apigee.googleapis.com/v1/organizations/$ORG/keyvaluemaps"
取得快取:
TOKEN=$(gcloud auth print-access-token) ORG=ORGANIZATION_NAME ENV=ENVIRONMENT_NAME curl -i -H "Authorization: Bearer $TOKEN" \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/caches"
- 如果執行上述 Management API 要求時沒有資料或資料不同,表示您遇到的問題與使用者介面相同。
原因:Cassandra Pod 未連線至所有資料中心的 Cassandra Pod
在多區域 Apigee Hybrid 部署作業中,如果所有 Cassandra Pod 未連線至同一個 Cassandra 環,資料可能不會由所有 Cassandra Pod 複製。因此,管理層不會持續收到相同查詢的相同資料集。請按照下列步驟分析這個情境:
診斷
- 列出 Cassandra pod:
- 執行下列指令,檢查每個資料中心的所有 Cassandra Pod 狀態。
Apigee Hybrid 版本低於 1.4.0:
# check cassandra cluster status kubectl -n apigee get pods \ -l app=apigee-cassandra \ --field-selector=status.phase=Running \ -o custom-columns=name:metadata.name --no-headers \ | xargs -I{} sh -c "echo {}; kubectl -n apigee exec {} -- nodetool status"
在 Apigee Hybrid 1.4.0 以上版本:
# check cassandra cluster status kubectl -n apigee get pods \ -l app=apigee-cassandra \ --field-selector=status.phase=Running \ -o custom-columns=name:metadata.name --no-headers \ | xargs -I{} sh -c "echo {}; kubectl -n apigee exec {} -- nodetool -u jmxuser -pw JMXUSER_PASSWORD status"
- 檢查上述指令的結果,確認所有資料中心的所有 Cassandra Pod 是否都已連線至 Cassandra 環,且處於「Up and Normal (UN)」狀態。
運作正常的 Cassandra 環狀拓撲輸出內容範例:
kubectl -n apigee get pods \ -l app=apigee-cassandra \ --field-selector=status.phase=Running \ -o custom-columns=name:metadata.name --no-headers \ | xargs -I{} sh -c "echo {}; kubectl -n apigee exec {} -- nodetool -u jmxuser -pw iloveapis123 status" apigee-cassandra-default-0 Datacenter: dc-1 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.0.2.18 1.32 MiB 256 100.0% 2e6051fe-e3ed-4858-aed0-ac9be5270e97 ra-1 UN 10.0.4.10 1.49 MiB 256 100.0% 2396e17f-94fd-4d7d-b55e-35f491a5c1cc ra-1 UN 10.0.3.14 1.38 MiB 256 100.0% 579cf76e-7d6d-46c8-8319-b7cd74ee87c8 ra-1 Datacenter: dc-2 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.8.1.12 1.31 MiB 256 100.0% 3e9f24bf-2c10-4cfd-8217-5be6245c2b9c ra-1 UN 10.8.2.19 1.24 MiB 256 100.0% 1d2e803d-aa31-487b-9503-1e18297efc04 ra-1 UN 10.8.4.4 1.28 MiB 256 100.0% d15ffeef-7929-42c2-a3b1-a3feb85a857b ra-1 apigee-cassandra-default-1 Datacenter: dc-1 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.0.2.18 1.32 MiB 256 100.0% 2e6051fe-e3ed-4858-aed0-ac9be5270e97 ra-1 UN 10.0.4.10 1.49 MiB 256 100.0% 2396e17f-94fd-4d7d-b55e-35f491a5c1cc ra-1 UN 10.0.3.14 1.38 MiB 256 100.0% 579cf76e-7d6d-46c8-8319-b7cd74ee87c8 ra-1 Datacenter: dc-2 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.8.1.12 1.31 MiB 256 100.0% 3e9f24bf-2c10-4cfd-8217-5be6245c2b9c ra-1 UN 10.8.2.19 1.24 MiB 256 100.0% 1d2e803d-aa31-487b-9503-1e18297efc04 ra-1 UN 10.8.4.4 1.28 MiB 256 100.0% d15ffeef-7929-42c2-a3b1-a3feb85a857b ra-1 apigee-cassandra-default-2 Datacenter: dc-1 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.0.2.18 1.32 MiB 256 100.0% 2e6051fe-e3ed-4858-aed0-ac9be5270e97 ra-1 UN 10.0.4.10 1.49 MiB 256 100.0% 2396e17f-94fd-4d7d-b55e-35f491a5c1cc ra-1 UN 10.0.3.14 1.38 MiB 256 100.0% 579cf76e-7d6d-46c8-8319-b7cd74ee87c8 ra-1 Datacenter: dc-2 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.8.1.12 1.31 MiB 256 100.0% 3e9f24bf-2c10-4cfd-8217-5be6245c2b9c ra-1 UN 10.8.2.19 1.24 MiB 256 100.0% 1d2e803d-aa31-487b-9503-1e18297efc04 ra-1 UN 10.8.4.4 1.28 MiB 256 100.0% d15ffeef-7929-42c2-a3b1-a3feb85a857b ra-1
Cassandra 環狀拓撲不正常的輸出內容範例:
kubectl -n apigee get pods \ -l app=apigee-cassandra \ --field-selector=status.phase=Running \ -o custom-columns=name:metadata.name --no-headers \ | xargs -I{} sh -c "echo {}; kubectl -n apigee exec {} -- nodetool -u jmxuser -pw iloveapis123 status" apigee-cassandra-default-0 Datacenter: dc-1 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.0.2.18 1.32 MiB 256 100.0% 2e6051fe-e3ed-4858-aed0-ac9be5270e97 ra-1 DL 10.0.4.10 1.49 MiB 256 100.0% 2396e17f-94fd-4d7d-b55e-35f491a5c1cc ra-1 DL 10.0.3.14 1.38 MiB 256 100.0% 579cf76e-7d6d-46c8-8319-b7cd74ee87c8 ra-1 Datacenter: dc-2 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.8.1.12 1.31 MiB 256 100.0% 3e9f24bf-2c10-4cfd-8217-5be6245c2b9c ra-1 UN 10.8.2.19 1.24 MiB 256 100.0% 1d2e803d-aa31-487b-9503-1e18297efc04 ra-1 DL 10.8.4.4 1.28 MiB 256 100.0% d15ffeef-7929-42c2-a3b1-a3feb85a857b ra-1 apigee-cassandra-default-1 Datacenter: dc-1 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.0.2.18 1.32 MiB 256 100.0% 2e6051fe-e3ed-4858-aed0-ac9be5270e97 ra-1 UN 10.0.4.10 1.49 MiB 256 100.0% 2396e17f-94fd-4d7d-b55e-35f491a5c1cc ra-1 UN 10.0.3.14 1.38 MiB 256 100.0% 579cf76e-7d6d-46c8-8319-b7cd74ee87c8 ra-1 Datacenter: dc-2 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.8.1.12 1.31 MiB 256 100.0% 3e9f24bf-2c10-4cfd-8217-5be6245c2b9c ra-1 UN 10.8.2.19 1.24 MiB 256 100.0% 1d2e803d-aa31-487b-9503-1e18297efc04 ra-1 UN 10.8.4.4 1.28 MiB 256 100.0% d15ffeef-7929-42c2-a3b1-a3feb85a857b ra-1 apigee-cassandra-default-2 Datacenter: dc-1 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.0.2.18 1.32 MiB 256 100.0% 2e6051fe-e3ed-4858-aed0-ac9be5270e97 ra-1 UN 10.0.4.10 1.49 MiB 256 100.0% 2396e17f-94fd-4d7d-b55e-35f491a5c1cc ra-1 UN 10.0.3.14 1.38 MiB 256 100.0% 579cf76e-7d6d-46c8-8319-b7cd74ee87c8 ra-1 Datacenter: dc-2 ================ Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.8.1.12 1.31 MiB 256 100.0% 3e9f24bf-2c10-4cfd-8217-5be6245c2b9c ra-1 UN 10.8.2.19 1.24 MiB 256 100.0% 1d2e803d-aa31-487b-9503-1e18297efc04 ra-1 UN 10.8.4.4 1.28 MiB 256 100.0% d15ffeef-7929-42c2-a3b1-a3feb85a857b ra-1
請注意,上述輸出內容中的部分 Cassandra Pod 處於 DL (Down and Leaving) 狀態。詳情請參閱 nodetool status。
- 如果發現任何 Cassandra Pod 處於 DL 狀態 (如上述範例輸出內容所示), 這就是造成這個問題的原因。
- 透過混合型使用者介面或 Management API 擷取任何實體資訊時,如果要求連線至任何已關閉的 Cassandra Pod,您將無法取得任何資料。
# list cassandra pods kubectl -n apigee get pods -l app=apigee-cassandra
解析度
請按照下一節的步驟操作,並確保有問題的資料中心內的 Cassandra Pod 已連線至原始資料中心,如「在 GKE 和 GKE On-Prem 上進行多區域部署 | Apigee」一文所述。
原因:未執行 nodetool repair
如果沒有定期執行 nodetool repair 指令做為維護工作,Cassandra Pod 可能會出現資料不一致的情況。請按照下列步驟分析這個情境:
診斷
- 建立 Cassandra 用戶端容器 Pod
apigee-hybrid-cassandra-client,以便進行偵錯。
- 列出所有 Cassandra Pod:
# list cassandra pods kubectl -n=apigee get pods -l app=apigee-cassandra
- 使用 CQLSH 連線至其中一個 Cassandra Pod:
cqlsh apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local -u ddl_user --ssl
- 清單
keyspaces:SELECT * from system_schema.keyspaces;
輸出內容範例:
ddl_user@cqlsh> SELECT keyspace_name from system_schema.keyspaces; keyspace_name ----------------------------- system_auth cache_PROJECT_ID_hybrid system_schema kms_PROJECT_ID_hybrid kvm_PROJECT_ID_hybrid rtc_PROJECT_ID_hybrid system_distributed system perses system_traces quota_PROJECT_ID_hybrid (11 rows)
- 從上述結果找出
keyspaces,然後使用 CQLSH 列出並查詢每個資料中心的所有實體。如果不一致的實體是 API 產品:
select * from KMS_KEYSPACE.api_product;
如果不一致的實體是應用程式 (
app):select * from KMS_KEYSPACE.app;
如果不一致的實體是
developer:select * from KMS_KEYSPACE.developer;
如果不一致的實體是鍵值對應:
select * from KVM_KEYSPACE.kvm_map_entry;
如果不一致的實體是
cache:select * from CACHE_KEYSPACE.cache_map_entry;
- 記下上述各項查詢輸出內容的記錄數。
- 針對所有資料中心中的每個 Cassandra Pod,重複上述步驟。
- 比較從所有 Cassandra Pod 取得的記錄計數。
- 找出資料不一致的 Cassandra Pod。
解析度
- 列出 Cassandra Pod,並連線至資料不一致的特定 Cassandra Pod:
# list cassandra pods kubectl -n=apigee get pods -l app=apigee-cassandra # connect to one cassandra pod kubectl -n=apigee exec -it apigee-cassandra-default-0 bash
- 在每個資料中心的每個 Cassandra Pod 上執行
nodetool repair指令:Apigee Hybrid 版本低於 1.4.0:
nodetool repair
在 Apigee Hybrid 1.4.0 以上版本:
nodetool -u JMX_USERNAME -pw JMX-PASSWORD repair
- 再次按照診斷專區的指示操作,確認資料是否已穩定複製到所有 Cassandra Pod。
- 針對資料不一致的所有 Cassandra Pod,重複上述步驟。
原因:網路連線問題
如果資料中心之間有網路連線問題,Cassandra 資料可能無法一致地複製到 Cassandra 環中的所有 Cassandra Pod。請按照下列步驟分析這個情境:
診斷
- 列出所有 Cassandra Pod:
# list cassandra pods kubectl -n=apigee get pods -l app=apigee-cassandra
- 執行下列
curl指令,並使用通訊埠7001,從第一個資料中心 (dc-1) 的第一個 Cassandra Pod,連線至第二個資料中心 (dc-2) 的第一個 Cassandra Pod:kubectl -n apigee exec -it apigee-cassandra-default-0 bash -- curl -v telnet://DC_2_APIGEE_CASSANDRA_DEFAULT_0_POD_IP:7001
- 如果 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)
- 否則,系統會顯示類似下列內容的錯誤:
* 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,表示防火牆可能設有限制,或是發生某種網路連線問題。
解析度
- 如果 Apigee Hybrid 部署作業是在 GKE 上進行,請檢查是否已設定任何防火牆規則,封鎖從一個資料中心到另一個資料中心的流量,並參閱「 虛擬私有雲防火牆規則總覽」分析網路連線問題。
- 如果這個 Apigee Hybrid 部署作業位於 GKE On-Prem,請與相關網路團隊合作,分析網路連線問題。
必須收集診斷資訊
如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊,然後與 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 dump:# 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/*