Create and manage distributed applications in Rust.
Built with the motto - Plug the crate in, it'll be taken care of.
#[tokio::main]
async fn main() {
let result = KubernetesDiscoverService::init("demo".to_string(), "default".to_string())
.await;
if let Ok(k8s) = result {
let cluster = Arc::new(Cluster::default());
let client = DiscoveryClient::new(k8s);
tokio::spawn(start_cluster(cluster, client));
}
}
The Cluster
struct provides a set of functions for example async fn primaries(&self) -> Option<HashSet<RestClusterNode>>
or async fn is_active(&self) -> bool
to communicate with the cluster.
Checkout doc.rs
cluster-mode
handles three task -
- Discovery
- Consensus
- The Cluster
It uses rust-cloud-discovery crate for discovery service. Given a valid implementation of the crate, cluster-mode should be able to handle the addition of a new node or termination of an existing or unreachable node.
Check rust-cloud-discovery for available implementations.
The main hurdle of a distributed system is consensus. For that, we're using almost-raft; the crate handles leader election only, once enough is discovered by the discovery service.
Note that, cluster-mode
supports only a single primary, a limitation imposed by almost-raft
.
Also, it doesn't handle log consistency; it's up to the developer how to maintain consistency.
Hoping to add these features in the future.
cluster-mode
initialises the cluster in Inactive
state. Then works hand to hand with the
discovery service & the consensus algorithm to elect primary and secondaries. The crate tries to
maintain a consistent set of secondaries & secondaries and provide a set of APIs enabling
developers to work with the cluster.