您正在查看 Apigee 和 Apigee Hybrid 說明文件。
這個主題沒有對應的
Apigee Edge 說明文件。
問題
在 Apigee hybrid 中還原 Cassandra 時,您可能會在 還原記錄中遇到錯誤。
錯誤訊息
您在記錄中看到下列其中一則訊息:
java.net.ConnectException: Connection timed out (Connection timed out)
/tmp/tmp/schema.cql:662:OperationTimedOut: errors={'10.0.0.1': 'Client request timeout. See Session.execute[_async](timeout)'}, last_host=10.0.0.1
/tmp/tmp/schema.cql:6409:AlreadyExists: Table 'kvm_myorg.kvm_map_keys_descriptor' already exists
可能原因
原因 | 說明 | 適用於以下裝置的疑難排解操作說明: |
---|---|---|
連線逾時 |
這個錯誤是 apigee-cassandra-restore 和 apigee-cassandra-default-* Pod 之間的連線錯誤。 |
Apigee Hybrid |
作業逾時 | 如果還原作業在 15 分鐘後逾時,就會發生這個錯誤。 | Apigee Hybrid |
已存在 | 這個錯誤訊息與問題原因無關,是還原作業重試作業的結果。 | Apigee Hybrid |
原因:連線逾時
以下錯誤是 apigee-cassandra-restore
和 apigee-cassandra-default-*
Pod 之間的連線錯誤:
java.net.ConnectException: Connection timed out (Connection timed out)
診斷
-
如果主機網路無法從 Pod 網路存取,請確認
hostNetwork
已設為false
,如 從備份還原區域所示,該值應位於overrides.yaml
的cassandra
下方。 -
如要測試連線功能,請登入
apigee-mart
或apigee-runtime
pod,該 pod 與apigee-cassandra-restore
工作位於相同的網路中。您也可以使用 pod 網路中的任何其他 pod。-
取得
apigee-mart
Pod 的名稱:kubectl -n apigee get po --selector=app=apigee-mart --no-headers -o custom-columns=":metadata.name"
-
在 mart pod 中執行 Bash 工作階段:
kubectl exec -it MART_POD_NAME -n apigee -- bash
將 MART_POD_NAME 替換為 MART 容器的名稱。例如:
apigee-mart-myorg--9a8228a-191-t0xh1-qz5fl
。 -
針對 Cassandra 連接埠執行連線測試:
curl -v -m 5 telnet://apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local:9042
curl -v -m 5 telnet://apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local:7001
如果輸出內容中出現
Connection timed out
錯誤,表示您有連線問題。不過,如果您看到Connected to
訊息,表示連線成功,您需要按下 Ctrl + C 鍵來關閉連線並繼續操作。 -
取得
解決方法
請確認用於還原的 overrides.yaml
檔案中,HostNetwork
設定已設為 false
,然後
重複還原程序。如果設定已設為 false
,但您看到連線錯誤,請使用下列指令確認 Cassandra 容器已啟動並運作:
kubectl get pods -n apigee -l app=apigee-cassandra
輸出內容應如以下示例:
NAME READY STATUS RESTARTS AGE apigee-cassandra-default-0 1/1 Running 0 14m apigee-cassandra-default-1 1/1 Running 0 13m apigee-cassandra-default-2 1/1 Running 0 11m exampleuser@example hybrid-files %
原因:作業逾時
如果還原作業在 15 分鐘後逾時,就會發生下列錯誤。這個錯誤表示 I/O 問題,例如儲存空間和網路無法及時傳送未壓縮的備份內容。
/tmp/tmp/schema.cql:662:OperationTimedOut: errors={'10.0.0.1': 'Client request timeout. See Session.execute[_async](timeout)'}, last_host=10.0.0.1
診斷
-
查看
apigee-cassandra-default-0
記錄,記下還原作業開始的時間戳記:kubectl logs apigee-cassandra-default-0 -n apigee | grep 'MigrationManager.java' | head -n 1
-
請將時間戳記與建立資料表的最新記錄進行比較:
kubectl logs apigee-cassandra-default-0 -n apigee | grep 'Create new table' | tail -n 1
這項比較的結果應會顯示,在超時後,Cassandra pod 仍在建立資料表的過程中。
-
使用下列指令測試儲存空間頻寬:
kubectl -n apigee exec -it apigee-cassandra-default-0 -- bash -c 'dd if=/dev/zero of=/opt/apigee/data/test.img bs=200M count=1 ; rm /opt/apigee/data/test.img'
kubectl -n apigee exec -it apigee-cassandra-default-1 -- bash -c 'dd if=/dev/zero of=/opt/apigee/data/test.img bs=200M count=1 ; rm /opt/apigee/data/test.img'
kubectl -n apigee exec -it apigee-cassandra-default-2 -- bash -c 'dd if=/dev/zero of=/opt/apigee/data/test.img bs=200M count=1 ; rm /opt/apigee/data/test.img'
如果寫入速度低於 100 M/s,可能表示未使用適當的 StorageClass (SSD)。
-
測試網路頻寬:
-
在 Cassandra pod 上執行
netcat
,以便監聽通訊埠:kubectl -n apigee exec -it apigee-cassandra-default-0 -- bash -c 'nc -l -p 3456 > /dev/null'
-
在另一個 Shell 工作階段中,取得
apigee-mart
pod 的名稱:kubectl -n apigee get po --selector=app=apigee-mart --no-headers -o custom-columns=":metadata.name"
-
在
apigee-mart
Pod 中執行 Bash 工作階段。您也可以使用 Pod 網路中的任何其他 Pod:kubectl exec -it MART_POD_NAME -n apigee -- bash
將 MART_POD_NAME 替換為 MART 容器的名稱。例如:
apigee-mart-myorg--9a8228a-191-t0xh1-qz5fl
。 -
針對仍在執行
netcat
的 Cassandra pod 執行網路頻寬測試:dd if=/dev/zero bs=50M count=1 | nc apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local 3456
您可以針對其他 Cassandra Pod 重複執行上述步驟。如果產生的速度低於 10M/s,問題很可能是網路頻寬造成的。
-
解決方法
在確認 I/O 速度緩慢後,請確保叢集符合最低 網路和 儲存空間需求。之後再再次測試頻寬。
原因:已存在
診斷
您會看到類似以下的錯誤訊息:
/tmp/tmp/schema.cql:6409:AlreadyExists: Table 'kvm_myorg.kvm_map_keys_descriptor' already exists
解決方法
這個錯誤訊息與問題原因無關,是還原作業的重試作業結果。實際的錯誤訊息應顯示在第一個失敗 Pod 的記錄中。
取得初始失敗的記錄,以便診斷問題。
如果問題仍未解決,請參閱「必須收集診斷資訊」一文。
已知問題 391861216 的解決方法
診斷
還原後,編號最高的 Cassandra Pod 會處於 CrashLoopBackoff
狀態。這可能是已知問題 391861216 所造成。
您會在 Cassandra pod 記錄中看到類似以下的錯誤訊息:
Cannot change the number of tokens from 512 to 256
解決方法
請按照下列步驟解決潛在問題。這樣一來,Cassandra 就能在保留資料的同時正常啟動。
-
開始刪除卡在
CrashLoopBackoff
狀態的 Cassandra pod 的 PVC。將 POD_NAME 設為CrashLoopBackoff
狀態中的 pod 名稱。將 APIGEE_NAMESPACE 設為 Apigee 安裝所在叢集的命名空間。kubectl delete pvc cassandra-data-POD_NAME -n APIGEE_NAMESPACE --wait=false
-
刪除處於
CrashLoopBackoff
狀態的 Pod。kubectl delete pod POD_NAME -n APIGEE_NAMESPACE
-
手動將 Cassandra 的種子主機變更為編號最高的 Pod。舉例來說,如果您有三個複本,SEED_POD_NAME 應為
apigee-cassandra-default-2
。這項步驟只需進行一次,後續 Pod 可以略過。kubectl patch apigeeds/default -n APIGEE_NAMESPACE --type='merge' -p '{"spec": {"components": {"cassandra": {"properties": {"externalSeedHost":"SEED_POD_NAME.apigee-cassandra-default.APIGEE_NAMESPACE.svc.cluster.local"}}}}}'
-
從 Cassandra 環中移除含有 512 個符記的節點。
kubectl exec -n APIGEE_NAMESPACE -t sts/apigee-cassandra-default -c apigee-cassandra -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status' | awk '/^DN .*\?.* 512 / {print $6; exit}; /^DN .* [KMG]iB.* 512 / {print $7; exit}' | xargs -I {} kubectl exec -n APIGEE_NAMESPACE -t sts/apigee-cassandra-default -c apigee-cassandra -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD removenode {}'
-
請等待 Cassandra pod 復原,可能需要重新啟動不只一次,並達到
2/2
的Ready
狀態。接著,下一個最高的 pod 就會進入CrashLoopBackoff
狀態。kubectl get pods -n APIGEE_NAMESPACE -l app=apigee-cassandra -w
-
更新 POD_NAME,然後逐一對剩餘的 Pod 重複上述步驟,直到所有 Pod 都進入
CrashLoopBackoff
狀態,並且具有Running
狀態為止。Ready
2/2
-
確認所有 Pod 已成功加入 Cassandra 環。
kubectl exec -n APIGEE_NAMESPACE -t sts/apigee-cassandra-default -c apigee-cassandra -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status'
所有 Cassandra 節點都應具有
UN
狀態和 256 個符記。 -
將變更還原為 Cassandra 的種子主機。
kubectl patch apigeeds/default -n APIGEE_NAMESPACE --type='merge' -p '{"spec": {"components": {"cassandra": {"properties": {"externalSeedHost":""}}}}}'
Apigee Datastore 控制器會將種子主機變更還原,並再次重新啟動 Cassandra 吊掛叢集。
必須收集診斷資訊
如果問題在您按照上述操作說明後仍未解決,請收集下列診斷資訊,然後與 Google Cloud Customer Care 聯絡:
-
除了可能需要提供的一般資料之外,請使用下列指令從所有 Cassandra Pod 收集診斷資料:
for p in $(kubectl -n apigee get pods -l app=apigee-cassandra --no-headers -o custom-columns=":metadata.name") ; do \ for com in info describecluster failuredetector version status ring info gossipinfo compactionstats tpstats netstats cfstats proxyhistograms gcstats ; do kubectl \ -n apigee exec ${p} -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD '"$com"' 2>&1 '\ | tee /tmp/k_cassandra_nodetool_${com}_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt | head -n 40 ; echo '...' ; done; done
-
請壓縮檔案,並在客服案件中提供:
tar -cvzf /tmp/cassandra_data_$(date +%Y.%m.%d_%H.%M.%S).tar.gz /tmp/k_cassandra_nodetool*
- 收集並提供 restore Pod 中的記錄。請注意,記錄檔的生命週期很短,因此應在失敗後立即收集。
- 如果您已按照上述診斷步驟收集所有主控台輸出內容,請將這些內容複製到檔案中,然後將檔案附加到支援案件。