Membangun directory yang tetap hidup meskipun satu node gagal: arsitektur high availability, replikasi mirror mode multi-master, load balancer seperti HAProxy dan Nginx, DNS load balancing, strategi failover, serta cara memantau kesehatan replikasi.

Di episode 25 kalian menyetel satu server agar cepat. Episode 26 ini membahas bagaimana menyetel banyak server agar directory tetap tersedia — high availability dan load balancing. Konsep replikasi dari episode 13 menjadi fondasi di sini: replica consumer, mirror mode multi-master, load balancer di depan node-node, DNS sebagai lapisan distribusi, dan strategi failover. Tujuannya sederhana: ketika satu server mati karena perawatan atau gangguan, autentikasi dan pencarian tidak boleh berhenti.
Pilih topologi sesuai kebutuhan tulis dan baca kalian. Tidak ada satu bentuk yang benar untuk semua kasus:
| Topologi | Karakteristik | Cocok untuk |
|---|---|---|
| Active-passive | Satu master tulis, replica read-only | Beban tulis rendah, prioritas keamanan data |
| Active-active (mirror mode) | Semua node bisa tulis, sinkron dua arah | Kebutuhan tulis tersebar, failover otomatis |
| Geographic distribution | Node di beberapa lokasi | Organisasi lintas region |
| DR site | Replica khusus pemulihan, kadang di-lag | Pemenuhan RPO/RTO antar lokasi |
Arsitektur paling umum adalah active-passive: satu master menerima tulis, satu atau lebih consumer melayani pencarian dan autentikasi. Kalau kebutuhan tulis juga tersebar dan kalian menginginkan failover yang benar-benar mulus, gunakan mirror mode — dua node yang saling menerima tulis dan menyinkronkan perubahan dua arah melalui syncrepl.
Mirror mode dipasang di kedua node; masing-masing menjadi provider sekaligus consumer bagi node lainnya. Berikut konfigurasi olcSyncrepl yang digabung dengan overlay syncprov di tiap node:
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModuleLoad: syncprov
dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
dn: olcDatabase={1}mdb,cn=config
olcSyncrepl:
rid=001 provider=ldap://ldap-b.example.com
type=refreshAndPersist schemachecking=on
retry="30 5 300 3" mirror=TRUE
olcMirrorMode: TRUEmirror=TRUE pada olcSyncrepl membuat entry yang diterima dari provider diperlakukan seperti tulis lokal, sehingga tidak ter-echo kembali ke provider asal — mencegah loop replikasi. olcMirrorMode: TRUE menandai database sebagai multi-master. Dengan ini kedua node menerima tulis, dan contextCSN menjaga urutan perubahan. Konflik diselesaikan dengan membandingkan contextCSN — perubahan dengan timestamp terbaru yang menang.
Load balancer duduk di depan node-node dan membagi koneksi. Untuk protokol TCP seperti LDAP, HAProxy adalah pilihan yang umum dan ringan:
frontend ldap_in
bind *:389
mode tcp
default_backend ldap_backend
backend ldap_backend
mode tcp
balance roundrobin
option ldap-check
server ldap-a 10.0.0.11:389 check inter 5s
server ldap-b 10.0.0.12:389 check inter 5soption ldap-check memanfaatkan kemampuan HAProxy melakukan pemeriksaan kesehatan berbasis protokol LDAP, bukan sekadar TCP connect. Kalau kalian lebih nyaman dengan Nginx, blok stream menyediakan fitur serupa:
stream {
upstream ldap_backend {
server 10.0.0.11:389;
server 10.0.0.12:389;
}
server {
listen 389;
proxy_pass ldap_backend;
}
}Dengan balance roundrobin, setiap koneksi baru diputar ke node berikutnya — ideal untuk autentikasi yang banyak datang dan pergi. Yang perlu diingat: round-robin menganggap semua node setara. Kalau kalian menjalankan active-passive (bukan mirror mode), arahkan tulis hanya ke master dan semua baca ke replica, misalnya dengan dua backend terpisah.
DNS adalah lapisan distribusi paling sederhana karena tidak ada komponen tambahan. Dua teknik utama:
_ldap._tcp.example.com. 300 IN SRV 0 100 389 ldap-a.example.com.
_ldap._tcp.example.com. 300 IN SRV 0 100 389 ldap-b.example.com.Perhatikan TTL: semakin kecil TTL (misal 60 sampai 300 detik), semakin cepat klien melihat perubahan saat sebuah node dikeluarkan atau masuk kembali. TTL besar membuat pemulihan failover terasa lambat karena klien menyimpan jawaban DNS terlalu lama.
Failover bisa ditangani di sisi server, sisi klien, atau keduanya:
ldap.conf mendukung beberapa URI:URI ldap://ldap-a.example.com ldap://ldap-b.example.com
BASE dc=example,dc=com
TIMELIMIT 15
NETWORK_TIMEOUT 10Bila node pertama tidak menjawab dalam NETWORK_TIMEOUT, libldap mencoba node berikutnya — tanpa menunggu intervensi manusia.
High availability tanpa monitoring hanyalah harapan. Yang harus dipantau terus-menerus:
ldapsearch dasar dari sisi klien.contextCSN antara node adalah indikator paling langsung:ldapsearch -x -LLL -s base -b "" contextCSNJalankan perintah ini di setiap node dan bandingkan. Perbedaan yang mencolok berarti replikasi tertinggal — siasati sebelum node tertinggal permanen.
contextCSN sudah jauh lebih baik daripada tidak ada.Tip
Untuk mirror mode, pastikan kedua node memakai credential replikasi yang sama dan schemachecking=on. Perubahan schema di satu node menyebar ke node lain lewat replikasi — kalau konfigurasi tidak seragam, cek contextCSN di cn=config juga, bukan hanya di database data.
Pada episode 26 ini, kalian memilih topologi HA yang sesuai, menyusun mirror mode dengan syncrepl dan olcMirrorMode, mengonfigurasi HAProxy dan Nginx untuk load balancing, memakai DNS round-robin dan SRV records, menerapkan failover di sisi klien, serta memantau kesehatan dan lag replikasi.
Inti yang harus dibawa pulang:
NETWORK_TIMEOUT dan daftar URI membuat klien pindah server sendiri.contextCSN, bukan perasaan.Di episode 27 berikutnya, kita memasuki sisi yang tidak menyenangkan tapi tak terhindarkan: troubleshooting — membaca log, men-debug dengan ldapsearch -d, dan menyelesaikan masalah autentikasi, pencarian lambat, dan replikasi yang macet.