Panduan pemecahan masalah Cassandra

Anda sedang melihat dokumentasi Apigee dan Apigee Hybrid.
Tidak ada dokumentasi Apigee Edge yang setara untuk topik ini.

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

Pod Cassandra terjebak 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 satu atau beberapa pod Cassandra terjebak dalam status Pending. Status Pending menunjukkan bahwa Kubernetes tidak dapat menjadwalkan pod pada sebuah 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 terjebak dalam status Tertunda dapat memiliki beberapa penyebab. Contoh:

Penyebab Deskripsi
Resource tidak cukup CPU atau memori yang tersedia tidak cukup untuk membuat pod.
Volume tidak dibuat Pod menunggu volume persisten dibuat.
Driver CSI Amazon EBS tidak ada Untuk penginstalan EKS, driver Amazon EBS CSI yang diperlukan belum diinstal.

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 mungkin menampilkan salah satu kemungkinan masalah berikut:

  • Jika masalahnya tidak memiliki resource yang cukup, Anda akan melihat pesan Peringatan yang menunjukkan CPU atau memori tidak mencukupi.
  • Jika pesan error menunjukkan bahwa pod memiliki PersistentVolumeClaims (PVC) langsung yang tidak terikat, artinya pod tersebut tidak dapat membuat Volume persistennya.

Resolusi

Resource tidak cukup

Memodifikasi 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 menentukan masalah volume persisten, jelaskan PersistentVolumeClaim (PVC) untuk menentukan mengapa masalah tersebut tidak dibuat:

  1. Cantumkan PVC dalam 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. Sebagai contoh, perintah berikut menjelaskan PVC yang terikat pada 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. Untuk mengatasi masalah ini, buat StorageClass yang hilang di cluster, seperti yang dijelaskan dalam Mengubah StorageClass default.

Lihat juga Men-debug Pod.

Driver CSI Amazon EBS tidak ada

Jika instance hybrid berjalan di cluster EKS, pastikan cluster EKS menggunakan driver antarmuka penyimpanan container (CSI) Amazon EBS. Lihat pertanyaan umum (FAQ) terkait migrasi Amazon EBS CSI untuk mengetahui detailnya.

Pod Cassandra macet 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 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 terhenti di status CrashLoopBackoff dapat disebabkan oleh 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 cluster sebelumnya, dan pod baru tidak dapat bergabung dengan cluster lama. Hal ini biasanya terjadi ketika volume persisten yang sudah tidak berlaku tetap ada dari cluster Cassandra sebelumnya di node Kubernetes yang sama. Masalah ini dapat terjadi jika Anda menghapus dan membuat ulang Cassandra di cluster.
Upgrade Kubernetes Upgrade Kubernetes dapat memengaruhi cluster Cassandra. Hal ini dapat terjadi saat node worker Anthos yang menghosting pod Cassandra diupgrade ke versi OS baru.

Diagnosis

Periksa log error Cassandra untuk menentukan penyebab masalah.

  1. Buat 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 ada PVC yang usang atau lama di cluster dan hapus PVC tersebut.
  • Jika ini adalah penginstalan baru, hapus semua PVC dan coba penyiapan lagi. Contoh:
    kubectl -n NAMESPACE get pvc
    kubectl -n NAMESPACE delete pvc cassandra-data-apigee-cassandra-default-0

Upgrade Anthos mengubah setelan keamanan

Periksa log Cassandra untuk melihat pesan error ini:

/opt/apigee/run.sh: line 68: ulimit: max locked memory: 
  cannot modify limit: Operation not permitted

Membuat penampung klien untuk proses debug

Bagian ini menjelaskan cara membuat penampung klien tempat Anda dapat mengakses utilitas proses debug Cassandra seperti cqlsh. Utilitas ini memungkinkan Anda membuat kueri tabel Cassandra dan dapat berguna untuk tujuan proses debug.

Membuat penampung klien

Untuk membuat penampung klien, ikuti langkah-langkah berikut:

  1. Penampung harus menggunakan sertifikat TLS dari pod apigee-cassandra-user-setup. ID ini disimpan sebagai rahasia Kubernetes. Ambil nama rahasia yang menyimpan 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 rahasia. Misalnya: apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls. Anda akan menggunakannya di bawah ini di kolom secretName dalam file YAML.

  2. Buka file baru dan tempel 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:YOUR_APIGEE_HYBRID_VERSION" # For example, 1.10.4.
        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_NAME -it -- bash
  6. Hubungkan ke antarmuka cqlsh Cassandra dengan perintah berikut. Masukkan perintah persis seperti yang ditunjukkan:
    cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --ssl

Menghapus pod klien

Gunakan perintah berikut untuk menghapus pod klien Cassandra:

kubectl delete pods -n apigee cassandra-client

Perluasan region yang salah dikonfigurasi: semua node Cassandra di dalam satu pusat data

Situasi ini terjadi pada ekspansi multi-region di platform GKE dan GKE lokal (Anthos). Jangan mencoba membuat semua node Cassandra di pusat data yang sama.

Gejala

Node Cassandra gagal dibuat di pusat data untuk region kedua.

Pesan Kesalahan

failed to rebuild from dc-1: java.lang.RuntimeException : Error while rebuilding node: Stream failed

Resolusi

Perbaiki perluasan wilayah yang salah dikonfigurasi dengan mengikuti langkah-langkah berikut:

  1. Update replicaCount Cassandra ke 1 dalam file overrides.yaml untuk pusat data kedua. Contoh:
    cassandra:
      . . .
      replicaCount: 1

    Terapkan setelan dengan apigeectl apply:

    $APIGEECTL_HOME/apigeectl apply -f 2ND_DATACENTER_OVERRIDES.yaml
  2. Gunakan kubectl exec untuk mengakses pod Cassandra yang tersisa dengan perintah berikut:
    kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
  3. Hentikan pod Cassandra yang tersisa dengan perintah berikut:
    nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD decommission
  4. Hapus pod Cassandra dari pusat data kedua menggunakan apigeectl delete dengan argumen --datastore. Contoh:
    $APIGEECTL_HOME/apigeectl delete -f 2ND_DATACENTER_OVERRIDES.yaml --datastore
  5. Ubah konteks Kubernetes ke cluster untuk pusat data pertama Anda:
    kubectl config use-context FIRST_DATACENTER_CLUSTER
  6. Pastikan tidak ada node Cassandra dalam status down di pusat data pertama.
    nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status
  7. Pastikan node Cassandra yang salah dikonfigurasi (ditujukan untuk pusat data kedua) telah dihapus dari pusat data pertama. Pastikan alamat IP yang ditampilkan di output status nodetool hanya merupakan alamat IP untuk pod Cassandra yang ditujukan untuk pusat data pertama Anda. Misalnya, dalam output berikut, alamat IP 10.100.0.39 seharusnya untuk pod di pusat data pertama Anda.
    kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
    nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status
    
      Datacenter: dc-1
      ================
      Status=U/D (Up/Down) | State=N/L/J/M (Normal/Leaving/Joining/Moving)
      --  Address      Load      Tokens  Owns (effective)  Host ID                               Rack
      UN  10.100.0.39  4.21 MiB  256     100.0%            a0b1c2d3-e4f5-6a7b-8c9d-0e1f2a3b4c5d  ra-1
  8. Pastikan file overrides.yaml untuk pusat data kedua berisi setelan nama pusat data di bagian cassandra. Contoh:
    cassandra:
      datacenter: DATA_CENTER_2
      rack: "RACK_NAME" # "ra-1" is the default value.
      . . .
  9. Perbarui setelan cassandra:replicaCount di file overrides.yaml untuk pusat data kedua ke angka yang diinginkan. Contoh:
    cassandra:
      datacenter: DATA_CENTER_2
      . . .
      replicaCount: 3
  10. Terapkan file overrides.yaml untuk pusat data kedua dengan argumen --datastore. Contoh:
    $APIGEECTL_HOME/apigeectl apply -f 2ND_DATACENTER_OVERRIDES.yaml --datastore
  11. Gunakan kubectl exec untuk mengakses salah satu pod Cassandra baru di pusat data kedua dan memverifikasi bahwa ada dua pusat data:
     "nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status"

Referensi lainnya

Lihat Pengantar playbook hybrid Apigee X dan Apigee.