Crates.io | cluster-mode |
lib.rs | cluster-mode |
version | 0.3.0 |
source | src |
created_at | 2021-04-17 17:05:30.4606 |
updated_at | 2022-11-13 08:19:34.630374 |
description | Some help to create and manage cluster in Rust |
homepage | |
repository | https://github.com/eipi1/cluster-mode |
max_upload_size | |
id | 385818 |
size | 31,805 |
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 -
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.