Panduan pemecahan masalah Cassandra

Anda sedang melihat dokumentasi Apigee dan Apigee hybrid.
Tidak ada padanan Dokumentasi Apigee Edge untuk topik ini.

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 terjebak dalam status Rilis

Gejala

Setelah mencoba melakukan update pada pod Cassandra, datastore kemudian melaporkan bahwa ia terjebak dalam status pelepasan.

Pesan error

Ketika menggunakan kubectl untuk melihat status pod, Anda akan melihat salah satunya atau lebih pod Cassandra terjebak dalam status rilis:

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Ack 57s (x7 over 24h) apigee-datastore release started

Kemungkinan penyebab

Pod yang terhenti dalam status rilis dapat disebabkan oleh hal berikut:

Penyebab Deskripsi
Perubahan kapasitas penyimpanan Langkah-langkah dijalankan untuk mengubah kapasitas penyimpanan File override.yaml.
Perubahan Konfigurasi lainnya Pembaruan dilakukan pada properti cassandra di File override.yaml; Namun, perubahan itu tidak pengaruh tersebut.

Perubahan kapasitas penyimpanan

Diagnosis

  1. Gunakan kubectl untuk melihat status apigee saat ini pod datastore:
    kubectl get apigeeds -n apigee
    NAME STATE AGE
    default releasing 122d
  2. Periksa apakah ada perubahan pada override.yaml file:
    1. Dengan menggunakan sistem kontrol versi, bandingkan versi sebelumnya dari File override.yaml dengan versi saat ini:
      diff OVERRIDES_BEFORE.yaml OVERRIDES_AFTER.yaml
    2. Output perbedaan dalam override.yaml dapat menampilkan masalah yang mungkin terjadi dengan ukuran kapasitas penyimpanan. Contoh:
      # Overrides.yaml  before:
      cassandra:
         storage:
            capacity: 500Gi
      
      # Overrides.yaml after:
      cassandra:
         storage:
            capacity: 100Gi

      Jika ada operasi untuk mengubah kapasitas penyimpanan di mana langkah-langkah yang dilewati, dan override.yaml diterapkan secara langsung, ini dapat menyebabkan datastore dalam status rilis.

  3. Periksa statefulset untuk memastikan ada perangkat untuk apigee-cassandra-default:
    kubectl describe sts -n apigee

    Output-nya akan terlihat seperti ini:

    Name:               apigee-cassandra-default
    Namespace:          apigee
    CreationTimestamp:  Tue, 18 Jul 2023 00:40:57 +0000
    Selector:           app=apigee-cassandra,name=default
    Labels:             apigee.cloud.google.com.revision=v1-2cc098050836c6b4
                        apigee.cloud.google.com.version=v1
                        apigee.cloud.google.com/platform=apigee
                        app=apigee-cassandra
                        name=default
    Annotations:        <none>
    Replicas:           3 desired | 3 total
    Update Strategy:    RollingUpdate
      Partition:        0
    Pods Status:        3 Running / 0 Waiting / 0 Succeeded / 0 Failed
    Pod Template:
      Labels:       apigee.cloud.google.com/apigee_servicename=production
                    apigee.cloud.google.com/billing_type=subscription
                    apigee.cloud.google.com/platform=apigee
                    app=apigee-cassandra
                    name=default
                    revision=v1
                    runtime_type=hybrid
      Annotations:  apigee.cloud.google.com/pod-template-spec-hash: 2cc098050836c6b4
                    prometheus.io/path: /metrics
                    prometheus.io/port: 7070
                    prometheus.io/scheme: https
                    prometheus.io/scrape: true
      Containers:
       apigee-cassandra:
        Image:       gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra:1.10.1
        Ports:       7000/TCP, 7001/TCP, 7199/TCP, 9042/TCP, 8778/TCP
        Host Ports:  7000/TCP, 7001/TCP, 7199/TCP, 9042/TCP, 8778/TCP
        Requests:
          cpu:      500m
          memory:   1Gi
        Readiness:  exec [/bin/bash -c /opt/apigee/ready-probe.sh] delay=0s timeout=5s period=10s #success=1 #failure=2
        Environment:
          POD_NAME:                  (v1:metadata.name)
          POD_IP:                    (v1:status.podIP)
          MAX_HEAP_SIZE:            512M
          HEAP_NEWSIZE:             100M
          CASSANDRA_SEEDS:          apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local
          CASSANDRA_CLUSTER_NAME:   apigeecluster
          CASSANDRA_DC:             dc-1
          CASSANDRA_RACK:           ra-1
          CASSANDRA_OPEN_JMX:       true
          CPS_ADMIN_USER:           <set to the key 'admin.user' in secret 'apigee-datastore-default-creds'>        Optional: false
          CPS_ADMIN_PASSWORD:       <set to the key 'admin.password' in secret 'apigee-datastore-default-creds'>    Optional: false
          APIGEE_JMX_USER:          <set to the key 'jmx.user' in secret 'apigee-datastore-default-creds'>          Optional: false
          APIGEE_JMX_PASSWORD:      <set to the key 'jmx.password' in secret 'apigee-datastore-default-creds'>      Optional: false
          CASS_PASSWORD:            <set to the key 'default.password' in secret 'apigee-datastore-default-creds'>  Optional: false
          APIGEE_JOLOKIA_USER:      <set to the key 'jolokia.user' in secret 'apigee-datastore-default-creds'>      Optional: false
          APIGEE_JOLOKIA_PASSWORD:  <set to the key 'jolokia.password' in secret 'apigee-datastore-default-creds'>  Optional: false
        Mounts:
          /opt/apigee/apigee-cassandra/conf from appsfs (rw)
          /opt/apigee/customer from cwc-volume (ro)
          /opt/apigee/data from cassandra-data (rw)
          /opt/apigee/ssl from tls-volume (ro)
          /var/secrets/google from apigee-cassandra-backup (rw)
          /var/secrets/keys from apigee-cassandra-backup-key-file (rw)
      Volumes:
       cwc-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  config-cassandra-default
        Optional:    false
       tls-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  apigee-cassandra-default-tls
        Optional:    false
       appsfs:
        Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
        Medium:
        SizeLimit:  <unset>
       apigee-cassandra-backup:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  apigee-cassandra-backup-svc-account
        Optional:    true
       apigee-cassandra-backup-key-file:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  apigee-cassandra-backup-key-file
        Optional:    true
    Volume Claims:
      Name:          cassandra-data
      StorageClass:
      Labels:        <none>
      Annotations:   <none>
      Capacity:      10Gi
      Access Modes:  [ReadWriteOnce]
    Events:
      Type    Reason            Age   From                    Message
      ----    ------            ----  ----                    -------
      Normal  SuccessfulCreate  47m   statefulset-controller  create Pod apigee-cassandra-default-2 in StatefulSet apigee-cassandra-default successful
  4. Periksa apakah ada error di pengontrol apigee:
    kubectl logs -f apigee-controller-manager-59cf595c77-wtwnr -n apigee-system -c manager | grep apigeedatastore
    

    Hasil:

    "error creating
    apigee-cassandra object: failed to update resource
    apigee/apigee-cassandra-default: StatefulSet.apps \"apigee-cassandra-default\"
    is invalid: spec: Forbidden: updates to statefulset spec for fields other than
    'replicas', 'template', 'updateStrategy', 'persistentVolumeClaimRetentionPolicy'
    and 'minReadySeconds' are forbiddenerror creating apigee-cassandra object:
    failed to update resource apigee/apigee-cassandra-default: StatefulSet.apps
    \"apigee-cassandra-default\" is invalid: spec: Forbidden: updates to statefulset
    spec for fields other than 'replicas', 'template', 'updateStrategy',
    'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden"

Resolusi

Status untuk Cassandra dapat direset menggunakan langkah-langkah berikut untuk mendapatkannya kembali ke status berjalan:

  1. Nonaktifkan apigee-controller:
    kubectl -n apigee-system edit deployments and set --enable-controllers=true to --enable-controllers=false
    
  2. Tampilkan datastore ke kondisi berjalan menggunakan perintah PATCH:
    curl -XPATCH \-H "Accept: application/json" -H "Content-Type: application/json-patch+json" --data '[{"op": "replace", "path": "/status/nestedState", "value": ""},{"op": "replace", "path": "/status/state", "value": "running"}]' 'http://127.0.0.1:8001/apis/apigee.cloud.google.com/v1alpha1/namespaces/apigee/apigeedatastores/default/status'
    
  3. Terapkan ulang file override.yaml asli:
    ./apigeectl apply --datastore -f overrides.yaml
    
  4. Mengaktifkan apigee-controller:
    kubectl -n apigee-system edit deployments and set --enable-controllers=false to --enable-controllers=true
    
  5. Tunggu hingga datastore kembali dan melakukan validasi menggunakan kode berikut:
    kubectl get apigeeds --namespace apigee
    
  6. Validasi deployment dan pod Apigee dalam status running, serta apigeeds tidak lagi dalam status rilis:
    kubectl get ad -n apigee
    
    kubectl get pods -n apigee
    
    kubectl get apigeeds -n apigee
    
    NAME      STATE     AGE
    default   running   24d

Perubahan konfigurasi lainnya

Pembaruan dilakukan pada properti cassandra di override.yaml dan perubahan tidak diterapkan. Hal ini dapat berupa perubahan sandi, atau perubahan resource di override.yaml. Atau, Anda keliru menerapkan override.yaml yang salah ke cluster.

Diagnosis

Lihat langkah-langkah pada Diagnosis.

Resolusi

Lihat langkah-langkah dalam Penyelesaian.

Harus mengumpulkan informasi diagnostik

Jika masalah berlanjut bahkan setelah mengikuti instruksi di atas, kumpulkan informasi diagnostik berikut, lalu hubungi Google Cloud Customer Care:

  • Overrides.yaml untuk setiap cluster dalam penginstalan.
  • Dump info cluster kubernetes dari penginstalan Hybrid:

    Buat cluster-info dump kubernetes:

    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    

    Kompresi menggunakan zip kubernetes cluster-info dump:

    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*
    

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.
Driver Amazon EBS CSI tidak ada Untuk penginstalan EKS, driver Amazon EBS CSI yang diperlukan tidak 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-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.

Driver Amazon EBS CSI tidak ada

Jika instance hybrid berjalan pada cluster EKS, pastikan cluster EKS menggunakan Driver Amazon EBS container storage interface (CSI). Lihat Pertanyaan umum (FAQ) terkait migrasi Amazon EBS CSI untuk mengetahui detailnya.

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.
Upgrade Kubernetes Upgrade Kubernetes dapat memengaruhi cluster Cassandra. Hal ini dapat terjadi saat worker Anthos node yang menghosting pod Cassandra diupgrade ke versi OS baru.

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

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 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 harus menggunakan sertifikat TLS dari apigee-cassandra-user-setup pod. Data ini disimpan sebagai secret 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 menggunakan ini di bawah pada kolom secretName dalam file YAML.

  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:YOUR_APIGEE_HYBRID_VERSION" # For example, 1.10.5.
        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 {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

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

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

Gejala

Node Cassandra gagal dibuat di pusat data untuk region kedua.

Pesan Error

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. Perbarui Cassandra replicaCount menjadi 1 di 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. Nonaktifkan 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 Anda ke cluster untuk pusat data pertama Anda:
    kubectl config use-context FIRST_DATACENTER_CLUSTER
  6. Pastikan tidak ada node Cassandra dalam status nonaktif di pusat data pertama.
    nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status
  7. Pastikan {i>node<i} Cassandra yang salah dikonfigurasi (ditujukan untuk pusat data kedua) telah dihapus dari pusat data pertama. Pastikan alamat IP yang ditampilkan di output status nodetool hanyalah alamat IP untuk pod Cassandra yang ditujukan untuk pusat data pertama. Misalnya, dalam output berikut, alamat IP 10.100.0.39 harus 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 bawah bagian {i>cassandra<i}. 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 jumlah yang diinginkan. Contoh:
    cassandra:
      datacenter: DATA_CENTER_2
      . . .
      replicaCount: 3
  10. Terapkan file overrides.yaml untuk pusat data kedua dengan --datastore argumen. Contoh:
    $APIGEECTL_HOME/apigeectl apply -f 2ND_DATACENTER_OVERRIDES.yaml --datastore
  11. Gunakan kubectl exec untuk mengakses salah satu pod Cassandra baru pada detik pusat data dan memverifikasi ada dua pusat data:
     "nodetool -u CASSANDRA_DB_USER -pw CASSANDRA_DB_PASSWORD status"

Referensi lainnya

Lihat Pengantar playbook hybrid Apigee X dan Apigee.