//! Multi-node cluster coordination for StemeDB. //! //! This crate implements the cluster layer for StemeDB, enabling horizontal //! scaling across multiple nodes: //! //! - **Membership**: SWIM-based protocol for node discovery and failure detection //! - **Sharding**: Consistent hashing for data distribution across nodes //! - **Gateway**: Stateless HTTP router for client request routing //! //! # Architecture //! //! ```text //! [Client] //! | //! v //! [Gateway] -----> [Node 1] <---> [SWIM Gossip] <---> [Node 2] //! | | | //! v v v //! [RangeRouter] [Shard 0,2] [Shard 1,3] //! ``` //! //! # Node Discovery //! //! Nodes discover each other using the SWIM protocol: //! //! 1. New node contacts seed nodes from configuration //! 2. Seed nodes share their membership list //! 3. SWIM gossip propagates membership changes //! 4. Failed nodes detected via ping/indirect-probe //! //! # Data Sharding //! //! Assertions are distributed across shards using consistent hashing: //! //! 1. Subject string is hashed using BLAKE3 //! 2. Jump hash maps hash to shard ID //! 3. Each shard has N replicas for fault tolerance //! 4. Ranges can split (>64MB) or merge (<20MB combined) //! //! # Usage //! //! ```ignore //! use stemedb_cluster::{ClusterConfig, SwimMembership, Gateway}; //! //! // Configure cluster //! let config = ClusterConfig::builder() //! .with_seed_node("node1.example.com:9090") //! .with_replication_factor(3) //! .build()?; //! //! // Start membership protocol //! let membership = SwimMembership::new(config.swim.clone()).await?; //! membership.join(config.seed_nodes.clone()).await?; //! //! // Start gateway (if this is a gateway node) //! let gateway = Gateway::new(membership.clone(), router); //! gateway.serve("0.0.0.0:8080").await?; //! ``` #![forbid(unsafe_code)] #![warn(missing_docs)] pub mod config; pub mod error; pub mod gateway; pub mod membership; pub mod sharding; pub use config::{ClusterConfig, ShardingConfig, SwimConfig}; pub use error::{ClusterError, Result}; pub use gateway::{Gateway, GatewayBuilder}; pub use membership::{MembershipEvent, NodeId, NodeInfo, NodeState, SwimMembership}; pub use sharding::{MetaRange, RangeDescriptor, RangeManager, RangeRouter, ShardId};