# 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](https://www.datadoghq.com/blog/kafka-at-datadog/#unclean-leader-elections-to-enable-or-not-to-enable).

### 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:

  ```bash
  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:

   ```bash
   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`:

   ```bash
   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:

   ```bash
   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`):

   ```bash
   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:

     ```properties
     unclean.leader.election.enable=true
     ```
   * Restart broker untuk menerapkan perubahan:

     ```bash
     kafka-server-stop.sh
     kafka-server-start.sh config/server.properties
     ```
2. **Melalui CLI (Konfigurasi Dinamis):**
   * Atur konfigurasi default untuk semua broker:

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

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

     ```bash
     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:

     ```bash
     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:

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