Raft Simulator
Simulator konsensus Raft yang membiarkan Anda mematikan tiap aturan keamanan dan melihat jaminannya rusak

- simulasi acak dengan semua jaminan terpenuhi
- 10.000
- aturan yang bisa dimatikan
- 7
- jaminan keamanan dicek setiap kejadian
- 5
- skenario ajar yang disusun manual
- 12
Di halaman ini
Masalahnya
Engineer yang belajar sistem terdistribusi cepat bertemu Raft. Raft adalah algoritma kesepakatan di balik etcd, Consul, dan CockroachDB. Algoritma ini menjaga sekelompok server tetap sepakat pada satu catatan bersama, bahkan saat mesin mati atau jaringan terbelah. Raft dirancang agar mudah diajarkan, tapi alat-alat pengajarannya berhenti di titik yang sama.
Visualisasi standarnya, RaftScope, ditulis oleh penulis makalahnya sendiri. RaftScope menampilkan pemilihan, pesan, dan log yang bertambah dengan baik. Yang tidak ditampilkan adalah alasan di balik setiap aturan. Dari situ muncul dua celah. Belum ada yang memeriksa lima jaminan keamanan Raft selama simulasi berjalan. Belum ada juga yang membiarkan kita mematikan satu aturan untuk melihat apa yang rusak. Figure 8 di makalahnya membuat argumen persis seperti itu, tapi dalam bentuk diagram diam yang sulit dicerna kebanyakan pembaca.
Saya membuat Raft Simulator untuk engineer yang belajar sistem terdistribusi, mahasiswa yang sedang membaca makalahnya, serta pewawancara atau pengajar yang butuh contoh langsung.
Yang saya bangun
Seluruh simulasi bisa diulang persis
Pengaturan, seed, dan aksi pengguna yang sama selalu menghasilkan jalannya simulasi yang sama persis, di mesin mana pun. Saya memakai jam virtual, sehingga seribu detik simulasi lewat dalam hitungan mikrodetik. Setiap server adalah state machine yang berdiri sendiri, dan semua angkanya bilangan bulat. Keputusan ini memberi fitur putar mundur, tautan yang bisa dibagikan, laporan bug yang bisa diulang, dan pengujian acak berskala besar.
Aturannya saya tulis dari makalah, lalu diperiksa terpisah
Saya mengimplementasikan logika server aturan demi aturan dari Figure 2 di makalahnya, dan setiap aturan menyebut bagian yang diimplementasikannya. Alat ajar yang sedikit keliru akan mengajarkan Raft yang keliru dengan animasi yang meyakinkan. Pemeriksa keamanannya tidak berbagi kode dengan algoritmanya. Pemeriksa menilai lima jaminan dari definisi yang dipublikasikan setelah setiap kejadian, jadi ia tidak mungkin ikut membenarkan bug di algoritmanya.
Setiap aturan bisa dimatikan, dan sakelarnya ditegakkan
Tujuh aturan bisa dimatikan. Masing-masing hanya dicek di satu tempat dalam kode, jadi tidak ada salinan tersembunyi yang diam-diam tetap menegakkannya. Setiap aturan punya tes yang membuktikan jaminannya rusak saat aturan dimatikan dan tetap utuh saat dinyalakan. Begitu satu aturan dimatikan, simulasi ditandai "modified Raft" di layar dan di tautan yang dibagikan, supaya tidak ada yang mengira simulasi rusak itu algoritma aslinya.
Peluncuran menunggu tiga pemeriksaan kebenaran
Saya baru merilis setelah tiga pemeriksaan independen lolos: pemeriksa keamanan yang terpisah, pengujian acak terhadap lima jaminan, dan satu kasus uji untuk setiap aturan Figure 2. Saya juga membangun dua fitur yang awalnya tidak masuk versi pertama: pemadatan log dan perubahan keanggotaan cluster. Keduanya mengubah model data. Ukuran cluster menjadi variabel, sehingga setiap pengecekan mayoritas kini bekerja berdasarkan konfigurasi.
Dua belas skenario, masing-masing menjelaskan satu hal
Simulasi acak biasanya membosankan atau justru sulit diikuti. Karena itu saya menulis 12 skenario secara manual, masing-masing menunjukkan satu fenomena, seperti suara terbelah, leader yang terisolasi setelah partisi, atau Figure 8 itu sendiri. Setiap skenario dilindungi tes determinisme.
Hasilnya
Raft Simulator sudah live dan terbuka untuk umum, bisa dipasang, dan jalan penuh secara offline. Tampilan utamanya adalah buku log. Log setiap server disusun dalam kolom yang sejajar per posisi, jadi perbedaan terlihat sebagai garis yang patah dan perbaikannya terlihat saat leader menimpanya. Saat sebuah jaminan dilanggar, aplikasi menyebut properti, posisi, term, dan server yang terlibat. Setiap simulasi bisa dikirim sebagai tautan.
Kelima jaminan keamanan tetap terpenuhi di 10.000 simulasi acak dengan pemadatan log dan perubahan keanggotaan aktif. Aplikasinya berbahasa Inggris dengan terjemahan Indonesia yang lengkap. Aplikasi ini menautkan RaftScope dan makalahnya, dan hanya mengklaim sakelar aturan dan pemeriksaannya sebagai hal baru. Saya membangunnya dalam dua hari pada Agustus 2026.
Di balik layarDetail teknis untuk engineer
- Simulasinya berupa
(config, seed, actions, ablation flags) → EventTrace, identik byte demi byte di mana pun. Priority queue menggerakkan jam virtual; seri dipecahkan dengan nomor urut eksplisit. Tidak adasetTimeoutdi logika simulasi, tidak ada float. - Setiap server adalah
step(state, input, config) → { state, outbox, timers }, dengan PRNG ber-seed (lib/sim/prng.ts) yang dibawa di dalam state. lib/invariantshanya mengimpor tipe darilib/raft. Modul ini memeriksa Election Safety, Leader Append-Only, Log Matching, Leader Completeness, dan State Machine Safety.- Ketujuh flag ablasi ada di
lib/raft/rules.ts, masing-masing dicek di satu call site bernama. Snapshot tidak punya sakelar, karena aturan 6 dan 7 di Figure 13 menyangkut liveness, bukan keamanan. - Aturan diberi komentar seperti
// Figure 2, AppendEntries RPC, receiver rule 2. - Pemadatan log (§7, Figure 13) memaksa log menjadi bundel entri yang disimpan ditambah titik snapshot, dan hanya bisa diindeks lewat
lib/raft/log.ts. Default-nya mati (snapshotThreshold: 0) agar fixture lama tetap menghasilkan trace yang sama. Transfer snapshot bertahap tidak dimodelkan. - Perubahan keanggotaan (§6, joint consensus) mengganti
majority(n)denganhasQuorum(configuration, predicate), yang mensyaratkan mayoritas di kedua bagian. Aturan "minimum election timeout" di §6 menjadi flagheardFromLeaderyang dihapus oleh timer pemilihan. - Figure 8 ada dua kali: tes persis di
tests/figure8dengan pengarah yang hanya mengganti jaringan, dan skenario interaktif yang butuh satu atau dua pemilihan tambahan. - Audit kontras menaikkan teks sekunder dari 2,63:1 ke 5,08:1. Peran node dibedakan dengan bentuk selain warna.
- Simulasi jalan di Web Worker. CI menjalankan suite Figure 2, Figure 13, §6, determinisme, Figure 8, ablasi, dan fuzz; fuzz menjadi gerbang deploy. Default 2.000 seed per run, bisa diatur lewat
FUZZ_RUNS. - Proyek ini bernama Mufakat selama M0–M7, lalu diganti nama dan default bahasanya dipindah ke Inggris di hari terakhir.
- Tiga dependensi runtime (Next.js 14.2, React, React DOM). JS first-load 149 KB gzip dari anggaran 250 KB. Service worker dibuat dari hasil export.
- 161 tes di 12 suite: 49 fixture Figure 2, 23 pemadatan, 23 ablasi, 16 keanggotaan, 38 determinisme, 5 Figure 8, 7 fuzz. ~11.500 baris TypeScript, 29 commit dari 4 sampai 5 Agustus 2026.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.