Expand description
noraft: Minimal, feature-complete Raft for Rust - no I/O, no dependencies.
Node is the main struct that represents a Raft node.
It offers methods for creating a cluster, proposing commands, updating cluster configurations,
handling incoming messages, snapshotting, and more.
Node itself does not execute I/O operations.
Instead, it generates Actions that represent pending I/O operations.
How to execute these actions is up to the crate user.
noraft keeps its API surface minimal and lets users choose and integrate their own I/O layer freely.
Except for a few optimizations, noraft is a very straightforward (yet efficient) implementation of the Raft algorithm.
This crate focuses on the core part of the algorithm.
So, offering various convenience features (which are not described in the Raft paper) is left to the crate user.
The following example outlines a basic usage flow of this crate:
// Start a node.
let mut node = noraft::Node::start(noraft::NodeId::new(0));
// Create a three nodes cluster.
let commit_position = node.create_cluster(&[
noraft::NodeId::new(0),
noraft::NodeId::new(1),
noraft::NodeId::new(2),
]);
// Execute actions requested by the node until the cluster creation is complete.
while node.get_commit_status(commit_position).is_in_progress() {
for action in node.actions_mut() {
// How to execute actions is up to the crate user.
match action {
noraft::Action::SetElectionTimeout => { /* ... */ },
noraft::Action::SaveCurrentTerm => { /* ... */ },
noraft::Action::SaveVotedFor => { /* ... */ },
noraft::Action::BroadcastMessage(_) => { /* ... */ },
noraft::Action::AppendLogEntries(_) => { /* ... */ },
noraft::Action::SendMessage(_, _) => { /* ... */ },
noraft::Action::InstallSnapshot(_) => { /* ... */ },
}
}
// If the election timeout is expired, handle it.
if is_election_timeout_expired() {
node.handle_election_timeout();
}
// If a message is received, handle it.
while let Some(message) = try_receive_message() {
node.handle_message(&message);
}
}
// Propose a user-defined command.
let commit_position = node.propose_command();
// Execute actions as before.
Structs§
- Actions
Actionsrepresents a prioritized set ofActions that are issued by aNodebut have not yet been executed.- Cluster
Config - Cluster configuration (membership).
- Log
- In-memory representation of a
Nodelocal log. - LogEntries
- Log entries.
- LogIndex
- Log index.
- LogPosition
- Log position (
TermandLogIndex). - Node
- Raft node.
- Node
Generation - Node generation (
u64). - NodeId
- Node identifier (
u64). - Term
- Term.