pub mod raft;
pub mod node;
pub mod discovery;
pub mod replication;
pub mod failover;
pub mod management;
pub mod network;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use chrono::{DateTime, Utc};
pub mod prelude {
pub use crate::cluster::raft::{RaftNode, RaftConfig, RaftRole};
pub use crate::cluster::node::{ClusterNode, NodeStatus, NodeConfig};
pub use crate::cluster::discovery::{NodeDiscovery, DiscoveryConfig};
pub use crate::cluster::replication::{DataReplicator, ReplicationConfig};
pub use crate::cluster::failover::{FailoverManager, FailoverConfig};
pub use crate::cluster::management::ClusterManager;
pub use crate::cluster::network::{NetworkManager, NetworkConfig};
pub use crate::cluster::{ClusterMessage, ClusterError, ClusterResult};
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ClusterMessage {
Raft(raft::RaftMessage),
Discovery(discovery::DiscoveryMessage),
Replication(replication::ReplicationMessage),
Failover(failover::FailoverMessage),
Management(management::ManagementMessage),
Heartbeat {
node_id: Uuid,
timestamp: DateTime<Utc>,
term: u64,
},
}
#[derive(Debug, thiserror::Error)]
pub enum ClusterError {
#[error("Network error: {0}")]
Network(#[from] network::NetworkError),
#[error("Raft consensus error: {0}")]
Raft(#[from] raft::RaftError),
#[error("Node discovery error: {0}")]
Discovery(#[from] discovery::DiscoveryError),
#[error("Data replication error: {0}")]
Replication(#[from] replication::ReplicationError),
#[error("Failover error: {0}")]
Failover(#[from] failover::FailoverError),
#[error("Cluster management error: {0}")]
Management(#[from] management::ManagementError),
#[error("Configuration error: {0}")]
Configuration(String),
#[error("Node not found: {0}")]
NodeNotFound(Uuid),
#[error("Cluster is not ready")]
ClusterNotReady,
#[error("Leadership transfer failed: {0}")]
LeadershipTransferFailed(String),
}
pub type ClusterResult<T> = Result<T, ClusterError>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClusterConfig {
pub node_id: Uuid,
pub listen_addr: String,
pub join_addresses: Vec<String>,
pub raft: RaftConfig,
pub discovery: DiscoveryConfig,
pub replication: ReplicationConfig,
pub failover: FailoverConfig,
pub network: NetworkConfig,
pub election_timeout_ms: u64,
pub heartbeat_interval_ms: u64,
pub max_nodes: usize,
pub enable_tls: bool,
pub tls_cert_path: Option<String>,
pub tls_key_path: Option<String>,
pub tls_ca_path: Option<String>,
}
impl Default for ClusterConfig {
fn default() -> Self {
Self {
node_id: Uuid::new_v4(),
listen_addr: "0.0.0.0:8081".to_string(),
join_addresses: Vec::new(),
raft: RaftConfig::default(),
discovery: DiscoveryConfig::default(),
replication: ReplicationConfig::default(),
failover: FailoverConfig::default(),
network: NetworkConfig::default(),
election_timeout_ms: 5000,
heartbeat_interval_ms: 1000,
max_nodes: 7,
enable_tls: false,
tls_cert_path: None,
tls_key_path: None,
tls_ca_path: None,
}
}
}
use crate::cluster::raft::RaftConfig;
use crate::cluster::discovery::DiscoveryConfig;
use crate::cluster::replication::ReplicationConfig;
use crate::cluster::failover::FailoverConfig;
use crate::cluster::network::NetworkConfig;