Failover adalah momen kebenaran bagi replica set: primary hilang, dan dalam hitungan detik cluster harus memilih pengganti tanpa campur tangan manusia. Proses itu bernama election — pemungutan suara antar anggota yang menentukan siapa primary berikutnya — dan pemahaman tentang waktunya menentukan ekspektasi yang benar atas aplikasi kita. Chapter ini membedah pemicu election, alur waktunya, pengaruh priority, lalu menutup dengan rs.stepDown() sebagai failover yang direncanakan. Karena rs0 hanya beranggota satu node, tidak ada failover sungguhan yang bisa disaksikan; keluaran yang ditampilkan adalah bukti-bukti election masa lalu dan parameter waktunya yang tetap terbaca.
Kapan Election Terjadi #
Election dipicu oleh tiga situasi umum:
| Pemicu | Kejadian nyata |
|---|---|
| Primary hilang | Proses mati, mesin reboot, jaringan terputus |
| Inisiasi set | rs.initiate() — node pertama memilih dirinya |
| Maintenance terencana | rs.stepDown() — primary menyerahkan jabatan secara sukarela |
Ketiganya bermuara pada syarat yang sama: posisi primary kosong, dan anggota yang memenuhi syarat mengajukan diri. Yang mengajukan bukan sembarang anggota — kandidat harus punya data paling mutakhir di antara yang tersedia, dan anggota dengan priority: 0 tidak pernah ikut serta.
Suara, Mayoritas, dan Term #
Election adalah pemungutan suara: kandidat meminta suara dari anggota lain, dan hanya kandidat yang mengantongi mayoritas — n+1 dari 2n+1 anggota voting — yang boleh menjadi primary. Syarat mayoritas inilah yang mencegah dua primary aktif bersamaan ketika jaringan terbelah dua: sisi yang tidak punya mayoritas tidak bisa memilih, dan aplikasi di sisi itu menunggu alih-alih menulis ke primary palsu.
Setiap election menghasilkan term baru — nomor periode kepemimpinan yang terus bertambah. Kita bisa membaca jejak election terakhir pada rs0:
const st = rs.status()
({
term: st.term,
electionDate: st.members[0].electionDate,
electionId: db.hello().electionId
})Output yang Dihasilkan:
{
term: Long('8'),
electionDate: ISODate('2026-10-17T13:05:23.000Z'),
electionId: ObjectId('7fffffff0000000000000008')
}Tiga nilai ini saling berkaitan:
term: 8: server latihan ini telah melewati delapan periode kepemimpinan — angkanya naik satu setiap kali prosesmongodhidup ulang dan election diadakan kembali.electionDate: waktu primary saat ini terpilih — 17 Oktober 2026 pukul 13:05 UTC, tepat saat server latihan terakhir dinyalakan.electionId: identitas election yang dilaporkan lewathello; driver membandingkannya untuk mengenali pergantian primary dari klien.
Timeline Failover: Deteksi sampai Primary Baru #
Berapa lama failover berlangsung? Jawabannya terukur dan bisa dibaca dari konfigurasi:
const cfg = rs.conf().settings
({
heartbeatIntervalMillis: cfg.heartbeatIntervalMillis,
heartbeatTimeoutSecs: cfg.heartbeatTimeoutSecs,
electionTimeoutMillis: cfg.electionTimeoutMillis
})Output yang Dihasilkan:
{
heartbeatIntervalMillis: 2000,
heartbeatTimeoutSecs: 10,
electionTimeoutMillis: 10000
}Ketiga angka tersebut membentuk lini masa failover pada cluster tiga anggota:
t=0: primary berhenti membalas — karena mati, restart, atau terisolasi jaringan.t ≤ 10detik: secondary tidak menerima heartbeat selamaheartbeatTimeoutSecs: 10dan menyatakan anggota itu tidak sehat.t ≈ 10detik: tenggatelectionTimeoutMillis: 10000terlampaui tanpa primary baru; secondary terlengkap mengajukan pencalonan.- Pemungutan suara: kandidat meminta suara anggota lain; mayoritas memberi persetujuan, term naik, primary baru aktif.
Dalam praktik, total waktu pemulihan biasanya berkisar 10 sampai 12 detik untuk konfigurasi default — sebagian besar menunggu kedua tenggat waktu di atas, sisanya proses voting itu sendiri yang hanya butuh sepersekian detik.
Aplikasi Selama Tanpa Primary #
Jendela tanpa primary berdampak berbeda pada write dan read:
- Write ditolak. Aplikasi yang mengirim write ke node tanpa hak menulis menerima galat
NotWritablePrimary(kode galat10107). Driver mode replica set tidak mengirim write ke node yang bukan primary; selama jendela kosong, driver menahan write di sisi klien sampai batas server selection timeout — setelah itu operasi gagal dan aplikasi harus mencoba ulang. - Read bergantung pada read preference. Baca yang menuntut primary ikut tertahan; baca dengan
secondaryPreferredataunearesttetap dilayani secondary yang sehat. Pilihan dan konsekuensinya dibahas di Chapter Read Preference.
Masa tanpa primary adalah harga yang dibayar demi jaminan satu penulis tunggal. Write concern majority membuat dampaknya lebih terasa ringan: write yang sudah diakui mayoritas pasti dimiliki primary baru, sehingga tidak ada data yang perlu digulung.
Priority Mengarahkan Hasil #
Bila beberapa anggota sama-sama sehat dan mutakhir, priority menentukan siapa yang berhak menang: anggota dengan priority tertinggi menang election begitu datanya paling baru, dan anggota dengan priority sama tinggi bersaing lewat kelengkapan data. Perilaku ini dipakai untuk menjauhkan primary dari anggota yang lemah — misalnya memberi priority rendah pada node dengan disk pelan, atau priority 0 pada anggota regional.
Mongosh juga mengenal situasi kebalikannya: primary baru yang terpilih padahal ada secondary lebih maju. Setelan catchUpTakeoverDelayMillis: 30000 memberi primary baru waktu mengejar; setelah 30 detik, secondary yang lebih maju boleh mengambil alih lewat election baru.
rs.stepDown: Failover yang Direncanakan #
Untuk maintenance, operator memaksa primary menyerahkan jabatan tanpa menunggu kegagalan:
// mdtest: skip — memaksa election di server latihan bersama
db.adminCommand({ replSetStepDown: 60, force: false })Perintah di atas meminta primary turun menjadi secondary selama 60 detik dan segera memicu election di antara secondary yang tersisa. Opsi force: false membuat perintah gagal bila tidak ada secondary yang siap menggantikan — pengaman agar maintenance tidak justru melumpuhkan cluster. Pola lengkapnya: rs.stepDown() → kerjakan maintenance pada node itu → nyalakan kembali → node bergabung sebagai secondary, dan hanya merebut posisi primary bila priority-nya memang tertinggi.
Rangkuman #
- Election dipicu primary yang hilang, inisiasi set, atau
rs.stepDown()untuk maintenance; kandidat harus mutakhir dan bukan priority 0. - Kandidat butuh suara mayoritas
n+1dari2n+1anggota voting — mekanisme anti dua primary saat jaringan terbelah. - Timeline failover mengikuti
heartbeatTimeoutSecs: 10danelectionTimeoutMillis: 10000; pemulihan tipikal 10–12 detik. - Selama tanpa primary, write ditolak dengan galat
NotWritablePrimary(10107) atau ditahan driver; baca non-primary tetap berjalan. prioritymengarahkan pilihan;replSetStepDownadalah failover terencana dengan pengamanforce: false.
Primary baru sudah berdiri — pertanyaan berikutnya adalah ke node mana aplikasi sebaiknya membaca. Chapter Read Preference menjawabnya.