您正在查看 Apigee 和 Apigee Hybrid 說明文件。
    查看 
    Apigee Edge 說明文件。
問題
使用者在 Apigee 混合型使用者介面 (UI) 和 Management API 中,間歇性地發現實體 (例如 API 產品、應用程式、開發人員、鍵值對應 (KVM) 和快取) 的資料不一致或找不到。
錯誤訊息
在這種情況下,系統不會顯示任何錯誤訊息。
可能原因
| 原因 | 說明 | 
|---|---|
| Cassandra pod 未連線至環 | 所有資料中心的 Cassandra 吊掛叢集可能不會連線至常見的 Cassandra 環。 | 
| 未執行 nodetool 修復作業 | nodetool repair指令可能未定期執行。 | 
| 網路連線問題 | 不同資料中心的 Cassandra 吊掛叢集之間可能會發生網路連線問題。 | 
常見的診斷步驟
- 使用 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 要求時沒有看到任何資料或看到不同的資料,表示您觀察到的情況與 UI 相同。
原因:Cassandra pod 未連線至所有資料中心的 Cassandra pod
在多區域 Apigee 混合部署中,如果所有 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 容器是否已連線至 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 狀態。 - 如果您發現任何 Cassandra 集合節點處於 DL 狀態 (如上方範例輸出內容所示),那就是這個問題的原因。
- 透過混合型 UI 或 Management API 要求擷取任何實體的資訊時,如果要求命中任何已關閉的 Cassandra Pod,就不會取得任何資料。
 
# list cassandra pods kubectl -n apigee get pods -l app=apigee-cassandra
解決方法
請按照下文所述步驟操作,確保有問題的資料中心中的 Cassandra Pod 已連線至原始資料中心,詳情請參閱「GKE 和 GKE 內部部署的多區域部署作業 | Apigee」。
原因:未執行 nodetool 修復作業
    如果未定期執行 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 容器: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 容器重複上述步驟。
- 比較從所有 Cassandra 容器取得的記錄計數。
- 找出資料不一致的 Cassandra Pod。
解決方法
- 列出 Cassandra 容器,並連線至資料不一致的特定 Cassandra 容器:# 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 容器,再透過該容器連線至第二個資料中心 (dc-2) 的第一個 Cassandra 容器: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 混合式部署是在 GKE 上執行,請檢查是否設定了任何防火牆規則,以便封鎖從一個資料中心傳送至另一個資料中心的流量,並參閱 VPC 防火牆規則總覽,分析網路連線問題。
- 如果這個 Apigee 混合式部署作業是在 GKE 地端上執行,請與相關網路團隊合作,並分析網路連線問題。
必須收集診斷資訊
如果問題在按照上述操作說明後仍未解決,請收集下列診斷資訊,然後與 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/*