- Ajout du script add_external_node.sh pour gérer les nœuds externes - Configuration external_nodes.conf avec dev3-relay - Scripts de test pour dev3.4nkweb.com (connectivité WSS) - Documentation complète (CONFIGURATION_DEV3.md, RESUME_AJOUT_DEV3.md) - Scripts de test de synchronisation et monitoring - Configuration multi-relais avec 3 instances - Mise à jour de la documentation technique et fonctionnelle - Scripts de démarrage et monitoring pour les 3 relais
7.2 KiB
Spécification Technique - Synchronisation entre Relais
Vue d'ensemble
Cette spécification décrit l'implémentation de la synchronisation entre relais dans le réseau 4NK, permettant la communication et le partage de données entre plusieurs instances de sdk_relay
.
Architecture de Synchronisation
1. Gestionnaire de Synchronisation (SyncManager
)
Le SyncManager
est le composant central qui gère toute la logique de synchronisation :
pub struct SyncManager {
relay_id: String,
sequence_counter: Arc<Mutex<u64>>,
sync_cache: Arc<Mutex<HashMap<String, Instant>>>,
last_sync: Arc<Mutex<HashMap<SyncType, u64>>>,
mesh_connections: Arc<Mutex<HashMap<String, MeshConnection>>>,
known_relays: Arc<Mutex<HashMap<String, RelayInfo>>>,
metrics: Arc<Mutex<SyncMetrics>>,
}
2. Types de Synchronisation
Les types de synchronisation supportés :
- StateSync : Synchronisation de l'état général du relais
- ProcessSync : Synchronisation des processus en cours
- MemberSync : Synchronisation des membres
- TxSync : Synchronisation des transactions
- BlockSync : Synchronisation des blocs
- PeerSync : Synchronisation des pairs connectés
- RelaySync : Synchronisation des informations des relais
- HealthSync : Synchronisation de la santé du relais
- MetricsSync : Synchronisation des métriques
- ConfigSync : Synchronisation de la configuration
- CapabilitySync : Synchronisation des capacités
3. Messages de Synchronisation
Structure des Messages
pub struct SyncMessage {
pub sync_type: SyncType,
pub relay_id: String,
pub sequence: u64,
pub timestamp: u64,
pub payload: SyncPayload,
}
Types de Payload
pub enum SyncPayload {
StateData { state: String, version: String },
ProcessData { processes: HashMap<String, String> },
MemberData { members: HashMap<String, String> },
HealthData { status: HealthStatus, uptime: u64, cpu_usage: f64 },
MetricsData { metrics: SyncMetrics },
PeerData { peers: Vec<PeerInfo>, last_seen: u64 },
RelayData { relays: Vec<RelayInfo>, network_topology: NetworkTopology },
}
Fonctionnalités Implémentées
1. Découverte Automatique des Relais
Le système implémente une découverte automatique des relais dans le réseau :
pub async fn discover_relays(&self) -> Result<()> {
let relay_hosts = vec![
"sdk_relay_1",
"sdk_relay_2",
"sdk_relay_3",
];
for host in relay_hosts {
if host == self.relay_id {
continue; // Ignorer soi-même
}
let relay_info = RelayInfo {
relay_id: host.to_string(),
address: format!("{}:8090", host),
// ... autres champs
};
self.add_relay(relay_info)?;
}
Ok(())
}
2. Cache de Déduplication
Pour éviter les doublons, un cache de déduplication est implémenté :
pub struct MessageCache {
cache: Arc<Mutex<HashMap<String, Instant>>>,
}
impl MessageCache {
pub fn is_duplicate(&self, message_id: &str) -> bool {
let mut cache = self.cache.lock().unwrap();
if cache.contains_key(message_id) {
true
} else {
cache.insert(message_id.to_string(), Instant::now());
false
}
}
}
3. Synchronisation Périodique
Le système effectue une synchronisation périodique :
- Synchronisation d'état : Toutes les 30 secondes
- Synchronisation de santé : Toutes les 60 secondes
- Synchronisation de métriques : Toutes les 120 secondes
- Synchronisation des relais : Toutes les 300 secondes (5 minutes)
4. Gestion des Connexions Mesh
pub struct MeshConnection {
pub relay_id: String,
pub address: String,
pub connected_since: u64,
pub last_heartbeat: u64,
pub status: ConnectionStatus,
}
Configuration Multi-Relais
Configuration Docker
Le système supporte la configuration de plusieurs relais via Docker :
services:
sdk_relay_1:
container_name: sdk_relay_1
ports:
- "8090:8090"
- "8091:8091"
environment:
- ENABLE_SYNC_TEST=1
sdk_relay_2:
container_name: sdk_relay_2
ports:
- "8092:8090"
- "8093:8091"
environment:
- ENABLE_SYNC_TEST=1
sdk_relay_3:
container_name: sdk_relay_3
ports:
- "8094:8090"
- "8095:8091"
environment:
- ENABLE_SYNC_TEST=1
Configuration par Relais
Chaque relais a sa propre configuration :
# .conf.docker.relay1
relay_id=relay-1
ws_url=0.0.0.0:8090
# .conf.docker.relay2
relay_id=relay-2
ws_url=0.0.0.0:8090
# .conf.docker.relay3
relay_id=relay-3
ws_url=0.0.0.0:8090
Métriques de Synchronisation
pub struct SyncMetrics {
pub messages_sent: u64,
pub messages_received: u64,
pub sync_requests: u64,
pub sync_responses: u64,
pub errors: u64,
pub last_sync: u64,
pub avg_latency: f64,
}
Sécurité et Validation
1. Validation des Messages
- Vérification de l'ID du relais émetteur
- Validation du timestamp pour éviter les attaques par rejeu
- Vérification de la séquence pour détecter les messages manquants
2. Déduplication
- Cache des messages reçus avec TTL
- Nettoyage automatique du cache toutes les 5 minutes
- Prévention des boucles de synchronisation
Tests et Validation
Script de Test
Un script de test automatisé est fourni :
#!/bin/bash
# test_3_relays.sh
echo "🚀 Test de synchronisation avec 3 relais"
echo "========================================"
# Démarrage des services
docker-compose up -d tor bitcoin blindbit
sleep 30
# Démarrage des 3 relais
docker-compose up -d sdk_relay_1 sdk_relay_2 sdk_relay_3
sleep 60
# Surveillance des logs
docker-compose logs -f sdk_relay_1 sdk_relay_2 sdk_relay_3
Validation des Fonctionnalités
- Découverte automatique : Les relais se découvrent mutuellement
- Partage des listes : Les relais partagent leurs listes de relais connus
- Synchronisation d'état : Les états sont synchronisés périodiquement
- Métriques : Les métriques sont collectées et partagées
- Santé : Le statut de santé est surveillé et partagé
Prochaines Étapes
1. Améliorations Planifiées
- Implémentation de la signature des messages
- Optimisation des performances pour de gros volumes
- Implémentation de la fusion des données entre relais
- Ajout de la compression des messages
2. Fonctionnalités Avancées
- Routage intelligent des messages
- Gestion de la tolérance aux pannes
- Synchronisation différentielle
- Monitoring en temps réel
3. Tests Avancés
- Tests de charge avec de nombreux relais
- Tests de résilience (arrêt/redémarrage de relais)
- Tests de sécurité (messages malveillants)
- Tests de performance (latence, débit)
Conclusion
L'implémentation de la synchronisation entre relais fournit une base solide pour la communication distribuée dans le réseau 4NK. Le système est conçu pour être extensible, sécurisé et performant, permettant une croissance future du réseau tout en maintenant la cohérence des données.