Memahami masalah distributed consensus, algoritma Raft (leader election, log replication, safety) yang digunakan di etcd/CockroachDB, serta konsep Paxos sebagai foundation distributed systems dan simulasi leader election manual

Setelah di episode 10 kita memahami CAP, PACELC, dan berbagai consistency models, pada episode ini kita masuk ke masalah paling fundamental dalam distributed system: bagaimana banyak node sepakat pada satu nilai? Ini adalah masalah consensus — dan tanpa solusi yang benar, distributed system tidak akan bisa bekerja.
Masalah consensus muncul di mana-mana: siapa yang menjadi leader? Apakah write sudah ter-replikasi ke cukup banyak node? Apakah data yang di-read adalah yang terbaru? Paxos dan Raft adalah dua algoritma yang menjawab pertanyaan-pertanyaan ini — dan menjadi fondasi etcd, CockroachDB, TiKV, dan banyak distributed database lainnya.
Distributed consensus adalah masalah: bagaimana membuat N node mencapai kesepakatan (agreement) pada satu nilai, meskipun beberapa node bisa gagal atau jaringan terputus.
Persyaratan:
Kemustahilan: di asynchronous network dengan satu Byzantine failure, consensus tidak bisa dicapai (Fischer-Lynch-Paterson). Tapi dengan model partial synchrony atau crash-stop failures, consensus bisa dipecahkan.
| Skenario | Masalah |
|---|---|
| Leader election | Siapa yang menjadi leader baru? |
| Log replication | Apakah semua node punya log yang sama? |
| Distributed lock | Siapa yang memegang lock saat ini? |
| Configuration change | Apakah semua node setuju config baru? |
Raft dirancang untuk lebih mudah dipahami dari Paxos, dengan outcome yang sama. Digunakan di etcd (Kubernetes backing store), CockroachDB, TiKV, dan HashiCorp Consul.
Node state: Follower → Candidate → Leader
Timeout: election timeout (randomized 150-300ms)
1. Semua node mulai sebagai Follower
2. Follower tidak menerima heartbeat dari Leader → timeout
3. Follower jadi Candidate → request votes dari node lain
4. Candidate dapat majority votes → jadi Leader
5. Leader kirim heartbeat ke semua FollowerRandomized timeout memastikan tidak ada split vote — salah satu Candidate akan menang duluan.
Client → Leader: append entry (command)
Leader → Follower: replicate log entry
Follower → Leader: acknowledge
Leader: setelah majority acknowledge → commit entry
Leader → Client: return successLog adalah sequence of commands yang identik di semua node. Setelah majority mengakui, entry di-commit dan di-apply ke state machine.
Raft menjamin:
| Sistem | Penggunaan Raft |
|---|---|
| etcd | Kubernetes backing store, configuration |
| CockroachDB | Distributed SQL, transaction coordination |
| TiKV | Distributed key-value store (TiDB) |
| HashiCorp Consul | Service discovery, KV store |
Paxos (Lamport, 1989) adalah algoritma consensus pertama yang praktis, tapi sangat sulit dipahami dan diimplementasi.
Phase 1 (Prepare):
Proposer → Acceptors: "prepare(N)" (N = proposal number)
Acceptors → Proposer: "promise" (jika N lebih tinggi dari yang pernah di-handle)
Phase 2 (Accept):
Proposer → Acceptors: "accept(N, value)"
Acceptors → Proposer: "accepted" (jika N sesuai promise)Basic Paxos hanya consensus untuk satu nilai. Multi-Paxos mengulangi untuk sequence of values — digunakan untuk log replication.
| Aspek | Paxos | Raft |
|---|---|---|
| Kompleksitas | Sangat kompleks | Lebih mudah dipahami |
| Implementasi | Sulit, banyak edge cases | Lebih straightforward |
| Performance | Optimal | Sangat mendekati optimal |
| Adoption | Google Chubby, Spanner | etcd, CockroachDB, Consul |
Note
Untuk system design interview, Raft sudah cukup sebagai pemahaman consensus. Paxos penting untuk konteks historical dan untuk memahami paper Google Spanner/Chubby. Jangan terjebak detail implementasi — fokus pada konsep: leader election + log replication + safety.
Mari simulasi bagaimana Raft election bekerja dengan 3 node:
Awal: Node A (Follower), Node B (Follower), Node C (Follower)
Step 1: Node A timeout → jadi Candidate (term 1)
Step 2: Node A kirim RequestVote ke B dan C
Step 3: Node B vote untuk A (A punya log yang lebih lengkap)
Step 4: Node C vote untuk A
Step 5: Node A dapat 2/3 votes → jadi Leader (term 1)
Step 6: Node A kirim AppendEntries heartbeat ke B dan C
Step 7: Semua node tahu A adalah Leader
Simulasi failure:
Step 8: Node A crash!
Step 9: Node B timeout → jadi Candidate (term 2)
Step 10: Node B kirim RequestVote ke C
Step 11: Node C vote untuk B
Step 12: Node B dapat 2/3 votes → jadi Leader (term 2)
Step 13: Node A recover → lihat term 2 → jadi Follower
Log tetap konsisten: semua committed entry ada di A, B, dan CNetwork partition: A (leader) terisolasi dari B dan C
Di partition A: A tetap kirim heartbeat tapi tidak ada response
Di partition B, C: B timeout → election → B jadi leader (term 2)
Saat partition heal: A lihat term 2 → mundur jadi follower
Semua committed entry tetap konsisten (sudah majority)Inti yang harus dibawa pulang:
Di episode 12 selanjutnya kita akan membahas replication strategies lanjut — leader-follower async vs semi-sync vs sync, multi-leader active-active dengan conflict resolution, dan leaderless (Dynamo-style) quorum read/write. Replication adalah bagaimana data didistribusikan untuk reliability dan performance!