Lập trình Go 22/09/2026 12 phút

Consensus với Raft trong Go: bầu leader và nhân bản log qua đa số

Khóa Redis có thể sai khi failover. Raft giải bài toán đồng thuận: nhiều node thống nhất một log lệnh dù có node chết, miễn đa số còn sống. Bài dựng cụm 3 node hashicorp/raft thật trong Go: đo bầu leader, nhân bản log đồng nhất, và failover — leader chết thì cụm tự bầu leader mới ở term cao hơn.

Lập trình 22/09/2026 8 phút

Raft trong etcd ba node: đo thật — mất một follower không chậm đi, giết leader là 1,07 giây không ghi được, mất hai node là 0/20 lần ghi nhưng đọc serializable vẫn 20/20

Cụm etcd 3.5.16 ba node, bench Go dùng cả ba endpoint, dừng và giết node bằng docker từ shell. Ba node sống: ghi p50 0,38 ms, đọc linearizable 0,22 ms, serializable 0,08 ms. Dừng một follower: ghi 300/300, p50 0,29 ms, không chậm đi vì đa số vẫn còn. Giết leader giữa lúc ghi liên tục: 1,07 giây không ghi được rồi tự hồi phục với leader mới. Dừng hai node: ghi 0/20, đọc linearizable 0/20, nhưng đọc serializable 20/20 — node sót lại vẫn trả bản cuối nó có. Khởi động lại: ghi được sau 0,45 giây. Cái giá của đồng thuận: 3 node 0,37 ms so với 1 node 0,15 ms, và fsync trên đĩa ảo chỉ 0,06 ms.