Panduan pemecahan masalah Cassandra

Topik ini membahas langkah-langkah yang dapat Anda ambil untuk memecahkan dan memperbaiki masalah dengan Cassandra. Cassandra adalah datastore persisten yang berjalan di komponen cassandra dari arsitektur runtime hybrid. Lihat juga Ringkasan konfigurasi layanan runtime.

Pod Cassandra berhenti dalam status Tertunda

Gejala

Saat dimulai, pod Cassandra tetap dalam status Tertunda.

Pesan error

Saat menggunakan kubectl untuk melihat status pod, Anda akan melihat bahwa ada satu atau beberapa Pod Cassandra terjebak dalam status Pending. Tujuan Status Pending menunjukkan bahwa Kubernetes tidak dapat menjadwalkan pod pada node: pod tidak dapat dibuat. Contoh:

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
...

Kemungkinan penyebab

Pod yang dalam status Tertunda dapat memiliki beberapa penyebab. Contoh:

Penyebab Deskripsi
Resource tidak cukup Tidak tersedia cukup CPU atau memori untuk membuat pod.
Volume tidak dibuat Pod menunggu volume persisten dibuat.

Diagnosis

Gunakan kubectl untuk mendeskripsikan pod guna menentukan sumber error. Contoh:

kubectl -n namespace describe pods pod_name

Contoh:

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

Output-nya mungkin menampilkan salah satu kemungkinan masalah berikut:

  • Jika sumber daya masalah tidak mencukupi, Anda akan melihat pesan Peringatan yang menunjukkan CPU atau memori yang tidak cukup.
  • Jika pesan error menunjukkan bahwa pod memiliki PersistentVolumeKlaim (PVC) langsung yang tidak terikat, berarti pod tidak dapat membuat Volume persisten.

Resolusi

Resource tidak cukup

Ubah kumpulan node Cassandra agar memiliki resource CPU dan memori yang memadai. Lihat Mengubah ukuran kumpulan node untuk mengetahui detailnya.

Volume persisten tidak dibuat

Jika Anda menemukan masalah volume persisten, jelaskan PersistentVolumeKlaim (PVC) untuk menentukan mengapa file tersebut tidak dibuat:

  1. Buat daftar PVC di cluster:
    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. Jelaskan PVC untuk pod yang gagal. Misalnya, perintah berikut menjelaskan PVC yang terikat ke pod apigee-cassandra-default-0:
    kubectl 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

    Perhatikan bahwa dalam contoh ini, StorageClass bernama apigee-sc tidak ada. Kepada mengatasi masalah ini, buat StorageClass yang hilang di cluster, seperti yang dijelaskan dalam Mengubah StorageClass default.

Lihat juga Melakukan Debug Pod.

Pod Cassandra terjebak dalam status CrashLoopBackoff

Gejala

Saat memulai, pod Cassandra tetap dalam status CrashLoopBackoff.

Pesan error

Saat menggunakan kubectl untuk melihat status pod, Anda akan melihat bahwa ada satu atau beberapa Pod Cassandra berada dalam status CrashLoopBackoff. Status ini menunjukkan bahwa Kubernetes tidak dapat membuat pod. Contoh:

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
...

Kemungkinan penyebab

Pod yang berada dalam status CrashLoopBackoff dapat memiliki beberapa penyebab. Contoh:

Penyebab Deskripsi
Pusat data berbeda dengan pusat data sebelumnya Error ini menunjukkan bahwa pod Cassandra memiliki volume persisten yang memiliki data dari tetapi Pod baru tidak dapat bergabung dengan cluster lama. Hal ini biasanya terjadi saat volume persisten yang sudah tidak berlaku tetap dari Cassandra sebelumnya cluster di node Kubernetes yang sama. Masalah ini dapat terjadi jika Anda menghapus dan membuat ulang Cassandra di gugus.
Direktori truststore tidak ditemukan Error ini menunjukkan bahwa pod Cassandra tidak dapat membuat koneksi TLS. Hal ini biasanya terjadi ketika kunci dan sertifikat yang disediakan tidak valid, hilang, atau memiliki permasalahan lainnya.

Diagnosis

Periksa log error Cassandra untuk menentukan penyebab masalah.

  1. Tampilkan daftar pod untuk mendapatkan ID pod Cassandra yang gagal:
    kubectl get pods -n namespace
  2. Periksa log pod yang gagal:
    kubectl logs pod_id -n namespace

Resolusi

Cari petunjuk berikut di log pod:

Pusat data berbeda dengan pusat data sebelumnya

Jika Anda melihat pesan log ini:

Cannot start node if snitch's data center (us-east1) differs from previous data center
  • Periksa apakah terdapat PVC yang usang atau usang di cluster, lalu hapus.
  • Jika ini adalah penginstalan baru, hapus semua PVC dan coba lagi penyiapannya. Contoh:
    kubectl -n namespace get pvc
    kubectl -n namespace delete pvc cassandra-data-apigee-cassandra-default-0

Direktori truststore tidak ditemukan

Jika Anda melihat pesan log ini:

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

Pastikan kunci dan sertifikat yang dicantumkan dalam file penggantian sudah benar dan valid. Misalnya:

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

Kegagalan node

Gejala

Saat memulai, pod Cassandra tetap dalam status Tertunda. Ini dapat mengindikasikan kegagalan {i>node<i} yang mendasarinya.

Diagnosis

  1. Tentukan pod Cassandra mana yang tidak berjalan:
    $ kubectl get pods -n your_namespace
        NAME                  READY   STATUS    RESTARTS   AGE
        cassandra-default-0   0/1     Pending   0          13s
        cassandra-default-1   1/1     Running   0          8d
        cassandra-default-2   1/1     Running   0          8d
  2. Periksa worker node. Jika instance tersebut berada dalam status NotReady, ini adalah node yang gagal:
    kubectl get nodes -n your_namespace
    NAME                                              STATUS   ROLES    AGE   VERSION            INTERNAL-IP
    gke-hybrid-cluster-apigee-data-178811f1-lv5j      Ready    <none>   34d   v1.21.5-gke.1302   10.138.15.198
    gke-hybrid-cluster-apigee-data-d63b8b8d-n41g      NotReady <none>   34d   v1.21.5-gke.1302   10.138.15.200
    gke-hybrid-cluster-apigee-data-ec752c0b-b1cr      Ready    <none>   34d   v1.21.5-gke.1302   10.138.15.199
    gke-hybrid-cluster-apigee-runtime-ba502ff4-57mq   Ready    <none>   34d   v1.21.5-gke.1302   10.138.15.204
    gke-hybrid-cluster-apigee-runtime-ba502ff4-hwkb   Ready    <none>   34d   v1.21.5-gke.1302   10.138.15.203
    gke-hybrid-cluster-apigee-runtime-bfa558e0-08vw   Ready    <none>   34d   v1.21.5-gke.1302   10.138.15.201
    gke-hybrid-cluster-apigee-runtime-bfa558e0-xvsc   Ready    <none>   34d   v1.21.5-gke.1302   10.138.15.202
    gke-hybrid-cluster-apigee-runtime-d12de7df-693w   Ready    <none>   34d   v1.21.5-gke.1302   10.138.15.241
    gke-hybrid-cluster-apigee-runtime-d12de7df-fn0w   Ready    <none>   34d   v1.21.5-gke.1302   10.138.15.206

Resolusi

  1. Hapus pod Cassandra yang mati dari cluster.
    $ kubectl exec -it apigee-cassandra-default-0 -- nodetool status
    $ kubectl exec -it apigee-cassandra-default-0 -- nodetool removenode deadnode_hostID
  2. Menghapus VolumeKlaim dari node mati untuk mencegah {i>Cassandra pod<i} mencoba untuk menemukan {i>node<i} yang mati karena dari afinitas:
    kubectl get pvc -n your_namespace
    kubectl delete pvc volumeClaim_name -n your_namespace
  3. Perbarui template volume dan buat PersistentVolume untuk node yang baru ditambahkan. Berikut adalah contoh template volume:
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: cassandra-data-3
    spec:
      capacity:
        storage: 100Gi
      accessModes:
      - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: local-storage
      local:
        path: /apigee/data
      nodeAffinity:
        "required":
          "nodeSelectorTerms":
          - "matchExpressions":
            - "key": "kubernetes.io/hostname"
              "operator": "In"
              "values": ["gke-hybrid-cluster-apigee-data-d63b8b8d-n41g"]
  4. Ganti nilai dengan nama host/IP baru dan terapkan template:
    kubectl apply -f volume-template.yaml

Membuat penampung klien untuk proses debug

Bagian ini menjelaskan cara membuat penampung klien yang dapat Anda akses Utilitas proses debug Cassandra seperti cqlsh. Utilitas ini memungkinkan Anda untuk melakukan kueri{i> <i}tabel Cassandra dan dapat berguna untuk tujuan proses debug.

Membuat penampung klien

Untuk membuat penampung klien, ikuti langkah-langkah berikut:

  1. Penampung menggunakan sertifikat TLS dari apigee-cassandra-user-setup pod. Langkah pertama adalah mengambil nama sertifikat ini:
    kubectl get secrets -n apigee --field-selector type=kubernetes.io/tls | grep apigee-cassandra-user-setup | awk '{print $1}'

    Perintah ini akan menampilkan nama sertifikat. Misalnya: apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls.

  2. Buka file baru dan tempelkan spesifikasi pod berikut ke dalamnya:
    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.7.6"
        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. Simpan file dengan ekstensi .yaml. Contoh: my-spec.yaml.
  4. Terapkan spesifikasi ke cluster Anda:
    kubectl apply -f your-spec-file.yaml -n apigee
  5. Login ke penampung:
    kubectl exec -n apigee cassandra-client -it -- bash
  6. Hubungkan ke antarmuka cqlsh Cassandra dengan perintah berikut. Masukkan perintah {i>command<i} persis seperti yang ditunjukkan:
    cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --ssl

Menghapus pod klien

Gunakan perintah ini untuk menghapus pod klien Cassandra:

kubectl delete pods -n apigee cassandra-client

Referensi lainnya

Lihat Pengantar playbook hybrid Apigee dan Apigee.