Mengonfigurasi cluster dengan benar: static vs dynamic settings, persistent vs transient, discovery dan cluster formation, node roles, JVM heap sizing, thread pools, dan circuit breakers agar cluster stabil dan optimal.

Sampai episode 13 kita bekerja di satu node. Tapi kekuatan Elasticsearch baru terasa saat beberapa node bersatu membentuk cluster — dan di situlah konfigurasi menjadi penting. Kesalahan konfigurasi cluster adalah sumber paling umum insiden produksi: split-brain, node yang tidak bisa bergabung, atau OOM karena heap yang salah.
Episode 14 membahas pengaturan cluster dan node: static vs dynamic settings, persistent vs transient, discovery dan cluster formation, konfigurasi node roles, JVM heap sizing, thread pools, dan circuit breakers. Ini fondasi yang membuat semua episode scaling berikutnya masuk akal.
Ada dua jenis setting di Elasticsearch:
elasticsearch.yml saat node start; tidak bisa diubah saat runtime tanpa restart. Contoh: node.name, node.roles, path.data, cluster.name.cluster.routing.allocation.enable, index.number_of_replicas.cluster.name: my-cluster
node.name: data-1
node.roles: [master, data]
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["node1:9300", "node2:9300", "node3:9300"]Aturan praktis: sebisa mungkin gunakan setting default; ubah hanya yang benar-benar dibutuhkan, dan tulis perubahan static ke file konfigurasi supaya terekam (infrastructure as code, episode 28).
Dynamic settings punya dua lapisan:
PUT /_cluster/settings{
"persistent": {
"cluster.routing.allocation.enable": "all"
},
"transient": {
"cluster.routing.allocation.disk.threshold_enabled": false
}
}Warning
Gunakan persistent untuk semua perubahan production; transient hanya untuk debug sesaat. Transient yang tertinggal bisa menyebabkan perilaku tak terduga setelah restart. Dan ingat: elasticsearch.yml tetap file konfigurasi utama — preferensi pembacaan selalu: elasticsearch.yml → transient → persistent.
Saat node start, ia harus menemukan node lain dan membentuk cluster. Mekanisme discovery menggunakan beberapa seed host sebagai daftar awal:
discovery.seed_hosts: ["node1:9300", "node2:9300", "node3:9300"]
cluster.initial_master_nodes: ["master-1", "master-2", "master-3"]cluster.initial_master_nodes hanya dipakai saat cluster pertama kali dibentuk (bootstrap) untuk memilih master awal. Setelah itu, master dipilih lewat votings. Jumlah master-eligible node harus ganjil untuk menghindari tie voting — kita akan kembali ke topik quorum ini di episode 29.
Peran node dikonfigurasi di node.roles (static):
| Role | Kegunaan |
|---|---|
master | Mengelola cluster state, routing, dan pemilihan master |
data | Menyimpan data dan mengeksekusi search/aggregation |
ingest | Menjalankan ingest pipeline |
ml | Menjalankan job machine learning |
remote_cluster_client | Koneksi untuk cross-cluster search (episode 22) |
Di cluster kecil, satu node menjalankan semua peran. Di production berskala besar, pisahkan: node khusus master (ringan), node khusus data (berat), node coordinating khusus untuk mengatur lalu lintas search tanpa menyimpan data. Peran menentukan beban dan profil hardware — episode 18 membahas ini lebih dalam.
Aturan emas pengaturan heap:
-Xms harus sama dengan -Xmx — menghindari resizing heap saat runtime.-Xms8g
-Xmx8g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=500Monitor penggunaan heap: nilai aman di bawah 75–85%. Jika terus mendekati 100%, bukan berarti harus menaikkan heap — bisa jadi query aggregation yang berat atau field data yang membengkak. Episode 19 dan 21 akan membahas diagnosis performa.
Setiap node punya thread pools untuk jenis pekerjaan berbeda:
| Thread Pool | Menangani | Risiko penuh |
|---|---|---|
search | Query pencarian | RejectedExecutionException saat overload |
write | Operasi index | Antrean tulis penuh |
get | Operasi get by ID | Lambat saat kewalahan |
bulk | Bulk operations | Penolakan tulis massal |
Thread pool punya ukuran yang dihitung otomatis dari jumlah CPU. Kalian tidak perlu mengubahnya di hampir semua kasus — yang perlu dipahami adalah cara membaca tanda overload: RejectedExecutionException di log menandakan thread pool penuh. Saat itu, jawabannya bukan menaikkan thread pool, melainkan menambah node atau memperbaiki query.
Circuit breaker adalah pengaman terakhir: ia memantau estimasi memori JVM yang dipakai operasi tertentu, dan menolak request jika mendekati batas — mencegah out-of-memory yang menjatuhkan node. Tiga breaker utama:
| Breaker | Memantau |
|---|---|
indices.breaker.total | Total memori semua operasi (default 95% heap) |
fielddata | Cache field data untuk aggregation |
request | Memori per-request pencarian |
GET /_nodes/stats/breakerJika sering melihat error Data too large, data for [<breaker>]... di respons search, itu sinyal agregasi atau sorting yang terlalu boros memori — bukan alasan untuk menaikkan breaker. Breaker yang terlalu longgar hanya menunda kematian node.
Tip
Prinsip konfigurasi terbaik: jangan sentuh yang tidak perlu. Setelan default Elasticsearch sudah di-tune untuk mayoritas workload. Dokumentasikan setiap perubahan yang kalian buat, sebab pengaturan yang "bikin kinclong" di satu beban kerja bisa jadi racun di beban kerja lain.
Heap -Xms berbeda dengan -Xmx. JVM melakukan resize yang tidak perlu — samakan keduanya.
Master-eligible node genap. Voting bisa buntu (tie) — jaga jumlahnya ganjil.
Mengubah dynamic settings lewat transient di production. Gunakan persistent dan rekam perubahannya.
Menaikkan thread pool saat overload. Itu menutup gejala, bukan penyebab — cari akar masalahnya (query berat, node kurang).
Menaikkan circuit breaker. Hampir selalu salah; benahi penggunaan memori, bukan batasnya.
Di episode 14 kalian menguasai konfigurasi cluster dan node: static vs dynamic settings, persistent vs transient, discovery dengan seed hosts dan bootstrap, node roles, JVM heap sizing dengan aturan setengah-RAM-maksimal-32GB, thread pools, dan circuit breakers.
Inti yang harus dibawa pulang:
discovery.seed_hosts; bootstrap sekali dengan initial_master_nodes.-Xms = -Xmx.RejectedExecutionException berarti overload, bukan alasan menaikkan thread pool.Cluster yang dikonfigurasi benar masih bisa ditembus — yang membedakan cluster production dari cluster belajar adalah keamanan. Di episode 15 kita bahas security fundamentals: mengaktifkan xpack.security, built-in users dan realm, user dan role management, metode autentikasi (native, LDAP/AD, SAML, API keys, service tokens), serta authorization dengan RBAC, DLS/FLS, dan role mapping. Sampai jumpa!