Cassandra 疑難排解指南

本主題將說明如何排解及修正 Cassandra 資料儲存庫的問題。Cassandra 是永久性資料儲存庫,會在混合式執行階段架構cassandra 元件中執行。另請參閱「執行階段服務設定總覽」。

Cassandra pod 卡在待處理狀態

症狀

啟動時,Cassandra 會維持在「Pending」狀態。

錯誤訊息

使用 kubectl 查看 pod 狀態時,您會發現一或多個 Cassandra pod 卡在 Pending 狀態。Pending 狀態表示 Kubernetes 無法在節點上排定 Pod:無法建立 Pod。例如:

kubectl get pods -n namespace

NAME                                     READY   STATUS      RESTARTS   AGE
adah-resources-install-4762w             0/4     Completed   0          10m
apigee-cassandra-default-0               0/1     Pending     0          10m
...

可能的原因

Pod 卡在待處理狀態的原因有很多。例如:

原因 說明
資源不足 CPU 或記憶體不足,無法建立 Pod。
未建立磁碟區 Pod 正在等待建立永久磁碟區。
缺少 Amazon EBS CSI 驅動程式 未安裝必要的 Amazon EBS CSI 驅動程式。

診斷

使用 kubectl 說明 Pod,以判斷錯誤來源。例如:

kubectl -n namespace describe pods pod_name

例如:

kubectl describe pods apigee-cassandra-default-0 -n apigee

輸出內容可能會顯示下列其中一個可能的問題:

  • 如果問題是資源不足,您會看到警告訊息,指出 CPU 或記憶體不足。
  • 如果錯誤訊息指出 Pod 已解除繫結的即時 PersistentVolumeClaim (PVC),表示 Pod 無法建立其 永久磁碟區

解析度

資源不足

修改 Cassandra 節點集區,讓該集區具備足夠的 CPU 和記憶體資源。詳情請參閱「 調整節點集區大小」。

未建立永久磁碟區

如果您判斷為永久性磁碟問題,請說明 PersistentVolumeClaim (PVC),以便判斷為何無法建立:

  1. 列出叢集中的 PVC:
    kubectl -n namespace get pvc
    
    NAME                                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    cassandra-data-apigee-cassandra-default-0   Bound    pvc-b247faae-0a2b-11ea-867b-42010a80006e   10Gi       RWO            standard       15m
    ...
  2. 說明失敗 Pod 的 PVC。舉例來說,下列指令會說明與 Pod apigee-cassandra-default-0 繫結的 PVC:
    kubectl -n apigee describe pvc cassandra-data-apigee-cassandra-default-0
    
    Events:
      Type     Reason              Age                From                         Message
      ----     ------              ----               ----                         -------
      Warning  ProvisioningFailed  3m (x143 over 5h)  persistentvolume-controller  storageclass.storage.k8s.io "apigee-sc" not found

    請注意,在這個範例中,名為 apigee-sc 的 StorageClass 不存在。如要解決這個問題,請按照「 變更預設的 StorageClass」一節所述,在叢集中建立缺少的 StorageClass。

另請參閱「 偵錯 Pods」。

缺少 Amazon EBS CSI 驅動程式

如果混合型執行個體是在 EKS 叢集中執行,請確認 EKS 叢集使用 Amazon EBS 容器儲存空間介面 (CSI) 驅動程式。詳情請參閱 Amazon EBS CSI 遷移作業常見問題

Cassandra pod 卡在 CrashLoopBackoff 狀態

症狀

啟動時,Cassandra pod 會維持在 CrashLoopBackoff 狀態。

錯誤訊息

使用 kubectl 查看 Pod 狀態時,您會看到一或多個 Cassandra Pod 處於 CrashLoopBackoff 狀態。這個狀態表示 Kubernetes 無法建立 pod。例如:

kubectl get pods -n namespace

NAME                                     READY   STATUS            RESTARTS   AGE
adah-resources-install-4762w             0/4     Completed         0          10m
apigee-cassandra-default-0               0/1     CrashLoopBackoff  0          10m
...

可能的原因

Pod 卡在 CrashLoopBackoff 狀態的原因有很多種,例如:

原因 說明
資料中心與先前的資料中心不同 這則錯誤訊息表示 Cassandra Pod 具有持久性磁碟,其中含有先前叢集的資料,因此新 Pod 無法加入舊叢集。這通常是因為在同一個 Kubernetes 節點上,先前的 Cassandra 叢集中仍保留了過時的永久磁碟區。如果您在叢集中刪除 Cassandra 再重新建立,就可能發生這個問題。
找不到信任存放區目錄 這個錯誤表示 Cassandra pod 無法建立 TLS 連線。這通常是因為提供的金鑰和憑證無效、遺失或有其他問題。

診斷

查看 Cassandra 錯誤記錄,找出問題原因。

  1. 列出 Pod,取得發生錯誤的 Cassandra Pod ID:
    kubectl get pods -n namespace
  2. 查看失敗 Pod 的記錄:
    kubectl logs pod_id -n namespace

解析度

請在 Pod 的記錄中尋找下列線索:

資料中心與先前的資料中心不同

如果您看到以下記錄訊息:

Cannot start node if snitch's data center (us-east1) differs from previous data center
  • 檢查叢集中是否有任何過時或舊的 PVC,並予以刪除。
  • 如果這是全新安裝,請刪除所有 PVC,然後重新嘗試設定。例如:
    kubectl -n namespace get pvc
    kubectl -n namespace delete pvc cassandra-data-apigee-cassandra-default-0

找不到信任存放區目錄

如果您看到以下記錄訊息:

Caused by: java.io.FileNotFoundException: /apigee/cassandra/ssl/truststore.p12
(No such file or directory)

確認覆寫檔案中提供的金鑰和憑證是否正確無誤。例如:

cassandra:
  sslRootCAPath: path_to_root_ca-file
  sslCertPath: path-to-tls-cert-file
  sslKeyPath: path-to-tls-key-file

建立用於偵錯的用戶端容器

本節將說明如何建立用戶端容器,以便存取 Cassandra 偵錯公用程式,例如 cqlsh。這些公用程式可讓您查詢 Cassandra 資料表,並可用於偵錯。

建立用戶端容器

如要建立用戶端容器,請按照下列步驟操作:

  1. 容器會使用 apigee-cassandra-user-setup Pod 的 TLS 憑證。第一步是擷取這個憑證名稱:
    kubectl get secrets -n apigee --field-selector type=kubernetes.io/tls | grep apigee-cassandra-user-setup | awk '{print $1}'

    這個指令會傳回憑證名稱。例如:apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls

  2. 開啟新的檔案,並將下列 Pod 規格貼入其中:
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
      name: cassandra-client-name   # For example: my-cassandra-client
      namespace: apigee
    spec:
      containers:
      - name: cassandra-client-name
        image: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra-client:1.8.8"
        imagePullPolicy: Always
        command:
        - sleep
        - "3600"
        env:
        - name: CASSANDRA_SEEDS
          value: apigee-cassandra-default.apigee.svc.cluster.local
        - name: APIGEE_DML_USER
          valueFrom:
            secretKeyRef:
              key: dml.user
              name: apigee-datastore-default-creds
        - name: APIGEE_DML_PASSWORD
          valueFrom:
            secretKeyRef:
              key: dml.password
              name: apigee-datastore-default-creds
        volumeMounts:
        - mountPath: /opt/apigee/ssl
          name: tls-volume
          readOnly: true
      volumes:
      - name: tls-volume
        secret:
          defaultMode: 420
          secretName: your-secret-name    # For example: apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls
      restartPolicy: Never
  3. 請使用 .yaml 副檔名儲存檔案。例如:my-spec.yaml
  4. 將規格套用至叢集:
    kubectl apply -f your-spec-file.yaml -n apigee
  5. 登入容器:
    kubectl exec -n apigee cassandra-client -it -- bash
  6. 使用下列指令連線至 Cassandra cqlsh 介面。請輸入以下指令:
    cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --ssl

刪除用戶端 Pod

使用下列指令刪除 Cassandra 用戶端 Pod:

kubectl delete pods -n apigee cassandra-client

其他資源

請參閱「 Apigee 和 Apigee Hybrid 教戰手冊簡介」。