Kafka adalah sistem pesan open source yang terdistribusi untuk menangani data streaming real-time, throughput tinggi, dan volume tinggi. Anda dapat menggunakan Kafka untuk membangun pipeline data streaming yang memindahkan data dengan andal ke berbagai sistem dan aplikasi untuk pemrosesan serta analisis.
Tutorial ini ditujukan untuk administrator platform, arsitek cloud, dan tenaga profesional operasi yang tertarik untuk men-deploy cluster Kafka yang sangat tersedia di Google Kubernetes Engine (GKE).
Tujuan
Dalam tutorial ini, Anda akan mempelajari cara:- Menggunakan Terraform untuk membuat cluster GKE regional.
- Men-deploy cluster Kafka yang sangat tersedia.
- Mengupgrade biner Kafka.
- Mencadangkan dan memulihkan cluster Kafka.
- Menyimulasikan gangguan node GKE dan failover broker Kafka.
Arsitektur
Bagian ini menjelaskan arsitektur solusi yang akan Anda buat dalam tutorial ini.
Klaster Kafka adalah sekelompok satu atau beberapa server (disebut broker) yang bekerja sama untuk menangani aliran data yang masuk dan pesan publikasi-langganan untuk klien Kafka (disebut konsumen).
Setiap partisi data dalam cluster Kafka memiliki satu broker pemimpin dan dapat memiliki satu atau beberapa broker pengikut. Broker pemimpin menangani semua operasi baca dan tulis ke partisi. Setiap broker pengikut secara pasif mereplikasi broker pemimpin.
Dalam penyiapan Kafka standar, Anda juga menggunakan layanan open source yang disebut ZooKeeper untuk mengoordinasikan cluster Kafka. Layanan ini membantu memilih pemimpin di antara broker dan memicu failover jika terjadi kegagalan.
Dalam tutorial ini, Anda akan men-deploy cluster Kafka di GKE dengan mengonfigurasi broker Kafka dan layanan Zookeeper sebagai StatefulSets tertentu. Untuk menyediakan cluster Kafka yang sangat tersedia dan mempersiapkan pemulihan dari bencana (disaster recovery), Anda harus mengonfigurasi Kafka dan Zookeeper StatefulSets untuk menggunakan node pool dan zona yang terpisah.
Diagram berikut menunjukkan bagaimana Kafka StatefulSet berjalan di beberapa node dan zona di cluster GKE Anda.
Diagram berikut menunjukkan cara Zookeeper StatefulSet berjalan di beberapa node dan zona di cluster GKE Anda.
Penyediaan node dan penjadwalan Pod
Jika Anda menggunakan cluster Autopilot, Autopilot akan menangani penyediaan node dan penjadwalan Pod untuk workload Anda. Anda akan menggunakan anti-afinitas Pod untuk memastikan tidak ada dua Pod dari StatefulSet yang sama yang dijadwalkan pada node dan zona yang sama.
Jika menggunakan cluster Standard, Anda harus mengonfigurasi tolerasi Pod dan afinitas node. Untuk mempelajari lebih lanjut, lihat Memisahkan workload di node pool khusus.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
- Artifact Registry
- Pencadangan untuk GKE
- Compute Engine
- GKE
- Google Cloud Managed Service for Prometheus
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
Menyiapkan project
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Di konsol Google Cloud, pada halaman pemilih project, klik Buat project untuk mulai membuat project Google Cloud baru.
-
Make sure that billing is enabled for your Google Cloud project.
-
Aktifkan API Google Kubernetes Engine, Backup for GKE, Artifact Registry, Compute Engine, and IAM.
-
Di konsol Google Cloud, pada halaman pemilih project, klik Buat project untuk mulai membuat project Google Cloud baru.
-
Make sure that billing is enabled for your Google Cloud project.
-
Aktifkan API Google Kubernetes Engine, Backup for GKE, Artifact Registry, Compute Engine, and IAM.
Menyiapkan peran
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
role/storage.objectViewer, role/logging.logWriter, role/artifactregistry.Admin, roles/container.clusterAdmin, role/container.serviceAgent, roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageAdmin, roles/iam.serviceAccountAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
Menyiapkan lingkungan Anda
Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal dengan software yang Anda perlukan untuk tutorial ini, termasuk Docker, kubectl
, gcloud CLI, Helm, dan Terraform.
Untuk menyiapkan lingkungan Anda dengan Cloud Shell, ikuti langkah-langkah berikut:
Luncurkan sesi Cloud Shell dari Konsol Google Cloud, dengan mengklik Activate Cloud Shell di Konsol Google Cloud. Tindakan ini akan meluncurkan sesi di panel bawah Konsol Google Cloud.
Menetapkan variabel lingkungan.
export PROJECT_ID=PROJECT_ID export REGION=us-central1
Ganti nilai berikut:
- PROJECT_ID: project ID Google Cloud Anda.
Tetapkan variabel lingkungan default.
gcloud config set project PROJECT_ID
Buat clone repositori kode.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Ubah ke direktori kerja.
cd kubernetes-engine-samples/streaming/gke-stateful-kafka
Membuat infrastruktur cluster
Di bagian ini, Anda akan menjalankan skrip Terraform untuk membuat dua cluster GKE regional.
Cluster utama akan di-deploy di us-central1
.
Untuk membuat cluster, ikuti langkah-langkah berikut:
Autopilot
Di Cloud Shell jalankan perintah berikut:
terraform -chdir=terraform/gke-autopilot init
terraform -chdir=terraform/gke-autopilot apply -var project_id=$PROJECT_ID
Saat diminta, ketik yes
.
Standard
Di Cloud Shell jalankan perintah berikut:
terraform -chdir=terraform/gke-standard init
terraform -chdir=terraform/gke-standard apply -var project_id=$PROJECT_ID
Saat diminta, ketik yes
.
File konfigurasi Terraform membuat resource berikut untuk men-deploy infrastruktur Anda:
- Membuat repositori Artifact Registry untuk menyimpan image Docker.
- Membuat jaringan VPC dan subnet untuk antarmuka jaringan VM.
- Buat dua cluster GKE.
Terraform membuat cluster pribadi di dua region, dan mengaktifkan Pencadangan untuk GKE untuk pemulihan dari bencana.
Men-deploy Kafka di cluster Anda
Di bagian ini, Anda akan men-deploy Kafka di GKE menggunakan chart Helm. Operasi ini akan membuat resource berikut:
- StatefulSets Kafka dan Zookeeper.
- Deployment pengekspor Kafka. Pengekspor mengumpulkan metrik Kafka untuk pemakaian Prometheus.
- Anggaran Gangguan Pod (PDB) yang membatasi jumlah Pod offline selama gangguan tambahan.
Agar dapat menggunakan chart Helm untuk men-deploy Kafka, ikuti langkah-langkah berikut:
Konfigurasi akses Docker.
gcloud auth configure-docker us-docker.pkg.dev
Isi Artifact Registry dengan image Kafka dan Zookeeper.
./scripts/gcr.sh bitnami/kafka 3.3.2-debian-11-r0 ./scripts/gcr.sh bitnami/kafka-exporter 1.6.0-debian-11-r52 ./scripts/gcr.sh bitnami/jmx-exporter 0.17.2-debian-11-r41 ./scripts/gcr.sh bitnami/zookeeper 3.8.0-debian-11-r74
Konfigurasi akses command line
kubectl
ke cluster utama.gcloud container clusters get-credentials gke-kafka-us-central1 \ --region=${REGION} \ --project=${PROJECT_ID}
Membuat namespace.
export NAMESPACE=kafka kubectl create namespace $NAMESPACE
Instal Kafka menggunakan bagan Helm versi 20.0.6.
cd helm ../scripts/chart.sh kafka 20.0.6 && \ rm -rf Chart.lock charts && \ helm dependency update && \ helm -n kafka upgrade --install kafka . \ --set global.imageRegistry="us-docker.pkg.dev/$PROJECT_ID/main"
Outputnya mirip dengan hal berikut ini:
NAME: kafka LAST DEPLOYED: Thu Feb 16 03:29:39 2023 NAMESPACE: kafka STATUS: deployed REVISION: 1 TEST SUITE: None
Pastikan replika Kafka Anda berjalan (proses ini mungkin memerlukan waktu beberapa menit).
kubectl get all -n kafka
Outputnya mirip dengan hal berikut ini:
--- NAME READY STATUS RESTARTS AGE pod/kafka-0 1/1 Running 2 (3m51s ago) 4m28s pod/kafka-1 1/1 Running 3 (3m41s ago) 4m28s pod/kafka-2 1/1 Running 2 (3m57s ago) 4m28s pod/kafka-zookeeper-0 1/1 Running 0 4m28s pod/kafka-zookeeper-1 1/1 Running 0 4m28s pod/kafka-zookeeper-2 1/1 Running 0 4m28s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kafka ClusterIP 192.168.112.124 <none> 9092/TCP 4m29s service/kafka-app ClusterIP 192.168.75.57 <none> 9092/TCP 35m service/kafka-app-headless ClusterIP None <none> 9092/TCP,9093/TCP 35m service/kafka-app-zookeeper ClusterIP 192.168.117.102 <none> 2181/TCP,2888/TCP,3888/TCP 35m service/kafka-app-zookeeper-headless ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 35m service/kafka-headless ClusterIP None <none> 9092/TCP,9093/TCP 4m29s service/kafka-zookeeper ClusterIP 192.168.89.249 <none> 2181/TCP,2888/TCP,3888/TCP 4m29s service/kafka-zookeeper-headless ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 4m29s NAME READY AGE statefulset.apps/kafka 3/3 4m29s statefulset.apps/kafka-zookeeper 3/3 4m29s
Membuat data pengujian
Di bagian ini, Anda akan menguji aplikasi Kafka dan membuat pesan.
Buat Pod klien konsumen untuk berinteraksi dengan aplikasi Kafka.
kubectl run kafka-client -n kafka --rm -ti \ --image us-docker.pkg.dev/$PROJECT_ID/main/bitnami/kafka:3.3.2-debian-11-r0 -- bash
Buat topik bernama
topic1
dengan tiga partisi dan faktor replikasi tiga.kafka-topics.sh \ --create \ --topic topic1 \ --partitions 3 \ --replication-factor 3 \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Pastikan bahwa partisi topik direplikasi di ketiga broker.
kafka-topics.sh \ --describe \ --topic topic1 \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Outputnya mirip dengan hal berikut ini:
Topic: topic1 TopicId: 1ntc4WiFS4-AUNlpr9hCmg PartitionCount: 3 ReplicationFactor: 3 Configs: flush.ms=1000,segment.bytes=1073741824,flush.messages=10000,max.message.bytes=1000012,retention.bytes=1073741824 Topic: topic1 Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1 Topic: topic1 Partition: 1 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0 Topic: topic1 Partition: 2 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Dalam contoh output, perhatikan bahwa
topic1
memiliki tiga partisi, masing-masing dengan pemimpin dan kumpulan replika yang berbeda. Hal ini karena Kafka menggunakan partisi untuk mendistribusikan data ke beberapa broker, sehingga memungkinkan skalabilitas dan fault tolerance yang lebih besar. Faktor replikasi tiga memastikan bahwa setiap partisi memiliki tiga replika, sehingga data masih tersedia meskipun satu atau dua broker gagal.Jalankan perintah berikut untuk membuat nomor pesan secara massal ke dalam
topic1
.ALLOW_PLAINTEXT_LISTENER=yes for x in $(seq 0 200); do echo "$x: Message number $x" done | kafka-console-producer.sh \ --topic topic1 \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092 \ --property parse.key=true \ --property key.separator=":"
Jalankan perintah berikut untuk menggunakan
topic1
dari semua partisi.kafka-console-consumer.sh \ --bootstrap-server kafka.kafka.svc.cluster.local:9092 \ --topic topic1 \ --property print.key=true \ --property key.separator=" : " \ --from-beginning;
Ketik
CTRL+C
untuk menghentikan proses penggunaan.
Tolok Ukur Kafka
Untuk membuat model kasus penggunaan secara akurat, Anda dapat menjalankan simulasi ekspektasi pemuatan di cluster. Untuk menguji performa, Anda akan menggunakan alat yang disertakan dalam paket Kafka, yaitu skrip kafka-producer-perf-test.sh
dan kafka-consumer-perf-test.sh
dalam folder bin
.
Buat topik untuk benchmark.
kafka-topics.sh \ --create \ --topic topic-benchmark \ --partitions 3 \ --replication-factor 3 \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Buat pemuatan di cluster Kafka.
KAFKA_HEAP_OPTS="-Xms4g -Xmx4g" kafka-producer-perf-test.sh \ --topic topic-benchmark \ --num-records 10000000 \ --throughput -1 \ --producer-props bootstrap.servers=kafka.kafka.svc.cluster.local:9092 \ batch.size=16384 \ acks=all \ linger.ms=500 \ compression.type=none \ --record-size 100 \ --print-metrics
Produser akan membuat 10.000.000 kumpulan data pada
topic-benchmark
. Outputnya mirip dengan yang berikut ini:623821 records sent, 124316.7 records/sec (11.86 MB/sec), 1232.7 ms avg latency, 1787.0 ms max latency. 1235948 records sent, 247140.2 records/sec (23.57 MB/sec), 1253.0 ms avg latency, 1587.0 ms max latency. 1838898 records sent, 367779.6 records/sec (35.07 MB/sec), 793.6 ms avg latency, 1185.0 ms max latency. 2319456 records sent, 463242.7 records/sec (44.18 MB/sec), 54.0 ms avg latency, 321.0 ms max latency.
Setelah semua data dikirim, Anda akan melihat metrik tambahan dalam output, mirip dengan yang berikut ini:
producer-topic-metrics:record-send-rate:{client-id=perf-producer-client, topic=topic-benchmark} : 173316.233 producer-topic-metrics:record-send-total:{client-id=perf-producer-client, topic=topic-benchmark} : 10000000.000
Untuk keluar dari smartwatch, ketik
CTRL + C
.Keluar dari shell Pod.
exit
Mengelola upgrade
Update versi untuk Kafka dan Kubernetes dirilis secara rutin. Ikuti praktik terbaik operasional untuk mengupgrade lingkungan software Anda secara berkala.
Paket upgrade biner Kafka
Di bagian ini, Anda akan memperbarui image Kafka menggunakan Helm dan memverifikasi bahwa topik Anda masih tersedia.
Untuk mengupgrade dari versi Kafka sebelumnya dari chart Helm yang Anda gunakan dalam Men-deploy Kafka di cluster, ikuti langkah-langkah berikut:
Isi Artifact Registry dengan image berikut:
../scripts/gcr.sh bitnami/kafka 3.4.0-debian-11-r2 ../scripts/gcr.sh bitnami/kafka-exporter 1.6.0-debian-11-r61 ../scripts/gcr.sh bitnami/jmx-exporter 0.17.2-debian-11-r49 ../scripts/gcr.sh bitnami/zookeeper 3.8.1-debian-11-r0
Lakukan langkah-langkah berikut untuk men-deploy chart Helm dengan gambar Kafka dan Zookeeper yang telah diupgrade. Untuk panduan khusus versi, lihat petunjuk Kafka untuk upgrade versi.
- Update versi dependensi
Chart.yaml
:
../scripts/chart.sh kafka 20.1.0
Deploy chart Helm dengan image Kafka dan Zookeeper baru, seperti yang ditunjukkan pada contoh berikut:
rm -rf Chart.lock charts && \ helm dependency update && \ helm -n kafka upgrade --install kafka ./ \ --set global.imageRegistry="$REGION-docker.pkg.dev/$PROJECT_ID/main"
Tonton Kafka Pods diupgrade:
kubectl get pod -l app.kubernetes.io/component=kafka -n kafka --watch
Untuk keluar dari smartwatch, ketik
CTRL + C
.- Update versi dependensi
Terhubung ke cluster Kafka menggunakan Pod klien.
kubectl run kafka-client -n kafka --rm -ti \ --image us-docker.pkg.dev/$PROJECT_ID/main/bitnami/kafka:3.4.0-debian-11-r2 -- bash
Verifikasi bahwa Anda dapat mengakses pesan dari
topic1
.kafka-console-consumer.sh \ --topic topic1 \ --from-beginning \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Output akan menampilkan pesan yang dihasilkan dari langkah sebelumnya. Ketik
CTRL+C
untuk keluar dari proses.Keluar dari Pod klien.
exit
Bersiap untuk pemulihan dari bencana (disaster recovery)
Untuk memastikan workload produksi tetap tersedia jika terjadi peristiwa yang mengganggu layanan, Anda harus menyiapkan rencana pemulihan dari bencana (disaster recovery) (DR). Untuk mempelajari lebih lanjut perencanaan DR, lihat Panduan perencanaan pemulihan dari bencana (disaster recovery).
Untuk mencadangkan dan memulihkan workload di cluster GKE, Anda dapat menggunakan Pencadangan untuk GKE.
Contoh skenario pencadangan dan pemulihan Kafka
Di bagian ini, Anda akan mencadangkan cluster dari gke-kafka-us-central1
dan memulihkan cadangan tersebut ke gke-kafka-us-west1
. Anda akan melakukan operasi pencadangan dan pemulihan pada cakupan aplikasi, menggunakan Resource Kustom ProtectedApplication
.
Diagram berikut menggambarkan komponen solusi pemulihan dari bencana (disaster recovery), dan hubungannya satu sama lain.
Sebagai persiapan untuk mencadangkan dan memulihkan cluster Kafka Anda, ikuti langkah-langkah berikut:
Siapkan variabel lingkungan.
export BACKUP_PLAN_NAME=kafka-protected-app export BACKUP_NAME=protected-app-backup-1 export RESTORE_PLAN_NAME=kafka-protected-app export RESTORE_NAME=protected-app-restore-1 export REGION=us-central1 export DR_REGION=us-west1 export CLUSTER_NAME=gke-kafka-$REGION export DR_CLUSTER_NAME=gke-kafka-$DR_REGION
Verifikasi bahwa cluster berada dalam status
RUNNING
.gcloud container clusters describe $CLUSTER_NAME --region us-central1 --format='value(status)'
Buat Rencana Cadangan.
gcloud beta container backup-restore backup-plans create $BACKUP_PLAN_NAME \ --project=$PROJECT_ID \ --location=$DR_REGION \ --cluster=projects/$PROJECT_ID/locations/$REGION/clusters/$CLUSTER_NAME \ --selected-applications=kafka/kafka,kafka/zookeeper \ --include-secrets \ --include-volume-data \ --cron-schedule="0 3 * * *" \ --backup-retain-days=7 \ --backup-delete-lock-days=0
Buat Cadangan secara manual. Meskipun pencadangan terjadwal biasanya diatur oleh jadwal cron dalam rencana pencadangan, contoh berikut menunjukkan cara memulai operasi pencadangan satu kali.
gcloud beta container backup-restore backups create $BACKUP_NAME \ --project=$PROJECT_ID \ --location=$DR_REGION \ --backup-plan=$BACKUP_PLAN_NAME \ --wait-for-completion
Buat Rencana Pemulihan.
gcloud beta container backup-restore restore-plans create $RESTORE_PLAN_NAME \ --project=$PROJECT_ID \ --location=$DR_REGION \ --backup-plan=projects/$PROJECT_ID/locations/$DR_REGION/backupPlans/$BACKUP_PLAN_NAME \ --cluster=projects/$PROJECT_ID/locations/$DR_REGION/clusters/$DR_CLUSTER_NAME \ --cluster-resource-conflict-policy=use-existing-version \ --namespaced-resource-restore-mode=delete-and-restore \ --volume-data-restore-policy=restore-volume-data-from-backup \ --selected-applications=kafka/kafka,kafka/zookeeper \ --cluster-resource-scope-selected-group-kinds="storage.k8s.io/StorageClass"
Lakukan pemulihan secara manual dari Cadangan.
gcloud beta container backup-restore restores create $RESTORE_NAME \ --project=$PROJECT_ID \ --location=$DR_REGION \ --restore-plan=$RESTORE_PLAN_NAME \ --backup=projects/$PROJECT_ID/locations/$DR_REGION/backupPlans/$BACKUP_PLAN_NAME/backups/$BACKUP_NAME
Lihat aplikasi yang dipulihkan muncul di cluster cadangan. Mungkin perlu waktu beberapa menit sampai semua Pod berjalan dan siap.
gcloud container clusters get-credentials gke-kafka-us-west1 \ --region us-west1 kubectl get pod -n kafka --watch
Ketik
CTRL+C
untuk keluar dari smartwatch saat semua Pod sudah aktif dan berjalan.Validasi bahwa topik sebelumnya dapat diambil oleh konsumen.
kubectl run kafka-client -n kafka --rm -ti \ --image us-docker.pkg.dev/$PROJECT_ID/main/bitnami/kafka:3.4.0 -- bash
kafka-console-consumer.sh \ --bootstrap-server kafka.kafka.svc.cluster.local:9092 \ --topic topic1 \ --property print.key=true \ --property key.separator=" : " \ --from-beginning;
Outputnya mirip dengan hal berikut ini:
192 : Message number 192 193 : Message number 193 197 : Message number 197 200 : Message number 200 Processed a total of 201 messages
Ketik
CTRL+C
untuk keluar dari proses.Keluar dari Pod.
exit
Menyimulasikan gangguan layanan Kafka
Di bagian ini, Anda akan menyimulasikan kegagalan node dengan mengganti node Kubernetes yang menghosting broker. Bagian ini hanya berlaku untuk Standard. Autopilot mengelola node untuk Anda, sehingga kegagalan node tidak dapat disimulasikan.
Buat pod klien untuk terhubung ke aplikasi Kafka.
kubectl run kafka-client -n kafka --restart='Never' -it \ --image us-docker.pkg.dev/$PROJECT_ID/main/bitnami/kafka:3.4.0 -- bash
Buat topik
topic-failover-test
dan hasilkan traffic pengujian.kafka-topics.sh \ --create \ --topic topic-failover-test \ --partitions 1 \ --replication-factor 3 \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Tentukan broker mana yang merupakan pemimpin untuk topik
topic-failover-test
.kafka-topics.sh --describe \ --topic topic-failover-test \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Outputnya mirip dengan hal berikut ini:
Topic: topic-failover-test Partition: 0 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2
Pada output di atas,
Leader: 1
berarti pemimpin untuktopic-failover-test
adalah broker 1. Ini sesuai dengan Podkafka-1
.Buka terminal baru dan hubungkan ke cluster yang sama.
gcloud container clusters get-credentials gke-kafka-us-west1 --region us-west1 --project PROJECT_ID
Temukan Pod node
kafka-1
yang berjalan.kubectl get pod -n kafka kafka-1 -o wide
Outputnya mirip dengan hal berikut ini:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kafka-1 2/2 Running 1 (35m ago) 36m 192.168.132.4 gke-gke-kafka-us-west1-pool-system-a0d0d395-nx72 <none> <none>
Pada output di atas, Anda melihat Pod
kafka-1
berjalan pada nodegke-gke-kafka-us-west1-pool-system-a0d0d395-nx72
.Kosongi node untuk mengeluarkan Pod.
kubectl drain NODE \ --delete-emptydir-data \ --force \ --ignore-daemonsets
Ganti NODE dengan pod node kafka-1 yang sedang berjalan. Dalam contoh ini, node-nya adalah
gke-gke-kafka-us-west1-pool-system-a0d0d395-nx72
.Outputnya mirip dengan hal berikut ini:
node/gke-gke-kafka-us-west1-pool-system-a0d0d395-nx72 cordoned Warning: ignoring DaemonSet-managed Pods: gmp-system/collector-gjzsd, kube-system/calico-node-t28bj, kube-system/fluentbit-gke-lxpft, kube-system/gke-metadata-server-kxw78, kube-system/ip-masq-agent-kv2sq, kube-system/netd-h446k, kube-system/pdcsi-node-ql578 evicting pod kafka/kafka-1 evicting pod kube-system/kube-dns-7d48cb57b-j4d8f evicting pod kube-system/calico-typha-56995c8d85-5clph pod/calico-typha-56995c8d85-5clph evicted pod/kafka-1 evicted pod/kube-dns-7d48cb57b-j4d8f evicted node/gke-gke-kafka-us-west1-pool-system-a0d0d395-nx72 drained
Temukan Pod node
kafka-1
yang berjalan.kubectl get pod -n kafka kafka-1 -o wide
Outputnya akan mirip dengan berikut ini:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kafka-1 2/2 Running 0 2m49s 192.168.128.8 gke-gke-kafka-us-west1-pool-kafka-700d8e8d-05f7 <none> <none>
Dari output di atas, Anda akan melihat aplikasi berjalan di node baru.
Di terminal yang terhubung ke Pod
kafka-client
, tentukan broker yang merupakan pemimpin untuktopic-failover-test
.kafka-topics.sh --describe \ --topic topic-failover-test \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Outputnya akan mirip dengan berikut ini:
Topic: topic-failover-test TopicId: bemKyqmERAuKZC5ymFwsWg PartitionCount: 1 ReplicationFactor: 3 Configs: flush.ms=1000,segment.bytes=1073741824,flush.messages=10000,max.message.bytes=1000012,retention.bytes=1073741824 Topic: topic-failover-test Partition: 0 Leader: 1 Replicas: 1,0,2 Isr: 0,2,1
Dalam contoh output, pemimpin masih 1. Namun, sekarang layanan tersebut berjalan di node baru.
Menguji kegagalan pemimpin Kafka
Di Cloud Shell, hubungkan ke klien Kafka, dan gunakan
describe
untuk melihat pemimpin yang dipilih untuk setiap partisi ditopic1
.kafka-topics.sh --describe \ --topic topic1 \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Outputnya mirip dengan yang berikut ini:
Topic: topic1 TopicId: B3Jr_5t2SPq7F1jVHu4r0g PartitionCount: 3 ReplicationFactor: 3 Configs: flush.ms=1000,segment.bytes=1073741824,flush.messages=10000,max.message.bytes=1000012,retention.bytes=1073741824 Topic: topic1 Partition: 0 Leader: 0 Replicas: 0,2,1 Isr: 0,2,1 Topic: topic1 Partition: 1 Leader: 0 Replicas: 2,1,0 Isr: 0,2,1 Topic: topic1 Partition: 2 Leader: 0 Replicas: 1,0,2 Isr: 0,2,1
Di Cloud Shell yang tidak terhubung ke klien Kafka, hapus broker pemimpin
kafka-0
untuk memaksakan pemilihan pemimpin baru. Anda harus menghapus indeks yang dipetakan ke salah satu pemimpin di output sebelumnya.kubectl delete pod -n kafka kafka-0 --force
Outputnya mirip dengan yang berikut ini:
pod "kafka-0" force deleted
Di Cloud Shell yang terhubung ke klien Kafka, gunakan
describe
untuk melihat pemimpin yang dipilih.kafka-topics.sh --describe \ --topic topic1 \ --bootstrap-server kafka-headless.kafka.svc.cluster.local:9092
Outputnya mirip dengan yang berikut ini:
Topic: topic1 TopicId: B3Jr_5t2SPq7F1jVHu4r0g PartitionCount: 3 ReplicationFactor: 3 Configs: flush.ms=1000,segment.bytes=1073741824,flush.messages=10000,max.message.bytes=1000012,retention.bytes=1073741824 Topic: topic1 Partition: 0 Leader: 2 Replicas: 0,1,2 Isr: 2,0,1 Topic: topic1 Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1 Topic: topic1 Partition: 2 Leader: 2 Replicas: 1,2,0 Isr: 2,0,1
Di output tersebut, pemimpin baru untuk setiap partisi akan berubah, jika pemimpin itu ditetapkan ke pemimpin yang diinterupsi (
kafka-0
). Hal ini menunjukkan bahwa pemimpin asli diganti saat Pod dihapus dan dibuat ulang.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus project
Cara termudah untuk menghindari penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.
Menghapus project Google Cloud:
gcloud projects delete PROJECT_ID
Langkah selanjutnya
- Untuk mengetahui layanan pesan yang terkelola sepenuhnya dan skalabel, lihat Bermigrasi dari Kafka ke Pub/Sub.