#distributed #consensus #raft

rast

A toy implementation of the raft consistency protocol focused on speed

1 unstable release

0.1.0-alpha.0 Jun 3, 2020

#662 in Algorithms

Apache-2.0

110KB
2.5K SLoC

Rast

Build Status crates.io

Fast. Rust. Raft.

Rast is a toy implementation of the raft consistency protocol with a focus on steady-state speed.

This is a proof of concept and not ready for production use.

Features

  • Fully pipelined. The raft logic is non-blocking and can continue to respond to incoming rpcs and clock ticks during disk IO.
  • [Not yet implemented] Zero-copy serde. One thing that Kafka got right was making the network format and the disk format the same. This allowed for use of the Linux zero-copy optimization that copies the incoming network traffic straight to disk for persistance. There's no reason a Raft log implemenation couldn't work the same way and io_uring makes this even easier.
  • [Not yet implemented] Zero-alloc, lazy serde. The Raft logic in the steady state hot-path only looks at a couple fields of each incoming message, but popular serde implementations (like the Protocol Buffers of GRPC) require that an entire message be deserialized and allocate while doing so. Alternative wire formats like Cap’n Proto and FlatBuffers avoid this.

v0.1.0-alpha.0

  • Replace printlns with log crate
  • Resolve all WIP comments
  • Audit all TODO comments
  • Resolve all ignored tests
  • External documentation
  • Small cleanups
    • Make current_time an Option
    • Structs for {Persist,ReadStateMachine}{Req,Res}
    • Clear max_outstanding_read_id when applicable

v0.1.0-alpha.1

  • Handle node restarts
    • Persist hard state
  • Zero-copy message serialization
  • More extensive nemesis testing
  • Initial benchmarking
  • Message idempotency
  • Read-write requests (cput)
  • Handle panics in state machine
  • Audit public interface
  • Make logging an optional dependency
  • Clean up log messages
  • Internal documentation
  • Idiomatic rustdoc

v0.1.0

  • Test with maelstrom
  • Failure testing
  • Harden public interface
  • Membership changes

After v0.1.0

  • Snapshots

Dependencies

^