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.
Mulai di sini
Kasus biasa, lalu kenapa timeout dibuat acak.
Pemilihan bersih
Jaringan: Kehilangan pesan — kondisi normal RaftLima node, jaringan yang kehilangan sebagian pesan. Satu leader terpilih, lalu entry direplikasi dan commit.
Yang diperlihatkan
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.
5 nodeseed 4clean-election
Split vote
Jaringan: Tenang — tidak ada pesan yang hilangElection timeout yang hampir seragam membuat beberapa node mencalonkan diri bersamaan. Tidak ada tiebreak — jitter timeout yang menyelesaikannya.
Yang diperlihatkan
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.
5 nodeseed 3split-vote
Saat ada yang gagal
Crash dan partisi, di bawah Raft yang tidak diubah.
Leader terdampar di minoritas
Jaringan: Tenang — tidak ada pesan yang hilangLeader 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.
Yang diperlihatkan
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.
5 nodeseed 13partition-stranded-leader
Menjaga: Election Safety · §5.1
Divergensi log dan perbaikannya
Jaringan: Tenang — tidak ada pesan yang hilangDua sisi partisi menerima entry berbeda pada index yang sama. Setelah heal, leader baru menelusuri nextIndex mundur sampai log cocok, lalu menimpa ekor yang menyimpang.
Yang diperlihatkan
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.
5 nodeseed 8log-divergence-repair
Leader jatuh di tengah replikasi
Jaringan: Tenang — tidak ada pesan yang hilangLeader menerima entry lalu jatuh sebelum mayoritas menyimpannya. Leader berikutnya memutuskan nasib entry itu.
Yang diperlihatkan
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.
5 nodeseed 4leader-crash-mid-replication
Matikan sebuah aturan
Tiap skenario mematikan satu aturan dan memperlihatkan propertinya gagal.
Kandidat dengan log tertinggal
Jaringan: Tenang — tidak ada pesan yang hilangSatu node terisolasi selama cluster meng-commit beberapa entry. Term-nya menanjak, lognya tidak. Election restriction yang menahannya agar tidak pernah menang.
Yang diperlihatkan
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.
5 nodeseed 3election-restriction-overwrite
Menjaga: Leader Completeness · §5.4.1
Figure 8
Jaringan: Tenang — tidak ada pesan yang hilangSkenario dari makalah, dimainkan langsung. Sebuah entry dari term lama tersimpan di mayoritas — dan masih bisa ditimpa.
Yang diperlihatkan
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.
5 nodeseed 1figure-8
Menjaga: State Machine Safety · §5.4.2
Memilih dua kali setelah restart
Jaringan: Tenang — tidak ada pesan yang hilangSatu node memberi suara, jatuh, lalu hidup kembali. Karena votedFor persistent, ia menolak memilih lagi di term yang sama.
Yang diperlihatkan
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.
3 nodeseed 11double-vote-restart
Menjaga: Election Safety · §5.2
Consistency check dimatikan
Jaringan: Tenang — tidak ada pesan yang hilangLeader 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.
Yang diperlihatkan
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.
5 nodeseed 1log-matching-break
Menjaga: Log Matching · §5.3
Mencalonkan diri tanpa menaikkan term
Jaringan: Tenang — tidak ada pesan yang hilangNode 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.
Yang diperlihatkan
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.
3 nodeseed 1double-candidacy
Menjaga: Election Safety · §5.2
Lanjutan: §6 dan §7
Perubahan keanggotaan dan log compaction.
Mengganti anggota cluster
Jaringan: Tenang — tidak ada pesan yang hilangCluster {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.
Yang diperlihatkan
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.
5 nodeseed 15membership-change
Menjaga: Election Safety · §6
Snapshot untuk follower yang tertinggal
Jaringan: Tenang — tidak ada pesan yang hilangSatu follower terputus selama cluster terus meng-commit. Leader sudah membuang entry yang dibutuhkannya, jadi AppendEntries tidak bisa mengejarnya — yang dikirim adalah snapshot.
Yang diperlihatkan
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.
5 nodeseed 3log-compaction