# Réplication Bidirectionnelle ZFS avec Serveur NFS Hautement Disponible
Une implémentation prête pour la production d'un stockage NFS hautement disponible utilisant Proxmox HA, ZFS, et Sanoid/Syncoid pour la réplication bidirectionnelle automatique.
## Contexte du Projet
Ce projet répond au défi de créer une solution de stockage redondante et hautement disponible en utilisant des pools ZFS indépendants sur du matériel standard, spécifiquement conçue pour du stockage de données froides avec des disques durs 3.5" connectés en USB.
### Le Défi
- **Contraintes matérielles** : Deux disques durs SATA 3.5" dans des boîtiers USB, sur des nœuds physiques différents
- **Caractéristiques des données** : Stockage froid (fichiers média, archives) avec écritures peu fréquentes et lectures importantes
- **Besoins de disponibilité** : Nécessité d'un basculement automatique avec un temps d'arrêt minimal
- **Infrastructure** : Cluster Proxmox HA existant avec plusieurs nœuds
### La Solution
Les disques étant connectés en USB sur des nœuds physiques séparés, les solutions classiques (miroir ZFS local, DRBD bloc par bloc, ou systèmes de fichiers distribués lourds comme Ceph/GlusterFS) sont soit impossibles, soit disproportionnées pour ce cas d'usage.
Cette architecture implémente une approche plus simple et efficace :
1.**Pools ZFS indépendants** sur des nœuds Proxmox séparés (un disque par nœud)
2.**Réplication bidirectionnelle au niveau ZFS** utilisant Sanoid/Syncoid avec détection automatique de la direction
3.**Modèle actif-passif** où le nœud hébergeant le conteneur LXC NFS devient le maître de réplication
4.**Basculement automatique** exploitant Proxmox HA pour une migration transparente
Cette approche fournit une redondance adaptée aux données froides tout en restant simple à maintenir et optimisée pour du stockage USB.
- **Cluster Proxmox HA** : 2 nœuds de production + 1 nœud témoin pour le quorum
- **Pools ZFS indépendants** : `zpool1` sur chaque nœud de production (un seul HDD 3.5" connecté en USB)
- **Conteneur LXC (CTID 103)** : Serveur NFS avec rootfs sur LINSTOR/DRBD pour le basculement HA
- **Sanoid** : Gestion automatisée des snapshots avec politiques de rétention configurables
- **Syncoid** : Réplication ZFS efficace avec support de reprise
- **Automatisation Systemd** : Exécution basée sur un timer toutes les 10 minutes
### Pourquoi Cette Architecture ?
**Contraintes de Déploiement** :
- Les disques sont connectés en USB sur des nœuds physiques distincts, empêchant un miroir ZFS local (qui nécessite les disques sur le même nœud)
- Les solutions de stockage distribué (Ceph, GlusterFS) sont surdimensionnées pour ce cas d'usage et consomment trop de ressources
- DRBD réplique au niveau bloc, moins efficace que la réplication ZFS incrémentale basée sur les snapshots
- La réplication ZFS via Syncoid offre le meilleur compromis simplicité/efficacité
**Optimisation pour Données Froides** :
- Les fichiers média et archives ont des schémas de lecture élevée / écriture faible
- Un intervalle de réplication de 10 minutes est acceptable (faibles exigences RPO)
- La réplication asynchrone n'impacte pas les performances de lecture
- La bande passante USB 3.0 est suffisante pour les transferts delta de réplication incrémentale
**Rentabilité** :
- Réutilise des disques durs 3.5" existants dans des boîtiers externes
- Pas besoin de contrôleurs SAS coûteux ou de baies hot-swap
- Solution légère comparée aux systèmes de fichiers distribués complexes
## Fonctionnement
### Réplication Actif-Passif
1.**Détection du maître** : Le script de réplication (`zfs-nfs-replica.sh`) effectue une triple vérification de sécurité pour confirmer que le conteneur LXC NFS fonctionne localement
2.**Direction automatique** : Le nœud hébergeant le conteneur actif devient le maître de réplication et pousse les snapshots vers le nœud passif
3.**Réplication complète du pool** : Tous les datasets sous `zpool1` sont répliqués récursivement en utilisant `syncoid --recursive`
4.**Adaptation au basculement** : Lorsque Proxmox HA migre le LXC, la direction de réplication s'inverse automatiquement
### Triple Vérification de Sécurité
Avant d'initier la réplication, le script vérifie trois fois (avec des délais de 2 secondes) :
- Le conteneur existe (`pct status 103`)
- Le statut du conteneur est "running"
- Le conteneur est réactif (test de santé `pct exec`)
Cela évite les scénarios de split-brain et garantit que seul le nœud actif réplique.
### Gestion des Snapshots
Sanoid crée des snapshots selon un calendrier défini :
- **Horaire** : 24 snapshots (rétention de 1 jour)
- **Quotidien** : 7 snapshots (rétention de 1 semaine)
**Configuration dynamique selon le rôle** (conforme à la [documentation Sanoid](https://github.com/jimsalterjrs/sanoid/wiki/Syncoid#snapshot-management-with-sanoid)) :
Le script configure automatiquement Sanoid différemment selon le rôle du nœud :
**Nœud actif** (héberge le LXC) :
-`autosnap = yes` : crée les snapshots
-`autoprune = yes` : supprime les anciens snapshots selon la politique de rétention
- Sanoid.timer activé
**Nœud passif** (reçoit la réplication) :
-`autosnap = no` : ne crée pas de snapshots (ils arrivent via syncoid)
-`autoprune = yes` : supprime les anciens snapshots selon la même politique
- Sanoid.timer activé
Cette approche garantit que les deux nœuds convergent vers le même ensemble de snapshots, évitant l'accumulation indéfinie sur le nœud passif tout en maintenant la synchronisation.
- **Configuration dynamique de Sanoid** : Configure automatiquement Sanoid en mode actif ou passif selon le rôle du nœud, conformément aux recommandations de la documentation officielle
- **Configuration du mount point LXC pour HA** : Le mount point dans la configuration du LXC doit avoir l'option `shared=1` pour permettre le montage sur différents nœuds lors des migrations
- **Première synchronisation** : La détection automatique et les protections de sécurité peuvent nécessiter 10-20 minutes lors de la première exécution