forked from lavina/lavina
1
0
Fork 0

Compare commits

...

2 Commits

Author SHA1 Message Date
Nikita Vilunov 1969901436 wip 2024-02-01 11:12:42 +01:00
Nikita Vilunov 0e59ab1351 wip 2024-01-31 14:59:34 +01:00
2 changed files with 51 additions and 6 deletions

View File

@ -18,6 +18,30 @@ use crate::prelude::Str;
use crate::table::{AnonTable}; use crate::table::{AnonTable};
use crate::terminator::Terminator; use crate::terminator::Terminator;
/*
сценарии:
- бутстрап нового кластера
- подключение новой ноды к кластеру
- вывод существующей ноды из кластера
имплементация:
- etcd для выбора лидера
- определение модели данных
- определение протокола общения между нодами
- модель верификации поведения нод
Лидер кластера
- выбирается из нод, которые уже в кластере
- не больше одного
- занимается аллокацией шардов на ноды
Лидер шарда
- выбирается лидером кластера из реплик шарда
- принимает команды на изменение сущностей в шарде
- посылает изменения репликам
*/
#[derive(Deserialize, Debug, Clone)] #[derive(Deserialize, Debug, Clone)]
pub struct ClusteringConfig { pub struct ClusteringConfig {
/// The name of the cluster used for prefixing the data in etcd and to prevent accidental communication between different clusters. /// The name of the cluster used for prefixing the data in etcd and to prevent accidental communication between different clusters.
@ -61,12 +85,10 @@ impl ClusterRegistry {
let listener = TcpListener::bind(config.listen_on).await?; let listener = TcpListener::bind(config.listen_on).await?;
let listener_task = start_connection_listener(listener, inner.clone()).await; let listener_task = start_connection_listener(listener, inner.clone()).await;
let mut client = EtcdClient::connect(&[config.etcd_address], None).await?; let mut client = EtcdClient::connect(&[config.etcd_address], None).await?;
dbg!(client.maintenance_client().status().await?); let campaign_response = client.election_client().campaign(b"kek", b"my name", 0).await?;
dbg!(client.leader(b"kek").await); dbg!(campaign_response);
dbg!(client.kv_client().get(b"kek", None).await?); let leader = client.leader("kek").await?;
let a = dbg!(client.election_client().campaign(b"kek", b"my name", 0).await?); dbg!(leader);
dbg!(client.leader(b"kek").await?);
dbg!(client.election_client().resign(Some(ResignOptions::new().with_leader(a.leader().unwrap().clone()))).await);
Ok(ClusterRegistry { Ok(ClusterRegistry {

View File

@ -65,3 +65,26 @@ C4Context
BiRel(BobPC, BobConn1, "IRC") BiRel(BobPC, BobConn1, "IRC")
UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1") UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")
``` ```
## Cluster
```mermaid
C4Context
System_Ext(Alice, "Alice IRC")
System_Ext(Bob, "Bob XMPP")
Boundary(Lavina, "Lavina", "Cluster of nodes") {
System(Node1, "Node 1", "Single server process")
System(Node2, "Node 2", "Single server process")
System(Node3, "Node 3", "Single server process")
Rel(Node1, etcd, "")
Rel(Node2, etcd, "")
Rel(Node3, etcd, "")
BiRel(Node1, Node2, "")
BiRel(Node2, Node3, "")
BiRel(Node1, Node3, "")
System(etcd, "etcd", "Key-value store")
UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="1")
}
Rel(Alice, Node1, "")
Rel(Bob, Node2, "")
```