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.

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

Phân vùng mạng thật bằng iptables: cắt một nút etcd 20 giây — thiểu số từ chối ghi sau đúng 1,1 s nhưng vẫn trả lời đọc serializable cũ 20 giây, cô lập leader làm đa số mất 2 s, và lease biến mất ở đa số 0,71 s trước khi người giữ hay

Cụm etcd ba nút, cắt mạng thật bằng iptables trong network namespace của từng container, client Go đo cả ba nút mỗi 100 ms. Cô lập một follower: hai nút còn lại ghi 202/202, nút bị cắt ghi 1/21 và đọc tuyến tính 1/21 nhưng đọc serializable 21/21 với dữ liệu cũ dần tới 20 giây, không một lỗi nào. Cô lập leader: đa số mất 2 giây bầu lại, leader cũ không nhận một ghi nào. Tách rời cả ba: không ai ghi được sau 0,2 giây. Lease TTL 5 s giữ qua nút bị cắt: đa số thấy khoá mất ở +5,24 s, người giữ mới biết ở +5,95 s. Khi leader bị cô lập, leader mới gia hạn mọi lease nên khoá sống tới +9,33 s.