Skenario
Tiap skenario adalah satu situasi yang dibangun tangan untuk menunjukkan satu hal — pemilihan yang bersih, dua calon yang saling mengunci, jaringan yang terbelah. Buka salah satu, lalu tekan Jalankan.
Setiap skenario adalah (config, seed, actions, flags) dan satu fenomena yang ingin ditunjukkan. Semuanya replay identik, dan Anda bisa mengambil alih kapan saja.
Pemilihan bersih
Jaringan: Kehilangan pesan — kondisi normal Raftclean-election
Lima node, jaringan yang kehilangan sebagian pesan. Satu leader terpilih, lalu entry direplikasi dan commit.
Fenomena
Leader terpilih dari keadaan awal dan entry dari klien berhasil commit, di bawah jaringan yang kehilangan pesan — kasus biasa, yang layak dilihat sebelum apa pun dirusak.
- nodes:
- 5
- seed:
- 4
- drop:
- 8.0%
- actions:
- 3
Split vote
Jaringan: Tenang — tidak ada pesan yang hilangsplit-vote
Election timeout yang hampir seragam membuat beberapa node mencalonkan diri bersamaan. Tidak ada tiebreak — jitter timeout yang menyelesaikannya.
Fenomena
Dengan randomisasi election timeout dipersempit hampir habis, para candidate bertabrakan dan suara terbelah. Raft tidak punya aturan tiebreak: perpecahan itu selesai semata-mata karena putaran timeout berikutnya berbeda. Untuk inilah randomisasi ada.
- nodes:
- 5
- seed:
- 3
- drop:
- 0.0%
- actions:
- 1
Leader terdampar di minoritas
Jaringan: Tenang — tidak ada pesan yang hilangpartition-stranded-leader
Leader terpotong ke sisi minoritas. Ia tetap mengira dirinya leader, tetapi tidak bisa commit apa pun; sisi mayoritas memilih leader baru di term yang lebih tinggi.
Fenomena
Leader yang terpotong ke minoritas tetap mengira dirinya memimpin, dan tetap menerima entry dari klien — tetapi tidak akan pernah bisa meng-commit-nya, karena commit butuh mayoritas. Sisi mayoritas memilih leader baru di term yang lebih tinggi, dan ketika partisi tersambung kembali leader basi itu mengetahui term tersebut lalu mundur. Mematikan aturan step-down meninggalkan dua leader dalam satu term.
- nodes:
- 5
- seed:
- 13
- drop:
- 0.0%
- actions:
- 5
Menjaga: Election Safety · §5.1
Divergensi log dan perbaikannya
Jaringan: Tenang — tidak ada pesan yang hilanglog-divergence-repair
Dua sisi partisi menerima entry berbeda pada index yang sama. Setelah heal, leader baru menelusuri nextIndex mundur sampai log cocok, lalu menimpa ekor yang menyimpang.
Fenomena
Leader lama, terdampar bersama satu follower, menambahkan entry yang tidak akan pernah bisa commit. Mayoritas memilih leader baru yang menambahkan entry berbeda pada index yang sama. Setelah partisi sembuh, AppendEntries consistency check gagal, leader menelusuri nextIndex mundur sampai kedua log bertemu, lalu menimpa ekor yang menyimpang. Inilah tampilan ciri khasnya: baris yang gagal sejajar, lalu sejajar kembali.
- nodes:
- 5
- seed:
- 8
- drop:
- 0.0%
- actions:
- 8
Leader jatuh di tengah replikasi
Jaringan: Tenang — tidak ada pesan yang hilangleader-crash-mid-replication
Leader menerima entry lalu jatuh sebelum mayoritas menyimpannya. Leader berikutnya memutuskan nasib entry itu.
Fenomena
Leader menerima sebuah entry lalu jatuh sebelum mayoritas menyimpannya. Entry itu tidak committed dan juga tidak dibuang: apakah ia bertahan sepenuhnya bergantung pada apakah leader berikutnya kebetulan memilikinya — dan itulah yang diputuskan oleh election restriction.
- nodes:
- 5
- seed:
- 4
- drop:
- 0.0%
- actions:
- 7
Kandidat dengan log tertinggal
Jaringan: Tenang — tidak ada pesan yang hilangelection-restriction-overwrite
Satu node terisolasi selama cluster meng-commit beberapa entry. Term-nya menanjak, lognya tidak. Election restriction yang menahannya agar tidak pernah menang.
Fenomena
Node yang terisolasi mencalonkan diri berkali-kali, sehingga term-nya menanjak jauh di atas yang lain sementara lognya tetap pendek. Ketika partisi sembuh, term tingginya memaksa election baru — dan election restriction adalah satu-satunya yang mencegahnya menang dengan log yang kehilangan entry yang sudah committed. Matikan restriction itu dan entry tersebut hilang.
- nodes:
- 5
- seed:
- 3
- drop:
- 0.0%
- actions:
- 6
Menjaga: Leader Completeness · §5.4.1
Figure 8
Jaringan: Tenang — tidak ada pesan yang hilangfigure-8
Skenario dari makalah, dimainkan langsung. Sebuah entry dari term lama tersimpan di mayoritas — dan masih bisa ditimpa.
Fenomena
Figure 8 dari makalah, dimainkan di dalam simulator. Dimulai dari panel (a): S1 memimpin term 2 dan baru mereplikasi index 2 ke S2 saja. S1 jatuh, S5 memenangkan term 3 dan menulis entry berbeda di index 2, S1 kembali dan memenangkan term 4 lalu mendorong index 2 miliknya ke mayoritas — dan entry itu tetap belum aman. Matikan current-term commit rule dan ia dinyatakan committed, lalu ditimpa. Reproduksi persis panel demi panel ada di tests/figure8.
- nodes:
- 5
- seed:
- 1
- drop:
- 0.0%
- actions:
- 20
Menjaga: State Machine Safety · §5.4.2
Memilih dua kali setelah restart
Jaringan: Tenang — tidak ada pesan yang hilangdouble-vote-restart
Satu node memberi suara, jatuh, lalu hidup kembali. Karena votedFor persistent, ia menolak memilih lagi di term yang sama.
Fenomena
Seorang follower memberi suara, jatuh, lalu hidup kembali. Karena votedFor adalah persistent state, ia mengingatnya dan menolak memilih untuk kedua kalinya di term yang sama. Buat votedFor volatile dan node yang sama menyerahkan mayoritas yang dibutuhkan candidate kedua, menghasilkan dua leader dalam satu term.
- nodes:
- 3
- seed:
- 11
- drop:
- 0.0%
- actions:
- 5
Menjaga: Election Safety · §5.2
Mengganti anggota cluster
Jaringan: Tenang — tidak ada pesan yang hilangmembership-change
Cluster {0,1,2} berubah menjadi {2,3,4}. Perubahan lewat konfigurasi gabungan C-old,new; tanpa itu kedua sisi bisa memilih leader sendiri-sendiri di term yang sama.
Fenomena
Cluster tidak bisa berpindah langsung dari C-old ke C-new, karena tidak ada satu saat pun di mana semua server berpindah bersamaan — untuk sesaat sebagian percaya C-old dan sebagian C-new. Di sini {0,1} adalah mayoritas dari {0,1,2} dan {3,4} adalah mayoritas dari {2,3,4}, dan keduanya tidak beririsan: itulah Figure 10. Dengan joint consensus, konfigurasi peralihan C-old,new menuntut mayoritas dari *kedua* himpunan sekaligus, jadi ketika partisi memotong cluster tidak ada sisi yang bisa menang — cluster berhenti, dan itu benar. Matikan aturannya dan kedua sisi memilih leader di term yang sama.
- nodes:
- 5
- seed:
- 15
- drop:
- 0.0%
- actions:
- 5
Menjaga: Election Safety · §6
Snapshot untuk follower yang tertinggal
Jaringan: Tenang — tidak ada pesan yang hilanglog-compaction
Satu follower terputus selama cluster terus meng-commit. Leader sudah membuang entry yang dibutuhkannya, jadi AppendEntries tidak bisa mengejarnya — yang dikirim adalah snapshot.
Fenomena
Setiap server membuat snapshot sendiri-sendiri begitu ia sudah menerapkan cukup banyak entry, lalu membuang entry di bawahnya — hanya sampai lastApplied, tidak pernah lebih. Ketika partisi sembuh, node 4 begitu tertinggal sehingga nextIndex untuk dirinya jatuh ke dalam rentang yang sudah dibuang leader. Pada titik itu AppendEntries tidak bisa lagi menolongnya: entry yang diperlukan sudah tidak ada. Leader mengirim InstallSnapshot, dan node 4 mengganti state machine-nya sekaligus. Di ledger, baris di bawah titik snapshot berubah menjadi arsir — bukan kosong, karena entry itu tidak hilang, melainkan sudah terlipat ke dalam state.
- nodes:
- 5
- seed:
- 3
- drop:
- 0.0%
- actions:
- 9
Consistency check dimatikan
Jaringan: Tenang — tidak ada pesan yang hilanglog-matching-break
Leader menyelidiki follower pada index yang sudah menyimpang. Dengan consistency check aktif ia ditolak dan memperbaiki; tanpa check itu ia diterima, dan dua log sepakat di satu (index, term) di atas prefix yang berbeda.
Fenomena
AppendEntries consistency check baru benar-benar terasa ketika nextIndex menunjuk tepat pada index yang sudah menyimpang. Di sini node 4 memegang term 3 di index 3 sementara leader term 4 memegang term 2 di sana. Probe pertama leader jatuh persis di index itu. Dengan check aktif, node 4 menolak, leader menelusuri mundur, dan ekor yang menyimpang ditimpa. Dengan check dimatikan, node 4 menerimanya, leader mengira log mereka cocok, lalu menambahkan entry baru di atas prefix yang berbeda — dan keduanya kini memuat (index 4, term 4) di atas isi yang tidak sama. Lebih buruk lagi, leader menghitung node 4 sebagai replika saat meng-commit.
- nodes:
- 5
- seed:
- 1
- drop:
- 0.0%
- actions:
- 2
Menjaga: Log Matching · §5.3
Mencalonkan diri tanpa menaikkan term
Jaringan: Tenang — tidak ada pesan yang hilangdouble-candidacy
Node 1 sudah memilih node 0 di term 1. Ia mencalonkan diri lagi — dengan term dinaikkan itu pemungutan suara baru; tanpa dinaikkan ia menimpa suaranya sendiri di term yang sama.
Fenomena
Menaikkan term saat mencalonkan diri adalah yang membuat sebuah kampanye menjadi pemungutan suara baru. Node 0 memimpin term 1 dengan suara dari dirinya dan node 1; node 2 tidak pernah menerima permintaan suaranya, jadi votedFor-nya masih kosong. Setelah node 0 terpotong, node 1 mencalonkan diri. Dengan aturan aktif ia pindah ke term 2, dan dua leader itu berada di term berbeda — bukan pelanggaran. Tanpa aturan itu ia berkampanye di dalam term 1, menimpa suaranya sendiri untuk node 0, dan node 2 yang belum memilih memberinya mayoritas kedua di term yang sama.
- nodes:
- 3
- seed:
- 1
- drop:
- 0.0%
- actions:
- 2
Menjaga: Election Safety · §5.2