Kafka Topic Advanced: Unclean Leader Election

Konfigurasi Topik Kafka: Unclean Leader Election

Dalam Apache Kafka, pemilihan pemimpin (leader election) adalah proses kritis yang memastikan partisi topik tetap tersedia untuk operasi penulisan dan pembacaan. Namun, ketika pemimpin partisi tidak tersedia dan tidak ada replika dalam In-Sync Replicas (ISR) yang dapat mengambil alih, Kafka menghadapi dilema antara ketersediaan (availability) dan keamanan data (data consistency). Parameter konfigurasi unclean.leader.election.enable mengatur perilaku Kafka dalam situasi ini. Artikel ini akan menjelaskan apa itu unclean leader election, implikasinya terhadap kehilangan data dan ketersediaan, serta cara mengonfigurasinya menggunakan alat CLI. Kami juga akan membahas kapan sebaiknya menggunakan pengaturan ini dan praktik terbaik untuk mengelolanya.

Apa itu Unclean Leader Election?

Dalam operasi normal Kafka, ketika pemimpin (leader) sebuah partisi tidak tersedia (misalnya, karena kegagalan broker), Kafka memilih salah satu replika dari In-Sync Replicas (ISR) sebagai pemimpin baru. Pemilihan ini disebut clean leader election karena menjamin tidak ada kehilangan data yang sudah committed—data yang sudah ada di semua replika ISR.

Namun, jika tidak ada replika ISR yang tersedia (misalnya, semua replika tertinggal atau tidak sinkron dengan pemimpin sebelumnya), Kafka harus memilih antara dua opsi:

  1. Menunggu Replika ISR Kembali Online (Default):

    • Kafka menunda pemilihan pemimpin hingga replika ISR kembali aktif.

    • Keuntungan: Menjamin tidak ada kehilangan data yang sudah committed.

    • Kekurangan: Partisi menjadi tidak tersedia untuk penulisan dan pembacaan hingga replika ISR pulih, yang dapat menyebabkan penurunan ketersediaan (availability).

  2. Mengizinkan Unclean Leader Election (unclean.leader.election.enable=true):

    • Kafka memilih replika yang tidak termasuk dalam ISR (replika yang tertinggal) sebagai pemimpin baru.

    • Keuntungan: Meningkatkan ketersediaan partisi karena pemimpin baru dapat dipilih lebih cepat.

    • Kekurangan: Berpotensi menyebabkan kehilangan data dan inkonsistensi data, karena replika yang tidak sinkron mungkin tidak memiliki semua pesan yang sudah committed.

Implikasi Unclean Leader Election

Mengaktifkan unclean.leader.election.enable=true melibatkan trade-off penting antara ketersediaan dan konsistensi data. Berikut adalah implikasi utamanya:

Kehilangan Data

  • Ketika replika yang tidak sinkron (bukan ISR) dipilih sebagai pemimpin, semua pesan yang ditulis ke pemimpin sebelumnya tetapi belum direplikasi ke replika tersebut akan hilang.

  • Contoh: Jika pemimpin memiliki pesan dengan offset 1000–1100 yang belum direplikasi ke replika lain, dan replika dengan offset hingga 999 menjadi pemimpin baru, pesan 1000–1100 akan hilang.

Inkonsistensi Data

  • Konsumer mungkin melihat data yang tidak konsisten, seperti pesan yang hilang atau urutan pesan yang tidak sesuai, karena replika yang tidak sinkron memiliki versi data yang lebih lama.

  • Ini dapat memengaruhi aplikasi yang bergantung pada urutan pesan atau integritas data.

Ketersediaan yang Lebih Tinggi

  • Dengan mengizinkan unclean leader election, partisi dapat kembali online lebih cepat tanpa menunggu replika ISR pulih.

  • Ini sangat berguna untuk aplikasi di mana ketersediaan lebih penting daripada kehilangan data sesekali, seperti pengumpulan metrik atau log.

Peringatan

Pengaturan unclean.leader.election.enable=true dianggap berbahaya karena dapat menyebabkan kehilangan data dan inkonsistensi. Untuk pemula, disarankan untuk mempertahankan nilai default (false) kecuali ada kebutuhan spesifik yang dipahami dengan baik.

Kasus Penggunaan untuk Unclean Leader Election

Mengaktifkan unclean leader election dapat dipertimbangkan dalam kasus berikut:

  • Pengumpulan Metrik: Data metrik sering kali bersifat tidak kritis, sehingga kehilangan beberapa pesan dapat diterima demi ketersediaan yang lebih tinggi.

  • Pengumpulan Log: Log aplikasi yang tidak memerlukan jaminan ketahanan data penuh dapat menggunakan pengaturan ini untuk memastikan topik tetap tersedia.

  • Aplikasi dengan Toleransi Kehilangan Data: Jika aplikasi dapat mentolerir kehilangan data sesekali dan memprioritaskan ketersediaan, pengaturan ini mungkin sesuai.

Namun, untuk aplikasi yang memerlukan integritas data tinggi (misalnya, transaksi finansial atau sistem pesanan), unclean leader election sebaiknya dihindari.

Untuk diskusi lebih mendalam tentang kapan menggunakan pengaturan ini, Anda dapat merujuk ke artikel dari DataDog: Kafka at DataDog: Unclean Leader Elections.

Mengonfigurasi Unclean Leader Election Menggunakan CLI

Parameter unclean.leader.election.enable dapat diatur pada level topik atau broker menggunakan alat CLI kafka-configs.sh. Nilai defaultnya adalah false pada level broker, yang berarti unclean leader election dinonaktifkan kecuali ditimpa secara eksplisit.

Prasyarat

  • Pastikan klaster Kafka berjalan (mode Zookeeper atau KRaft).

  • Gunakan ekstensi CLI yang sesuai: .sh untuk Linux/Mac, .bat untuk Windows.

  • Pastikan broker Kafka aktif di localhost:9092 (atau alamat lain sesuai konfigurasi Anda).

  • Topik configured-topic sudah dibuat, misalnya:

    kafka-topics.sh --bootstrap-server localhost:9092 --create --topic configured-topic --partitions 3 --replication-factor 1

Langkah-langkah Konfigurasi

  1. Periksa Konfigurasi Topik Saat Ini: Gunakan perintah berikut untuk memeriksa konfigurasi topik:

    kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic

    Contoh keluaran:

    Topic: configured-topic TopicId: CDU7SBxBQ1mzJGnuH68-cQ PartitionCount: 3 ReplicationFactor: 1 Configs:
    Topic: configured-topic Partition: 0 Leader: 2 Replicas: 2 Isr: 2
    Topic: configured-topic Partition: 1 Leader: 3 Replicas: 3 Isr: 3
    Topic: configured-topic Partition: 2 Leader: 1 Replicas: 1 Isr: 1

    Keluaran ini menunjukkan bahwa belum ada konfigurasi override untuk unclean.leader.election.enable.

  2. Aktifkan Unclean Leader Election: Atur unclean.leader.election.enable=true untuk topik configured-topic:

    kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --add-config unclean.leader.election.enable=true
  3. Verifikasi Perubahan: Periksa kembali konfigurasi topik untuk memastikan perubahan diterapkan:

    kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic

    Contoh keluaran:

    Topic: configured-topic TopicId: CDU7SBxBQ1mzJGnuH68-cQ PartitionCount: 3 ReplicationFactor: 1 Configs: unclean.leader.election.enable=true
    Topic: configured-topic Partition: 0 Leader: 2 Replicas: 2 Isr: 2
    Topic: configured-topic Partition: 1 Leader: 3 Replicas: 3 Isr: 3
    Topic: configured-topic Partition: 2 Leader: 1 Replicas: 1 Isr: 1

    Sekarang, Anda dapat melihat bahwa unclean.leader.election.enable=true telah ditambahkan sebagai konfigurasi override topik.

  4. Hapus Konfigurasi Override (Opsional): Jika Anda ingin menghapus konfigurasi unclean.leader.election.enable dan kembali ke default broker (false):

    kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --delete-config unclean.leader.election.enable

    Verifikasi kembali dengan kafka-topics.sh --describe untuk memastikan konfigurasi telah dihapus.

Konfigurasi pada Level Broker

Untuk mengatur unclean.leader.election.enable sebagai default untuk semua topik:

  1. Melalui File Konfigurasi:

    • Buka file config/server.properties.

    • Tambahkan parameter:

      unclean.leader.election.enable=true
    • Restart broker untuk menerapkan perubahan:

      kafka-server-stop.sh
      kafka-server-start.sh config/server.properties
  2. Melalui CLI (Konfigurasi Dinamis):

    • Atur konfigurasi default untuk semua broker:

      kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type brokers --entity-default --add-config unclean.leader.election.enable=true
    • Verifikasi perubahan:

      kafka-configs.sh --bootstrap-server localhost:9092 --describe --entity-type brokers --entity-default
    • Hapus konfigurasi dinamis (opsional):

      kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type brokers --entity-default --delete-config unclean.leader.election.enable

Catatan: Konfigurasi level topik akan menimpa konfigurasi level broker. Karena pengaturan ini berbahaya, pertimbangkan untuk hanya menerapkannya pada topik tertentu, bukan secara global di level broker.

Pertimbangan Unclean Leader Election

Kapan Mengaktifkan?

  • Kasus yang Cocok: Aktifkan unclean.leader.election.enable=true hanya untuk topik yang dapat mentolerir kehilangan data, seperti:

    • Pengumpulan metrik (misalnya, data performa sistem).

    • Pengumpulan log aplikasi yang tidak kritis.

    • Aplikasi dengan kebutuhan ketersediaan tinggi dan toleransi terhadap inkonsistensi data.

  • Kasus yang Tidak Cocok: Hindari penggunaan pada topik yang memerlukan integritas data tinggi, seperti:

    • Data transaksi finansial.

    • Sistem pesanan atau inventaris.

    • Topik yang bergantung pada urutan pesan yang ketat.

Dampak pada Konsumer

  • Konsumer mungkin melihat data yang tidak lengkap atau urutan pesan yang salah jika replika yang tidak sinkron menjadi pemimpin.

  • Untuk mengurangi dampak, pastikan konsumer memiliki mekanisme untuk menangani data yang hilang atau inkonsisten, seperti validasi atau rekonsiliasi data.

Dampak pada Klaster

  • Mengaktifkan unclean leader election dapat meningkatkan ketersediaan, tetapi meningkatkan risiko kehilangan data.

  • Pantau metrik seperti OfflinePartitions dan UnderReplicatedPartitions untuk mendeteksi masalah replikasi yang dapat memicu unclean leader election.

Alternatif

Jika ketersediaan adalah prioritas tetapi Anda ingin meminimalkan kehilangan data:

  • Tingkatkan faktor replikasi (replication.factor) untuk memastikan lebih banyak replika tersedia dalam ISR.

  • Atur min.insync.replicas ke nilai yang lebih rendah (misalnya, 1) untuk menjaga ketersediaan tanpa mengorbankan konsistensi sebanyak unclean leader election.

  • Pastikan kesehatan broker dipantau dan pulihkan broker yang gagal secepat mungkin untuk meminimalkan waktu ketika ISR kosong.

Praktik Terbaik

  1. Pertahankan Default (false) untuk Pemula:

    • Jangan aktifkan unclean.leader.election.enable kecuali Anda memahami sepenuhnya implikasinya terhadap kehilangan data dan inkonsistensi.

  2. Terapkan pada Topik Spesifik:

    • Jika diperlukan, aktifkan pengaturan ini hanya pada topik tertentu dengan kebutuhan ketersediaan tinggi dan toleransi kehilangan data, bukan pada level broker.

  3. Gunakan Konfigurasi Dinamis:

    • Gunakan kafka-configs.sh untuk mengubah unclean.leader.election.enable secara dinamis tanpa restart broker:

      kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --add-config unclean.leader.election.enable=true
  4. Pantau Kesehatan Klaster:

    • Gunakan alat seperti Kafka Manager atau metrik JMX untuk memantau status ISR dan mendeteksi replika yang tidak sinkron.

    • Periksa metrik LeaderElectionRateAndTimeMs untuk memantau frekuensi pemilihan pemimpin.

  5. Uji di Lingkungan Non-Produksi:

    • Uji dampak pengaturan unclean.leader.election.enable=true di lingkungan pengujian untuk memahami efeknya pada aplikasi dan konsumer.

  6. Kombinasikan dengan Konfigurasi Lain:

    • Gunakan min.insync.replicas dan replication.factor yang sesuai untuk meminimalkan kemungkinan ISR kosong, sehingga mengurangi kebutuhan akan unclean leader election.

  7. Dokumentasikan Perubahan:

    • Catat semua topik yang menggunakan unclean.leader.election.enable=true dan alasan penggunaannya untuk memudahkan pemeliharaan dan audit.

Penjelasan Tambahan

Hubungan dengan ISR

In-Sync Replicas (ISR) adalah replika yang sinkron dengan pemimpin partisi. Jika ISR kosong (misalnya, karena semua replika tertinggal), Kafka harus memilih antara menunggu ISR pulih atau mengizinkan unclean leader election. Parameter min.insync.replicas juga memengaruhi perilaku ini, karena menentukan jumlah minimum replika ISR yang diperlukan untuk operasi penulisan dengan acks=all.

Mode KRaft

Dalam mode KRaft (Kafka tanpa Zookeeper, mulai versi 3.3), pemilihan pemimpin dikelola oleh controller Kafka, bukan Zookeeper. Logika unclean leader election tetap sama, tetapi prosesnya lebih efisien karena metadata terintegrasi di broker. Pastikan untuk menguji pengaturan ini dalam mode KRaft untuk memahami dampaknya pada ketersediaan.

Pemecahan Masalah

Jika topik menjadi tidak tersedia karena ISR kosong:

  • Periksa status ISR:

    kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic

    Perhatikan bagian Isr untuk memastikan replika sinkron.

  • Jika unclean leader election diaktifkan dan terjadi kehilangan data, periksa log konsumer untuk mendeteksi inkonsistensi.

  • Pulihkan broker yang gagal secepat mungkin untuk mengisi kembali ISR.

Kesimpulan

Konfigurasi unclean.leader.election.enable adalah alat yang kuat namun berisiko di Apache Kafka, memungkinkan trade-off antara ketersediaan dan konsistensi data. Dengan mengaktifkan pengaturan ini, Anda dapat meningkatkan ketersediaan partisi dengan mengorbankan potensi kehilangan data dan inkonsistensi. Pengaturan ini hanya cocok untuk kasus penggunaan tertentu, seperti pengumpulan metrik atau log, dan harus digunakan dengan hati-hati. Dengan menggunakan alat CLI seperti kafka-configs.sh, Anda dapat mengelola pengaturan ini secara dinamis, sementara praktik terbaik seperti pemantauan kesehatan klaster dan pengujian di lingkungan non-produksi membantu meminimalkan risiko.

Last updated