From 067f7987dfc4e24a04423154aaa017e864efdb29 Mon Sep 17 00:00:00 2001 From: Tellsanguis Date: Thu, 18 Dec 2025 19:19:50 +0100 Subject: [PATCH] vault backup: 2025-12-18 19:19:50 --- docs/zfs-replication-nfs.md | 619 ++++++++++++++++ .../current/zfs-replication-nfs.md | 679 ++++++++++++++++++ .../zfs-nfs-lxc-configuration.png | Bin 0 -> 26631 bytes .../zfs-nfs-proxmox-ha-resources.png | Bin 0 -> 55779 bytes .../zfs-nfs-replication-flowchart.png | Bin 0 -> 54696 bytes 5 files changed, 1298 insertions(+) create mode 100644 docs/zfs-replication-nfs.md create mode 100644 i18n/en/docusaurus-plugin-content-docs/current/zfs-replication-nfs.md create mode 100644 static/img/docs/zfs-replication-nfs/zfs-nfs-lxc-configuration.png create mode 100644 static/img/docs/zfs-replication-nfs/zfs-nfs-proxmox-ha-resources.png create mode 100644 static/img/docs/zfs-replication-nfs/zfs-nfs-replication-flowchart.png diff --git a/docs/zfs-replication-nfs.md b/docs/zfs-replication-nfs.md new file mode 100644 index 0000000..6a4916c --- /dev/null +++ b/docs/zfs-replication-nfs.md @@ -0,0 +1,619 @@ +--- +sidebar_position: 1 +tags: [zfs, nfs, haute-disponibilite, replication, proxmox, homelab, sanoid, syncoid] +last_update: + date: 2025-12-18 +--- + +# Réplication ZFS et serveur NFS hautement disponible + +Documentation de mon infrastructure de stockage hybride : stockage distribué Linstor DRBD pour les VM, et réplication ZFS active-passive pour les données froides avec serveur NFS hautement disponible. + +## Contexte et problématique + +### Architecture de stockage hybride + +Mon cluster Proxmox utilise deux types de stockage aux besoins et contraintes différents : + +#### Stockage haute performance pour VM/LXC : Linstor DRBD + +- **Usage** : Disques système des machines virtuelles et conteneurs +- **Besoins** : Réplication synchrone, live migration, RPO ~0 +- **Support** : SSD NVMe sur les nœuds Proxmox +- **Technologie** : Linstor DRBD (voir [article de blog sur le stockage distribué](/blog/stockage-distribue-proxmox-ha)) + +#### Stockage de données froides : ZFS répliqué + +- **Usage** : Médias, fichiers utilisateurs, backups Proxmox Backup Server +- **Besoins** : Capacité importante, intégrité des données, disponibilité élevée mais live migration non requise +- **Support** : Disques USB sur les nœuds Proxmox (pools ZFS indépendants) +- **Technologie** : Réplication ZFS active-passive avec Sanoid/Syncoid + +### Pourquoi ne pas utiliser Linstor DRBD pour tout ? + +Le stockage distribué synchrone comme Linstor DRBD présente plusieurs contraintes pour des données froides : + +- **Performance d'écriture** : Chaque écriture doit être confirmée sur plusieurs nœuds, ce qui pénalise les transferts de gros fichiers +- **Consommation réseau** : La réplication synchrone saturerait le réseau 1 Gbps lors de transferts massifs +- **Complexité inutile** : Les données froides n'ont pas besoin de live migration ni de RPO proche de zéro +- **Coût/bénéfice** : Sur-consommation de ressources pour un besoin qui peut être satisfait par de la réplication asynchrone + +### La solution : réplication active-passive ZFS + +Pour les données froides, une **réplication asynchrone par snapshots** offre le meilleur compromis : + +| Critère | Linstor DRBD | ZFS répliqué | +|---------|--------------|--------------| +| Type de réplication | Synchrone | Asynchrone (snapshots) | +| Overhead réseau | Élevé (continu) | Faible (par intervalles) | +| RPO | ~0 | Intervalle snapshots (10 min) | +| Live migration | Oui | Non nécessaire | +| Intégrité données | Bonne | Excellente (checksums ZFS) | +| Adapté pour | VM/LXC système | Données froides volumineuses | + +Un RPO de 10 minutes est **parfaitement acceptable** pour des médias et fichiers utilisateurs : en cas de panne d'un nœud, seules les modifications des 10 dernières minutes pourraient être perdues. + +## Architecture + +### Vue d'ensemble + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Cluster Proxmox HA │ +│ │ +│ ┌──────────────────┐ ┌──────────────────┐ │ +│ │ acemagician │ │ elitedesk │ │ +│ │ │◄────────────►│ │ │ +│ │ - zpool1 (10TB) │ Réplication │ - zpool1 (10TB) │ │ +│ │ - zpool2 (2TB) │ Sanoid/ │ - zpool2 (2TB) │ │ +│ │ │ Syncoid │ │ │ +│ └────────┬─────────┘ └─────────┬────────┘ │ +│ │ │ │ +│ │ ┌──────────────┐ │ │ +│ └────────►│ LXC 103 │◄────────┘ │ +│ │ NFS Server │ │ +│ │ (rootfs sur │ │ +│ │ DRBD) │ │ +│ └──────┬───────┘ │ +└────────────────────────────┼──────────────────────────────┘ + │ + ▼ + Clients NFS (VMs) + 192.168.100.0/24 +``` + +### Composants + +#### Pools ZFS sur les nœuds Proxmox + +Chaque nœud dispose de **deux pools ZFS indépendants** : + +**zpool1** (~10 TB) : Données volumineuses +- `zpool1/data-nfs-share` : Partage NFS principal (6.83 TB utilisés) +- `zpool1/pbs-backups` : Backups Proxmox Backup Server + +**zpool2** (~2 TB) : Médias et fichiers +- `zpool2/photos` : Photothèque (14.7 GB) +- `zpool2/storage` : Fichiers divers (19.1 GB) + +**État des pools sur les nœuds** : + +```bash +# Nœud acemagician +root@acemagician:~# zfs list +NAME USED AVAIL REFER MOUNTPOINT +zpool1 7.83T 2.95T 104K /zpool1 +zpool1/data-nfs-share 6.83T 2.95T 6.79T /zpool1/data-nfs-share +zpool1/pbs-backups 96K 1024G 96K /zpool1/pbs-backups +zpool2 33.9G 1.72T 104K /zpool2 +zpool2/photos 14.7G 1.72T 12.7G /zpool2/photos +zpool2/storage 19.1G 1.72T 19.1G /zpool2/storage + +# Nœud elitedesk +root@elitedesk:~# zfs list +NAME USED AVAIL REFER MOUNTPOINT +zpool1 7.83T 2.97T 96K /zpool1 +zpool1/data-nfs-share 6.83T 2.97T 6.79T /zpool1/data-nfs-share +zpool1/pbs-backups 96K 1024G 96K /zpool1/pbs-backups +zpool2 33.9G 1.72T 112K /zpool2 +zpool2/photos 14.7G 1.72T 12.7G /zpool2/photos +zpool2/storage 19.1G 1.72T 19.1G /zpool2/storage +``` + +On constate que les pools sont **parfaitement synchronisés** entre les deux nœuds, avec des tailles identiques pour chaque dataset. + +:::info +Les pools sont **identiques sur les deux nœuds** grâce à la réplication bidirectionnelle automatique. Le nœud actif (hébergeant le LXC) est toujours le master. +::: + +#### LXC 103 : Serveur NFS hautement disponible + +Le conteneur LXC 103 joue le rôle de serveur NFS avec les caractéristiques suivantes : + +- **Rootfs sur Linstor DRBD** : Permet la haute disponibilité via Proxmox HA +- **Montage des datasets ZFS** : Accès direct aux pools du nœud hôte via bind mount +- **Service NFS** : Expose les datasets via NFS aux clients du réseau +- **Basculement automatique** : En cas de panne, Proxmox HA redémarre le LXC sur l'autre nœud (~60s de downtime) + +![Configuration du LXC NFS](/img/docs/zfs-replication-nfs/zfs-nfs-lxc-configuration.png) + +**Configuration détaillée** : +- **CPU** : 2 cœurs +- **RAM** : 1 Go (+ 512 Mo swap) +- **Rootfs** : 8 Go sur `linstor_storage` (stockage distribué DRBD) +- **Mount Point (mp0)** : `/zpool1/data-nfs-share,mp=/data-nfs-share,shared=1` + +:::warning Important : option shared=1 +L'option `shared=1` est **obligatoire** pour le bind mount du dataset ZFS. Sans cette option, le conteneur pourrait rencontrer des problèmes d'accès ou de permissions lors du montage du dataset depuis le nœud hôte. +::: + +:::tip Pourquoi Linstor DRBD pour le rootfs du LXC ? +Le rootfs du conteneur NFS est stocké sur Linstor DRBD pour bénéficier de la **haute disponibilité Proxmox**. Cela permet au LXC de basculer automatiquement sur l'autre nœud en cas de panne, avec un temps d'arrêt d'environ **60 secondes** seulement. + +Sans stockage partagé/distribué, Proxmox HA ne pourrait pas migrer automatiquement le conteneur, nécessitant une intervention manuelle. +::: + +#### Script de réplication automatique + +Le script [`zfs-nfs-replica.sh`](https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha) s'exécute toutes les **10 minutes** via un timer systemd et implémente la logique suivante : + +![Diagramme de flux du script de réplication](/img/docs/zfs-replication-nfs/zfs-nfs-replication-flowchart.png) + +1. **Détection automatique du master** : Le nœud hébergeant le LXC 103 devient automatiquement le master +2. **Configuration dynamique de Sanoid** : + - **Nœud master** : `autosnap=yes`, `autoprune=yes` (création de snapshots) + - **Nœud standby** : `autosnap=no`, `autoprune=yes` (réception seule) +3. **Réplication via Syncoid** : Transfert incrémental des snapshots du master vers le standby +4. **Vérifications de sécurité** : + - Triple vérification que le bon nœud est master + - Comparaison des tailles pour détecter un disque de remplacement vide + - Historique des tailles pour éviter les écrasements accidentels + +## Fonctionnement technique + +### Détection automatique du nœud master + +Le script détermine quel nœud héberge le LXC 103 : + +```bash +# Détection du nœud actif +ACTIVE_NODE=$(pvesh get /cluster/resources --type vm --output-format json | \ + jq -r '.[] | select(.vmid==103) | .node') + +# Comparaison avec le nœud local +CURRENT_NODE=$(hostname) + +if [ "$ACTIVE_NODE" = "$CURRENT_NODE" ]; then + # Ce nœud est le master + configure_as_master +else + # Ce nœud est en standby + configure_as_standby +fi +``` + +Cette détection garantit que le système s'adapte automatiquement aux migrations du LXC, qu'elles soient **planifiées** (maintenance) ou **automatiques** (failover Proxmox HA). + +### Configuration dynamique de Sanoid + +Sanoid est configuré différemment selon le rôle du nœud : + +#### Nœud master (héberge le LXC 103) + +```ini +[zpool1/data-nfs-share] + use_template = production + recursive = yes + autosnap = yes # Création automatique de snapshots + autoprune = yes # Nettoyage des anciens snapshots + +[zpool2/photos] + use_template = production + recursive = yes + autosnap = yes + autoprune = yes + +[zpool2/storage] + use_template = production + recursive = yes + autosnap = yes + autoprune = yes +``` + +#### Nœud standby + +```ini +[zpool1/data-nfs-share] + use_template = production + recursive = yes + autosnap = no # Pas de création de snapshots + autoprune = yes # Nettoyage des anciens snapshots + +[zpool2/photos] + use_template = production + recursive = yes + autosnap = no + autoprune = yes + +[zpool2/storage] + use_template = production + recursive = yes + autosnap = no + autoprune = yes +``` + +### Réplication avec Syncoid + +Syncoid effectue la réplication incrémentale des snapshots du master vers le standby : + +```bash +# Réplication de chaque dataset +syncoid --no-sync-snap --recursive \ + root@master:zpool1/data-nfs-share \ + zpool1/data-nfs-share + +syncoid --no-sync-snap --recursive \ + root@master:zpool2/photos \ + zpool2/photos + +syncoid --no-sync-snap --recursive \ + root@master:zpool2/storage \ + zpool2/storage +``` + +L'option `--no-sync-snap` évite la création d'un snapshot de synchronisation supplémentaire, utilisant uniquement les snapshots Sanoid existants. + +### Mécanismes de sécurité + +Le script implémente plusieurs vérifications pour éviter les pertes de données : + +#### Triple vérification du sens de réplication + +Avant chaque réplication, le script vérifie **trois fois** que : +1. Le LXC 103 est bien sur le nœud local +2. Le nœud local est bien le master +3. La configuration Sanoid est bien en mode master + +Si l'une de ces vérifications échoue, la réplication est **abandonnée** pour éviter une réplication dans le mauvais sens. + +#### Protection contre les disques vides + +Avant de répliquer, le script compare la taille des datasets : + +```bash +# Récupération des tailles +SOURCE_SIZE=$(ssh root@master "zfs get -Hp -o value used zpool1/data-nfs-share") +TARGET_SIZE=$(zfs get -Hp -o value used zpool1/data-nfs-share) + +# Si le source est significativement plus petit que la cible +if [ $SOURCE_SIZE -lt $(($TARGET_SIZE / 2)) ]; then + echo "ERREUR: Taille source suspecte, disque de remplacement vide ?" + exit 1 +fi +``` + +Cela évite qu'un disque de remplacement vide n'écrase les données du standby. + +#### Historique des tailles + +Le script maintient un historique des tailles de datasets pour détecter des variations anormales (chute brutale de taille indiquant un problème). + +## Configuration NFS + +### Exports NFS sur le LXC 103 + +Le fichier `/etc/exports` définit les partages NFS : + +```bash +# Pools zpool2 exposés à une VM spécifique (192.168.100.250) +/zpool2 192.168.100.250(sync,wdelay,hide,crossmnt,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash) +/zpool2/photos 192.168.100.250(sync,wdelay,hide,crossmnt,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash) +/zpool2/storage 192.168.100.250(sync,wdelay,hide,crossmnt,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash) + +# Partage principal accessible à tout le réseau +/data-nfs-share 192.168.100.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,insecure,no_root_squash,no_all_squash) +``` + +### Options NFS expliquées + +| Option | Description | +|--------|-------------| +| `sync` | Confirme les écritures uniquement après commit sur disque (intégrité) | +| `wdelay` | Regroupe les écritures pour améliorer les performances | +| `hide` | Cache les sous-montages des clients NFS v3 | +| `crossmnt` | Permet de traverser les montages (utile avec les datasets ZFS) | +| `no_subtree_check` | Désactive la vérification des sous-arborescences (performance) | +| `rw` | Lecture/écriture | +| `secure` | Exige que les requêtes proviennent de ports < 1024 (sécurité) | +| `insecure` | Autorise les ports > 1024 (nécessaire pour certains clients) | +| `no_root_squash` | Préserve les permissions root (évite le mapping vers nobody) | +| `no_all_squash` | Préserve les UIDs/GIDs des utilisateurs | + +:::warning Sécurité : no_root_squash +L'option `no_root_squash` permet aux clients NFS d'effectuer des opérations en tant que root. Cela est acceptable dans un réseau domestique de confiance (192.168.100.0/24), mais constituerait un **risque de sécurité majeur** sur un réseau non maîtrisé. +::: + +### Services systemd + +Services NFS actifs sur le LXC : + +```bash +nfs-server.service enabled # Serveur NFS principal +nfs-blkmap.service enabled # Support pNFS block layout +nfs-client.target enabled # Cible pour les clients NFS +``` + +### Ports réseau + +Ports NFS en écoute : + +``` +2049/tcp # NFSv4 (principal) +111/tcp # Portmapper (rpcbind) +``` + +## Montage NFS côté client + +### Configuration /etc/fstab + +Pour monter automatiquement le partage NFS au démarrage d'une VM ou conteneur, ajouter l'entrée suivante dans `/etc/fstab` : + +```fstab +192.168.100.150:/data-nfs-share /mnt/storage nfs hard,intr,timeo=100,retrans=30,_netdev,nofail,x-systemd.automount 0 0 +``` + +:::tip Exemple concret +Cette configuration est utilisée sur ma [VM de production Docker Compose & Ansible](/docs/homelab-actuel/docker-compose) qui héberge l'ensemble de mes services conteneurisés. +::: + +### Options de montage expliquées + +| Option | Description | +|--------|-------------| +| `hard` | En cas d'indisponibilité du serveur NFS, les opérations I/O sont **bloquées en attente** plutôt que d'échouer (garantit l'intégrité) | +| `intr` | Permet d'interrompre les opérations I/O bloquées avec Ctrl+C (utile en cas de problème réseau) | +| `timeo=100` | Timeout de 10 secondes (100 dixièmes de seconde) avant de retry | +| `retrans=30` | Nombre de retransmissions avant de déclarer une erreur (30 × 10s = 5 minutes de retry) | +| `_netdev` | Indique que le montage nécessite le réseau (systemd attend la connectivité réseau) | +| `nofail` | N'empêche pas le boot si le montage échoue (évite un blocage au démarrage) | +| `x-systemd.automount` | Montage automatique à la première utilisation (évite de bloquer le boot) | +| `0 0` | Pas de dump ni de fsck (non applicable pour NFS) | + +### Comportement lors d'un failover NFS + +Grâce aux options `hard` et `retrans=30`, lors du basculement du serveur NFS (~60 secondes) : + +1. **Pendant le failover** : Les opérations I/O en cours sont **suspendues** (hard mount) +2. **Retry automatique** : Le client NFS retry pendant 5 minutes (30 × 10s) +3. **Reprise transparente** : Dès que le serveur NFS redémarre sur l'autre nœud, les opérations I/O reprennent **automatiquement** +4. **Aucune intervention** : Les applications n'ont pas besoin de redémarrer ni de remonter le partage + +:::info Tolérance aux pannes +Le temps de retry (5 minutes) est largement supérieur au RTO du serveur NFS (~60 secondes), garantissant que les clients survivent au failover sans erreur. +::: + +### Vérification du montage automatique + +```bash +# Recharger systemd pour prendre en compte le fstab +systemctl daemon-reload + +# Tester le montage sans reboot +mount -a +``` + +## Haute disponibilité et temps de basculement + +### Architecture HA grâce à Linstor DRBD + +Le serveur NFS bénéficie de la haute disponibilité Proxmox grâce au **rootfs du LXC 103 stocké sur Linstor DRBD** : + +![Ressources HA Proxmox](/img/docs/zfs-replication-nfs/zfs-nfs-proxmox-ha-resources.png) + +La capture d'écran ci-dessus montre la configuration HA Proxmox du serveur NFS : +- **LXC 103 (nfs-server)** : Ressource HA avec Max. Restart = 2, actuellement hébergé sur le nœud `elitedesk` +- Le LXC peut redémarrer automatiquement sur l'autre nœud en cas de panne, grâce à son rootfs sur stockage DRBD partagé + +### Scénario de panne : failover automatique + +En cas de panne d'un nœud hébergeant le LXC 103 : + +1. **Détection** (5-10s) : Proxmox HA Manager détecte la panne du nœud via le quorum +2. **Décision** (1-2s) : Le HA Manager décide de redémarrer le LXC sur le nœud survivant +3. **Migration du stockage** (0s) : Le rootfs DRBD est déjà répliqué et accessible sur l'autre nœud +4. **Démarrage du LXC** (40-50s) : Le LXC démarre sur le nouveau nœud +5. **Montage ZFS et démarrage NFS** (5-10s) : Les datasets ZFS locaux sont montés et le service NFS démarre + +**Temps total de basculement : ~60 secondes** + +:::info RPO et RTO +- **RPO (Recovery Point Objective)** : 10 minutes (intervalle de réplication ZFS) +- **RTO (Recovery Time Objective)** : ~60 secondes (temps de failover du LXC) + +Ces valeurs sont **largement acceptables** pour un serveur NFS de données froides dans un contexte homelab. +::: + +### Adaptation automatique de la réplication + +Après le basculement du LXC sur l'autre nœud : + +1. Le script de réplication détecte que le LXC est maintenant sur le nouveau nœud +2. La configuration Sanoid est automatiquement inversée : + - L'**ancien master** devient **standby** (autosnap=no) + - Le **nouveau master** devient actif (autosnap=yes) +3. La réplication s'effectue désormais dans le **sens inverse** + +Aucune intervention manuelle n'est nécessaire. + +## Installation et déploiement + +### Prérequis + +- Cluster Proxmox avec au moins 2 nœuds +- Pools ZFS identiques sur chaque nœud +- LXC avec rootfs sur stockage partagé/distribué (Linstor DRBD) +- Sanoid et Syncoid installés sur les nœuds Proxmox +- Accès SSH entre les nœuds (clés SSH configurées) + +### Installation du script + +```bash +# Sur chaque nœud Proxmox + +# 1. Cloner le dépôt Git +cd /tmp +git clone https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha.git +cd zfs-sync-nfs-ha + +# 2. Installer le script +cp zfs-nfs-replica.sh /usr/local/bin/ +chmod +x /usr/local/bin/zfs-nfs-replica.sh + +# 3. Installer les services systemd +cp zfs-nfs-replica.service /etc/systemd/system/ +cp zfs-nfs-replica.timer /etc/systemd/system/ + +# 4. Activer et démarrer le timer +systemctl daemon-reload +systemctl enable --now zfs-nfs-replica.timer + +# 5. Nettoyage +cd .. +rm -rf zfs-sync-nfs-ha +``` + +### Configuration Sanoid de base + +Créer `/etc/sanoid/sanoid.conf` avec le template de production : + +```ini +[template_production] + frequently = 0 + hourly = 24 + daily = 7 + weekly = 4 + monthly = 6 + yearly = 0 + autosnap = yes + autoprune = yes +``` + +Le script modifiera automatiquement les paramètres `autosnap` selon le rôle du nœud. + +### Vérification du fonctionnement + +```bash +# Vérifier l'état du timer +systemctl status zfs-nfs-replica.timer + +# Afficher les logs de la dernière exécution +journalctl -u zfs-nfs-replica.service -n 50 + +# Lister les snapshots Sanoid +sanoid --monitor-snapshots + +# Vérifier la réplication sur le standby +zfs list -t snapshot | grep zpool1/data-nfs-share +``` + +#### État des snapshots + +```bash +root@elitedesk:~# sanoid --monitor-snapshots | grep -E "(zpool1|zpool2)" +OK: all monitored datasets (zpool1, zpool1/data-nfs-share, zpool1/pbs-backups, + zpool2, zpool2/photos, zpool2/storage) have fresh snapshots +``` + +Tous les datasets configurés ont des snapshots à jour, confirmant que Sanoid fonctionne correctement. + +#### Logs du service de réplication + +Exemple de logs lors d'une exécution réussie sur le nœud master (elitedesk) : + +```bash +root@elitedesk:~# journalctl -u zfs-nfs-replica.service --since "1 hour ago" +Dec 18 17:44:35 elitedesk systemd[1]: Starting zfs-nfs-replica.service - ZFS NFS HA Replication Service... +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] ======================================== +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Démarrage du script version 2.0.1 +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Nœud: elitedesk +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] ======================================== +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Vérification des mises à jour depuis https://forgejo.tellserv.fr +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] ✓ Script à jour (version 2.0.1) +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Nœud distant configuré: acemagician (192.168.100.11) +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Pools configurés: zpool1 zpool2 +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Vérification #1/3 du statut du LXC 103 +Dec 18 17:44:37 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:37] [info] [global] Vérification #1/3 réussie: LXC 103 est actif sur ce nœud +Dec 18 17:44:39 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:39] [info] [global] Vérification #2/3 du statut du LXC 103 +Dec 18 17:44:41 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:41] [info] [global] Vérification #2/3 réussie: LXC 103 est actif sur ce nœud +Dec 18 17:44:43 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:43] [info] [global] Vérification #3/3 du statut du LXC 103 +Dec 18 17:44:45 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:45] [info] [global] Vérification #3/3 réussie: LXC 103 est actif sur ce nœud +Dec 18 17:44:45 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:45] [info] [global] ✓ Triple vérification réussie: le LXC 103 est sur ce nœud +Dec 18 17:44:45 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:45] [info] [global] Configuration de Sanoid en mode ACTIF (autosnap=yes) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [global] Connexion SSH vers acemagician (192.168.100.11) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [global] ======================================== +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [global] Début de la réplication de 2 pool(s) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [global] ======================================== +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] ======================================== +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Début de la réplication du pool: zpool1 +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] ======================================== +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Verrou acquis pour zpool1 +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Début de la réplication récursive: zpool1 +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Vérification des snapshots en commun entre master et standby +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] ✓ 209 snapshot(s) en commun trouvé(s) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Mode: Réplication incrémentale (snapshot le plus récent en commun) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Datasets à répliquer: +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] - zpool1/data-nfs-share +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] - zpool1/pbs-backups +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] === Réplication de zpool1/data-nfs-share (récursif) === +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3534180]: NEWEST SNAPSHOT: autosnap_2025-12-18_16:30:10_frequently +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3534180]: INFO: no snapshots on source newer than autosnap_2025-12-18_16:30:10_frequently on target. Nothing to do. +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:47] [info] [zpool1] ✓ zpool1/data-nfs-share répliqué avec succès +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:47] [info] [zpool1] === Réplication de zpool1/pbs-backups (récursif) === +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3534221]: NEWEST SNAPSHOT: autosnap_2025-12-18_16:30:10_frequently +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3534221]: INFO: no snapshots on source newer than autosnap_2025-12-18_16:30:10_frequently on target. Nothing to do. +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:47] [info] [zpool1] ✓ zpool1/pbs-backups répliqué avec succès +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:47] [info] [zpool1] Nombre de datasets traités: 2 +``` + +Points clés visibles dans les logs : +- **Triple vérification** que le LXC 103 est bien sur le nœud local avant toute réplication +- **Configuration automatique** de Sanoid en mode ACTIF (autosnap=yes) +- **Réplication incrémentale** basée sur 209 snapshots communs +- **Pas de transfert nécessaire** : les datasets sont déjà synchronisés (dernière modification à 16:30, réplication à 17:44) +- **Traitement récursif** de tous les datasets enfants + +### Restaurer depuis un snapshot + +```bash +# Lister les snapshots disponibles +zfs list -t snapshot zpool1/data-nfs-share + +# Rollback vers un snapshot spécifique +zfs rollback zpool1/data-nfs-share@autosnap_2025-12-18_12:00:00_hourly + +# Ou cloner le snapshot pour inspection +zfs clone zpool1/data-nfs-share@autosnap_2025-12-18_12:00:00_hourly \ + zpool1/data-nfs-share-restore +``` + +## Conclusion + +L'architecture de **stockage hybride** combinant Linstor DRBD et ZFS répliqué offre le meilleur des deux mondes : + +- **Linstor DRBD** pour les VM/LXC : réplication synchrone, live migration, RPO ~0 +- **ZFS répliqué** pour les données froides : capacité importante, intégrité excellente, overhead minimal + +Le serveur NFS hautement disponible, avec son **rootfs sur DRBD** et la **réplication automatique ZFS** garantit : +- Un temps de basculement de **~60 secondes** en cas de panne +- Une adaptation automatique au failover Proxmox HA +- Une **perte de données maximale de 10 minutes** (RPO) +- Aucune intervention manuelle requise + +Cette solution est **parfaitement adaptée** à un homelab nécessitant haute disponibilité pour un serveur NFS de données froides, tout en conservant des ressources (CPU, RAM, réseau) pour les services critiques. + +## Ressources + +- [Script zfs-sync-nfs-ha](https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha) +- [Documentation Sanoid](https://github.com/jimsalterjrs/sanoid) +- [Article : Stockage distribué Proxmox](/blog/stockage-distribue-proxmox-ha) +- [Proxmox HA Manager](https://pve.proxmox.com/wiki/High_Availability) diff --git a/i18n/en/docusaurus-plugin-content-docs/current/zfs-replication-nfs.md b/i18n/en/docusaurus-plugin-content-docs/current/zfs-replication-nfs.md new file mode 100644 index 0000000..f80333d --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-docs/current/zfs-replication-nfs.md @@ -0,0 +1,679 @@ +--- +sidebar_position: 1 +tags: [zfs, nfs, high-availability, replication, proxmox, homelab, sanoid, syncoid] +last_update: + date: 2025-12-18 +--- + +# ZFS Replication and Highly Available NFS Server + +Documentation of my hybrid storage infrastructure: Linstor DRBD distributed storage for VMs, and active-passive ZFS replication for cold data with a highly available NFS server. + +## Context and Problem Statement + +### Hybrid Storage Architecture + +My Proxmox cluster uses two types of storage with different needs and constraints: + +#### High-Performance Storage for VM/LXC: Linstor DRBD + +- **Usage**: System disks for virtual machines and containers +- **Requirements**: Synchronous replication, live migration, RPO ~0 +- **Support**: NVMe SSDs on Proxmox nodes +- **Technology**: Linstor DRBD (see [blog post on distributed storage](/blog/stockage-distribue-proxmox-ha)) + +#### Cold Data Storage: Replicated ZFS + +- **Usage**: Media, user files, Proxmox Backup Server backups +- **Requirements**: Large capacity, data integrity, high availability but live migration not required +- **Support**: USB drives on Proxmox nodes (independent ZFS pools) +- **Technology**: Active-passive ZFS replication with Sanoid/Syncoid + +### Why Not Use Linstor DRBD for Everything? + +Synchronous distributed storage like Linstor DRBD has several constraints for cold data: + +- **Write Performance**: Every write must be confirmed on multiple nodes, penalizing large file transfers +- **Network Consumption**: Synchronous replication would saturate the 1 Gbps network during massive transfers +- **Unnecessary Complexity**: Cold data doesn't need live migration or near-zero RPO +- **Cost/Benefit**: Resource over-consumption for a need that can be satisfied by asynchronous replication + +### The Solution: Active-Passive ZFS Replication + +For cold data, **asynchronous snapshot-based replication** offers the best compromise: + +| Criteria | Linstor DRBD | Replicated ZFS | +|---------|--------------|--------------| +| Replication Type | Synchronous | Asynchronous (snapshots) | +| Network Overhead | High (continuous) | Low (periodic) | +| RPO | ~0 | Snapshot interval (10 min) | +| Live Migration | Yes | Not necessary | +| Data Integrity | Good | Excellent (ZFS checksums) | +| Suited for | VM/LXC system | Large cold data | + +An RPO of 10 minutes is **perfectly acceptable** for media and user files: in case of node failure, only changes from the last 10 minutes could be lost. + +## Architecture + +### Overview + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Proxmox HA Cluster │ +│ │ +│ ┌──────────────────┐ ┌──────────────────┐ │ +│ │ acemagician │ │ elitedesk │ │ +│ │ │◄────────────►│ │ │ +│ │ - zpool1 (10TB) │ Replication │ - zpool1 (10TB) │ │ +│ │ - zpool2 (2TB) │ Sanoid/ │ - zpool2 (2TB) │ │ +│ │ │ Syncoid │ │ │ +│ └────────┬─────────┘ └─────────┬────────┘ │ +│ │ │ │ +│ │ ┌──────────────┐ │ │ +│ └────────►│ LXC 103 │◄────────┘ │ +│ │ NFS Server │ │ +│ │ (rootfs on │ │ +│ │ DRBD) │ │ +│ └──────┬───────┘ │ +└────────────────────────────┼──────────────────────────────┘ + │ + ▼ + NFS Clients (VMs) + 192.168.100.0/24 +``` + +### Components + +#### ZFS Pools on Proxmox Nodes + +Each node has **two independent ZFS pools**: + +**zpool1** (~10 TB): Large data +- `zpool1/data-nfs-share`: Main NFS share (6.83 TB used) +- `zpool1/pbs-backups`: Proxmox Backup Server backups + +**zpool2** (~2 TB): Media and files +- `zpool2/photos`: Photo library (14.7 GB) +- `zpool2/storage`: Miscellaneous files (19.1 GB) + +**Pool status on nodes**: + +```bash +# Node acemagician +root@acemagician:~# zfs list +NAME USED AVAIL REFER MOUNTPOINT +zpool1 7.83T 2.95T 104K /zpool1 +zpool1/data-nfs-share 6.83T 2.95T 6.79T /zpool1/data-nfs-share +zpool1/pbs-backups 96K 1024G 96K /zpool1/pbs-backups +zpool2 33.9G 1.72T 104K /zpool2 +zpool2/photos 14.7G 1.72T 12.7G /zpool2/photos +zpool2/storage 19.1G 1.72T 19.1G /zpool2/storage + +# Node elitedesk +root@elitedesk:~# zfs list +NAME USED AVAIL REFER MOUNTPOINT +zpool1 7.83T 2.97T 96K /zpool1 +zpool1/data-nfs-share 6.83T 2.97T 6.79T /zpool1/data-nfs-share +zpool1/pbs-backups 96K 1024G 96K /zpool1/pbs-backups +zpool2 33.9G 1.72T 112K /zpool2 +zpool2/photos 14.7G 1.72T 12.7G /zpool2/photos +zpool2/storage 19.1G 1.72T 19.1G /zpool2/storage +``` + +Note that pools are **perfectly synchronized** between the two nodes, with identical sizes for each dataset. + +:::info +Pools are **identical on both nodes** thanks to automatic bidirectional replication. The active node (hosting the LXC) is always the master. +::: + +#### LXC 103: Highly Available NFS Server + +The LXC 103 container acts as an NFS server with the following characteristics: + +- **Rootfs on Linstor DRBD**: Enables high availability via Proxmox HA +- **ZFS Dataset Mounting**: Direct access to host node pools via bind mount +- **NFS Service**: Exposes datasets via NFS to network clients +- **Automatic Failover**: In case of failure, Proxmox HA restarts the LXC on the other node (~60s downtime) + +![NFS LXC Configuration](/img/docs/zfs-replication-nfs/zfs-nfs-lxc-configuration.png) + +**Detailed configuration**: +- **CPU**: 2 cores +- **RAM**: 1 GB (+ 512 MB swap) +- **Rootfs**: 8 GB on `linstor_storage` (DRBD distributed storage) +- **Mount Point (mp0)**: `/zpool1/data-nfs-share,mp=/data-nfs-share,shared=1` + +:::warning Important: shared=1 option +The `shared=1` option is **mandatory** for ZFS dataset bind mount. Without this option, the container could encounter access or permission issues when mounting the dataset from the host node. +::: + +:::tip Why Linstor DRBD for LXC rootfs? +The NFS container rootfs is stored on Linstor DRBD to benefit from **Proxmox high availability**. This allows the LXC to automatically fail over to the other node in case of failure, with only about **60 seconds** of downtime. + +Without shared/distributed storage, Proxmox HA couldn't automatically migrate the container, requiring manual intervention. +::: + +#### Automatic Replication Script + +The [`zfs-nfs-replica.sh`](https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha) script runs every **10 minutes** via a systemd timer and implements the following logic: + +![Replication Script Flow Diagram](/img/docs/zfs-replication-nfs/zfs-nfs-replication-flowchart.png) + +1. **Automatic Master Detection**: The node hosting LXC 103 automatically becomes the master +2. **Dynamic Sanoid Configuration**: + - **Master Node**: `autosnap=yes`, `autoprune=yes` (snapshot creation) + - **Standby Node**: `autosnap=no`, `autoprune=yes` (receive only) +3. **Replication via Syncoid**: Incremental transfer of snapshots from master to standby +4. **Security Checks**: + - Triple verification that the correct node is master + - Size comparison to detect empty replacement disk + - Size history to prevent accidental overwrites + +## Technical Operation + +### Automatic Master Node Detection + +The script determines which node hosts LXC 103: + +```bash +# Detect active node +ACTIVE_NODE=$(pvesh get /cluster/resources --type vm --output-format json | \ + jq -r '.[] | select(.vmid==103) | .node') + +# Compare with local node +CURRENT_NODE=$(hostname) + +if [ "$ACTIVE_NODE" = "$CURRENT_NODE" ]; then + # This node is the master + configure_as_master +else + # This node is on standby + configure_as_standby +fi +``` + +This detection ensures the system automatically adapts to LXC migrations, whether **planned** (maintenance) or **automatic** (Proxmox HA failover). + +### Dynamic Sanoid Configuration + +Sanoid is configured differently based on node role: + +#### Master Node (hosts LXC 103) + +```ini +[zpool1/data-nfs-share] + use_template = production + recursive = yes + autosnap = yes # Automatic snapshot creation + autoprune = yes # Old snapshot cleanup + +[zpool2/photos] + use_template = production + recursive = yes + autosnap = yes + autoprune = yes + +[zpool2/storage] + use_template = production + recursive = yes + autosnap = yes + autoprune = yes +``` + +#### Standby Node + +```ini +[zpool1/data-nfs-share] + use_template = production + recursive = yes + autosnap = no # No snapshot creation + autoprune = yes # Old snapshot cleanup + +[zpool2/photos] + use_template = production + recursive = yes + autosnap = no + autoprune = yes + +[zpool2/storage] + use_template = production + recursive = yes + autosnap = no + autoprune = yes +``` + +### Replication with Syncoid + +Syncoid performs incremental snapshot replication from master to standby: + +```bash +# Replicate each dataset +syncoid --no-sync-snap --recursive \ + root@master:zpool1/data-nfs-share \ + zpool1/data-nfs-share + +syncoid --no-sync-snap --recursive \ + root@master:zpool2/photos \ + zpool2/photos + +syncoid --no-sync-snap --recursive \ + root@master:zpool2/storage \ + zpool2/storage +``` + +The `--no-sync-snap` option avoids creating an additional sync snapshot, using only existing Sanoid snapshots. + +### Security Mechanisms + +The script implements several checks to prevent data loss: + +#### Triple Replication Direction Verification + +Before each replication, the script verifies **three times** that: +1. LXC 103 is on the local node +2. The local node is the master +3. Sanoid configuration is in master mode + +If any of these checks fails, replication is **aborted** to prevent replication in the wrong direction. + +#### Empty Disk Protection + +Before replicating, the script compares dataset sizes: + +```bash +# Get sizes +SOURCE_SIZE=$(ssh root@master "zfs get -Hp -o value used zpool1/data-nfs-share") +TARGET_SIZE=$(zfs get -Hp -o value used zpool1/data-nfs-share) + +# If source is significantly smaller than target +if [ $SOURCE_SIZE -lt $(($TARGET_SIZE / 2)) ]; then + echo "ERROR: Suspicious source size, empty replacement disk?" + exit 1 +fi +``` + +This prevents an empty replacement disk from overwriting standby data. + +#### Size History + +The script maintains a dataset size history to detect abnormal variations (sudden size drop indicating a problem). + +## NFS Configuration + +### NFS Exports on LXC 103 + +The `/etc/exports` file defines NFS shares: + +```bash +# zpool2 pools exposed to specific VM (192.168.100.250) +/zpool2 192.168.100.250(sync,wdelay,hide,crossmnt,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash) +/zpool2/photos 192.168.100.250(sync,wdelay,hide,crossmnt,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash) +/zpool2/storage 192.168.100.250(sync,wdelay,hide,crossmnt,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash) + +# Main share accessible to entire network +/data-nfs-share 192.168.100.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,insecure,no_root_squash,no_all_squash) +``` + +### NFS Options Explained + +| Option | Description | +|--------|-------------| +| `sync` | Confirms writes only after disk commit (integrity) | +| `wdelay` | Groups writes to improve performance | +| `hide` | Hides sub-mounts from NFS v3 clients | +| `crossmnt` | Allows crossing mounts (useful with ZFS datasets) | +| `no_subtree_check` | Disables subtree checking (performance) | +| `rw` | Read/write | +| `secure` | Requires requests from ports < 1024 (security) | +| `insecure` | Allows ports > 1024 (necessary for some clients) | +| `no_root_squash` | Preserves root permissions (avoids mapping to nobody) | +| `no_all_squash` | Preserves user UIDs/GIDs | + +:::warning Security: no_root_squash +The `no_root_squash` option allows NFS clients to perform operations as root. This is acceptable in a trusted home network (192.168.100.0/24), but would constitute a **major security risk** on an untrusted network. +::: + +### Systemd Services + +Active NFS services on LXC: + +```bash +nfs-server.service enabled # Main NFS server +nfs-blkmap.service enabled # pNFS block layout support +nfs-client.target enabled # Target for NFS clients +nfs-exports-update.timer enabled # Automatic export updates +``` + +### Network Ports + +NFS listening ports: + +``` +2049/tcp # NFSv4 (main) +111/tcp # Portmapper (rpcbind) +``` + +## Client-Side NFS Mounting + +### /etc/fstab Configuration + +To automatically mount the NFS share on VM or container boot, add the following entry to `/etc/fstab`: + +```fstab +192.168.100.150:/data-nfs-share /mnt/storage nfs hard,intr,timeo=100,retrans=30,_netdev,nofail,x-systemd.automount 0 0 +``` + +:::tip Real Example +This configuration is used on my [Docker Compose & Ansible production VM](/docs/homelab-actuel/docker-compose) which hosts all my containerized services. +::: + +### Mount Options Explained + +| Option | Description | +|--------|-------------| +| `hard` | In case of NFS server unavailability, I/O operations are **blocked waiting** rather than failing (ensures integrity) | +| `intr` | Allows interrupting blocked I/O operations with Ctrl+C (useful in case of network issues) | +| `timeo=100` | 10-second timeout (100 tenths of a second) before retry | +| `retrans=30` | Number of retransmissions before declaring error (30 × 10s = 5 minutes of retry) | +| `_netdev` | Indicates mount requires network (systemd waits for network connectivity) | +| `nofail` | Doesn't prevent boot if mount fails (avoids boot blocking) | +| `x-systemd.automount` | Automatic mount on first use (avoids blocking boot) | +| `0 0` | No dump or fsck (not applicable for NFS) | + +### Behavior During NFS Failover + +Thanks to `hard` and `retrans=30` options, during NFS server failover (~60 seconds): + +1. **During Failover**: Ongoing I/O operations are **suspended** (hard mount) +2. **Automatic Retry**: NFS client retries for 5 minutes (30 × 10s) +3. **Transparent Recovery**: As soon as NFS server restarts on the other node, I/O operations resume **automatically** +4. **No Intervention**: Applications don't need to restart or remount the share + +:::info Fault Tolerance +The retry time (5 minutes) is well above the NFS server RTO (~60 seconds), ensuring clients survive failover without errors. +::: + +### Manual Mounting + +To temporarily mount the NFS share: + +```bash +# Create mount point +mkdir -p /mnt/storage + +# Manual mount +mount -t nfs -o hard,intr,timeo=100,retrans=30 \ + 192.168.100.150:/data-nfs-share /mnt/storage + +# Verify mount +df -h /mnt/storage +mount | grep nfs +``` + +### Verify Automatic Mounting + +```bash +# Reload systemd to account for fstab +systemctl daemon-reload + +# Test mount without reboot +mount -a + +# Verify mount is active +systemctl status mnt-storage.mount + +# Display NFS statistics +nfsstat -m +``` + +## High Availability and Failover Time + +### HA Architecture Thanks to Linstor DRBD + +The NFS server benefits from Proxmox high availability thanks to **LXC 103 rootfs stored on Linstor DRBD**: + +![Proxmox HA Resources](/img/docs/zfs-replication-nfs/zfs-nfs-proxmox-ha-resources.png) + +The screenshot above shows the Proxmox HA configuration of the NFS server: +- **LXC 103 (nfs-server)**: HA resource with Max. Restart = 2, currently hosted on `elitedesk` node +- The LXC can automatically restart on the other node in case of failure, thanks to its rootfs on shared DRBD storage + +### Failure Scenario: Automatic Failover + +In case of failure of a node hosting LXC 103: + +1. **Detection** (5-10s): Proxmox HA Manager detects node failure via quorum +2. **Decision** (1-2s): HA Manager decides to restart LXC on surviving node +3. **Storage Migration** (0s): DRBD rootfs is already replicated and accessible on the other node +4. **LXC Startup** (40-50s): LXC starts on new node +5. **ZFS Mount and NFS Start** (5-10s): Local ZFS datasets are mounted and NFS service starts + +**Total failover time: ~60 seconds** + +:::info RPO and RTO +- **RPO (Recovery Point Objective)**: 10 minutes (ZFS replication interval) +- **RTO (Recovery Time Objective)**: ~60 seconds (LXC failover time) + +These values are **widely acceptable** for a cold data NFS server in a homelab context. +::: + +### Automatic Replication Adaptation + +After LXC failover to the other node: + +1. The replication script detects LXC is now on the new node +2. Sanoid configuration is automatically reversed: + - The **former master** becomes **standby** (autosnap=no) + - The **new master** becomes active (autosnap=yes) +3. Replication now occurs in the **opposite direction** + +No manual intervention required. + +## Installation and Deployment + +### Prerequisites + +- Proxmox cluster with at least 2 nodes +- Identical ZFS pools on each node +- LXC with rootfs on shared/distributed storage (Linstor DRBD) +- Sanoid and Syncoid installed on Proxmox nodes +- SSH access between nodes (SSH keys configured) + +### Script Installation + +```bash +# On each Proxmox node + +# 1. Clone Git repository +cd /tmp +git clone https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha.git +cd zfs-sync-nfs-ha + +# 2. Install script +cp zfs-nfs-replica.sh /usr/local/bin/ +chmod +x /usr/local/bin/zfs-nfs-replica.sh + +# 3. Install systemd services +cp zfs-nfs-replica.service /etc/systemd/system/ +cp zfs-nfs-replica.timer /etc/systemd/system/ + +# 4. Enable and start timer +systemctl daemon-reload +systemctl enable --now zfs-nfs-replica.timer + +# 5. Cleanup +cd .. +rm -rf zfs-sync-nfs-ha +``` + +### Basic Sanoid Configuration + +Create `/etc/sanoid/sanoid.conf` with production template: + +```ini +[template_production] + frequently = 0 + hourly = 24 + daily = 7 + weekly = 4 + monthly = 6 + yearly = 0 + autosnap = yes + autoprune = yes +``` + +The script will automatically modify `autosnap` parameters based on node role. + +### Verify Operation + +```bash +# Check timer status +systemctl status zfs-nfs-replica.timer + +# Display logs from last execution +journalctl -u zfs-nfs-replica.service -n 50 + +# List Sanoid snapshots +sanoid --monitor-snapshots + +# Verify replication on standby +zfs list -t snapshot | grep zpool1/data-nfs-share +``` + +#### Snapshot Status + +```bash +root@elitedesk:~# sanoid --monitor-snapshots | grep -E "(zpool1|zpool2)" +OK: all monitored datasets (zpool1, zpool1/data-nfs-share, zpool1/pbs-backups, + zpool2, zpool2/photos, zpool2/storage) have fresh snapshots +``` + +All configured datasets have up-to-date snapshots, confirming Sanoid is working correctly. + +#### Replication Service Logs + +Example logs during successful execution on master node (elitedesk): + +```bash +root@elitedesk:~# journalctl -u zfs-nfs-replica.service --since "1 hour ago" +Dec 18 17:44:35 elitedesk systemd[1]: Starting zfs-nfs-replica.service - ZFS NFS HA Replication Service... +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] ======================================== +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Starting script version 2.0.1 +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Node: elitedesk +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] ======================================== +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Checking updates from https://forgejo.tellserv.fr +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] ✓ Script up to date (version 2.0.1) +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Remote node configured: acemagician (192.168.100.11) +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Configured pools: zpool1 zpool2 +Dec 18 17:44:35 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:35] [info] [global] Verification #1/3 of LXC 103 status +Dec 18 17:44:37 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:37] [info] [global] Verification #1/3 successful: LXC 103 is active on this node +Dec 18 17:44:39 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:39] [info] [global] Verification #2/3 of LXC 103 status +Dec 18 17:44:41 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:41] [info] [global] Verification #2/3 successful: LXC 103 is active on this node +Dec 18 17:44:43 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:43] [info] [global] Verification #3/3 of LXC 103 status +Dec 18 17:44:45 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:45] [info] [global] Verification #3/3 successful: LXC 103 is active on this node +Dec 18 17:44:45 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:45] [info] [global] ✓ Triple verification successful: LXC 103 is on this node +Dec 18 17:44:45 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:45] [info] [global] Configuring Sanoid in ACTIVE mode (autosnap=yes) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [global] SSH connection to acemagician (192.168.100.11) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [global] ======================================== +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [global] Starting replication of 2 pool(s) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [global] ======================================== +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] ======================================== +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Starting pool replication: zpool1 +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] ======================================== +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Lock acquired for zpool1 +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Starting recursive replication: zpool1 +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Checking common snapshots between master and standby +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] ✓ 209 common snapshot(s) found +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Mode: Incremental replication (most recent common snapshot) +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] Datasets to replicate: +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] - zpool1/data-nfs-share +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] - zpool1/pbs-backups +Dec 18 17:44:46 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:46] [info] [zpool1] === Replicating zpool1/data-nfs-share (recursive) === +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3534180]: NEWEST SNAPSHOT: autosnap_2025-12-18_16:30:10_frequently +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3534180]: INFO: no snapshots on source newer than autosnap_2025-12-18_16:30:10_frequently on target. Nothing to do. +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:47] [info] [zpool1] ✓ zpool1/data-nfs-share replicated successfully +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:47] [info] [zpool1] === Replicating zpool1/pbs-backups (recursive) === +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3534221]: NEWEST SNAPSHOT: autosnap_2025-12-18_16:30:10_frequently +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3534221]: INFO: no snapshots on source newer than autosnap_2025-12-18_16:30:10_frequently on target. Nothing to do. +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:47] [info] [zpool1] ✓ zpool1/pbs-backups replicated successfully +Dec 18 17:44:47 elitedesk zfs-nfs-replica[3533956]: [2025-12-18 17:44:47] [info] [zpool1] Number of datasets processed: 2 +``` + +Key points visible in logs: +- **Triple verification** that LXC 103 is on local node before any replication +- **Automatic configuration** of Sanoid in ACTIVE mode (autosnap=yes) +- **Incremental replication** based on 209 common snapshots +- **No transfer needed**: datasets are already synchronized (last modification at 16:30, replication at 17:44) +- **Recursive processing** of all child datasets + +### Restore from Snapshot + +```bash +# List available snapshots +zfs list -t snapshot zpool1/data-nfs-share + +# Rollback to specific snapshot +zfs rollback zpool1/data-nfs-share@autosnap_2025-12-18_12:00:00_hourly + +# Or clone snapshot for inspection +zfs clone zpool1/data-nfs-share@autosnap_2025-12-18_12:00:00_hourly \ + zpool1/data-nfs-share-restore +``` + +### Script Update + +The script includes auto-update functionality: + +```bash +# Script automatically checks for updates +# Force update check +/usr/local/bin/zfs-nfs-replica.sh --check-update +``` + +## Limitations and Considerations + +### 10-Minute RPO + +Unlike Linstor DRBD which offers near-zero RPO, ZFS replication every 10 minutes means that in case of master node failure, **changes from the last 10 minutes** could be lost. + +For cold data (media, files), this is acceptable. For critical data requiring RPO ~0, Linstor DRBD remains the appropriate solution. + +### ~60 Second Downtime During Failover + +Automatic LXC failover takes approximately **60 seconds**. During this time, the NFS server is inaccessible. + +NFS clients will see their I/O operations blocked, then automatically resume once the server is available again (thanks to NFS retry mechanisms). + +### Unidirectional Replication + +At any time T, replication always occurs **from master to standby**. There is no simultaneous bidirectional replication. + +If modifications are made on the standby (which shouldn't happen in normal use), they will be **overwritten** during the next replication. + +### Network Dependency + +Replication requires network connectivity between nodes. In case of network partition (split-brain), each node could believe itself to be master. + +The script implements checks to minimize this risk, but in a prolonged split-brain scenario, manual intervention may be necessary. + +## Conclusion + +The **hybrid storage** architecture combining Linstor DRBD and replicated ZFS offers the best of both worlds: + +- **Linstor DRBD** for VM/LXC: synchronous replication, live migration, RPO ~0 +- **Replicated ZFS** for cold data: large capacity, excellent integrity, minimal overhead + +The highly available NFS server, with its **rootfs on DRBD** and **automatic ZFS replication**, ensures: +- Failover time of **~60 seconds** in case of failure +- Automatic adaptation to Proxmox HA failover +- **Maximum data loss of 10 minutes** (RPO) +- No manual intervention required + +This solution is **perfectly suited** for a homelab requiring high availability for a cold data NFS server, while preserving resources (CPU, RAM, network) for critical services. + +## Resources + +- [zfs-sync-nfs-ha Script](https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha) +- [Sanoid Documentation](https://github.com/jimsalterjrs/sanoid) +- [Article: Distributed Storage Proxmox](/blog/stockage-distribue-proxmox-ha) +- [Proxmox HA Manager](https://pve.proxmox.com/wiki/High_Availability) diff --git a/static/img/docs/zfs-replication-nfs/zfs-nfs-lxc-configuration.png b/static/img/docs/zfs-replication-nfs/zfs-nfs-lxc-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c62cf3912020acbf59aff55337a50cb6430bb4 GIT binary patch literal 26631 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 Qe*Q8s+;336=WzIc0fn_K*8l(j literal 0 HcmV?d00001 diff --git a/static/img/docs/zfs-replication-nfs/zfs-nfs-proxmox-ha-resources.png b/static/img/docs/zfs-replication-nfs/zfs-nfs-proxmox-ha-resources.png new file mode 100644 index 0000000000000000000000000000000000000000..4b81ea2f9602f83c6890d41026dc5bb3f9eb74a2 GIT binary patch literal 55779 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 Mbk$!Szxdm~0on;2!2kdN literal 0 HcmV?d00001 diff --git a/static/img/docs/zfs-replication-nfs/zfs-nfs-replication-flowchart.png b/static/img/docs/zfs-replication-nfs/zfs-nfs-replication-flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7d292e0f17ea2670d3a65dd53a461c937ed70a GIT binary patch literal 54696 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 literal 0 HcmV?d00001