Expand description
§raft-io
A from-scratch implementation of the Raft consensus algorithm, built as a clean, embeddable library rather than a framework.
The protocol core is a deterministic state machine: you feed it
Events (logical ticks, inbound Messages, client proposals) and it
returns Actions (send these messages, apply this committed command).
Time, networking, and storage are your concern, injected through the
RaftLog and RaftTransport trait seams. That separation is exactly
what makes the consensus core provable: it contains no wall clock and no
I/O, so an entire cluster’s behaviour can be reproduced from a seed and a
sequence of events.
§Status
This is v0.8: alpha — feature complete, hardened, in consumer
integration. The full protocol — election (with pre-vote disruption
protection), replication, durable crash recovery (persistence), snapshots,
membership changes, and leadership transfer — is in place and verified by a
kitchen-sink adversarial test suite that asserts all five Raft safety
properties under combined partitions, message loss/reorder/duplication,
membership churn, and snapshotting, plus an application-level suite that
drives a replicated key-value store to convergence under the same faults. The
public traits and the wire and WAL formats are frozen (see docs/PROTOCOL.md);
the decode path is fuzzed. Additions in this line stay MINOR-compatible — the
pre-vote messages, for instance, are new #[non_exhaustive] enum variants that
leave every existing wire and WAL encoding untouched. See docs/API.md for the
full surface.
§The three tiers
- Tier 1 — the common case in a handful of calls, no builder and no
generic to name:
RaftNode::newwith aRaftConfigand the default in-memoryMemoryLog. - Tier 2 —
RaftConfig’s builder for tuning election and heartbeat timing. - Tier 3 — the
RaftLog/RaftTransporttraits for plugging in a durable store or a real transport.
§Example — a single-node cluster elects itself and commits
use raft_io::{Action, Event, RaftConfig, RaftNode};
// One node, no peers: it reaches quorum (itself) the moment it times out.
let mut node = RaftNode::new(RaftConfig::single(1));
// Drive logical ticks until the node becomes leader.
while !node.is_leader() {
let _ = node.step(Event::Tick).expect("tick never fails in memory");
}
assert_eq!(node.leader(), Some(1));
// A leader commits its own proposals immediately (quorum of one).
let actions = node.step(Event::Propose(b"set x = 1".to_vec())).unwrap();
assert!(actions.iter().any(|a| matches!(a, Action::Apply { .. })));
assert_eq!(node.commit_index(), 1);Modules§
- framing
framing - Typed wire framing for protocol messages.
- prelude
- The everyday surface, for
use raft_io::prelude::*;.
Structs§
- Append
Entries - The leader’s replicate-and-heartbeat RPC.
- Append
Entries Reply - A follower’s response to an
AppendEntries. - Hard
State - The state Raft must persist before responding to any RPC.
- Install
Snapshot - A leader’s transfer of a
Snapshotto a follower too far behind to replicate entry by entry. - Install
Snapshot Reply - A follower’s response to an
InstallSnapshot. - LogEntry
- A single entry in the replicated log.
- Memory
Log - An in-memory
RaftLogbacked by aVec. - Memory
Transport - An in-memory
RaftTransportthat records outgoing messages. - PreVote
- A candidate’s pre-vote probe, sent before it commits to a real election.
- PreVote
Reply - A peer’s response to a
PreVote. - Raft
Config - Configuration for a single
RaftNode. - Raft
Node - A node in a Raft cluster: the deterministic consensus state machine.
- Request
Vote - A candidate’s request for a vote in an election.
- Request
Vote Reply - A peer’s response to a
RequestVote. - Snapshot
- A point-in-time capture of the application’s state machine, with the log position it covers.
- Timeout
Now - A leader’s signal telling
targetto start an election immediately. - WalLog
persistence - A durable
RaftLogwhose entries and hard state survive a process restart.
Enums§
- Action
- An instruction
RaftNode::stepreturns for the caller to carry out. - Entry
Kind - What a
LogEntrycarries. - Error
- Everything that can go wrong while driving a
RaftNode. - Event
- An input handed to
RaftNode::step. - Message
- Any message a node can send or receive.
- Role
- The role a node currently plays in the consensus protocol.
Traits§
- RaftLog
- Storage for a node’s persistent state: its log entries and its
HardState. - Raft
Transport - Delivers protocol messages to peers.