您正在查看 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/*