From 464540696bd7df3e35beaa7220fecee543f0f1f1 Mon Sep 17 00:00:00 2001 From: Tellsanguis Date: Sun, 16 Nov 2025 11:01:07 +0100 Subject: [PATCH] Version 1.7.0: Configuration dynamique Sanoid actif/passif - Configuration automatique de sanoid.conf selon le role du noeud - Noeud actif: autosnap=yes, autoprune=yes - Noeud passif: autosnap=no, autoprune=yes - Conforme a la documentation officielle Sanoid - Documentation du mount point LXC shared=1 pour la HA --- README.md | 24 ++++++++++++++-- zfs-nfs-replica.sh | 71 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 71 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index d76897b..d77baef 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,21 @@ Sanoid crée des snapshots selon un calendrier défini : - **Mensuel** : 3 snapshots (rétention de 3 mois) - **Annuel** : 1 snapshot (rétention de 1 an) -**Activation intelligente** : Sanoid est automatiquement activé uniquement sur le nœud actif (celui qui héberge le LXC) et désactivé sur le nœud passif, évitant ainsi les conflits de snapshots. +**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. ### Détection Automatique de Première Synchronisation @@ -150,7 +164,7 @@ Ces protections garantissent qu'un disque vide ne pourra jamais écraser acciden - **Mise à jour automatique** : Le script vérifie et installe automatiquement les nouvelles versions depuis le dépôt Forgejo avant chaque exécution - **Réplication bidirectionnelle automatique** : S'adapte aux migrations Proxmox HA sans intervention manuelle - **Détection automatique première sync/incrémentale** : Bascule automatiquement entre mode initial et mode incrémental -- **Gestion automatique de Sanoid** : Active/désactive Sanoid selon le nœud actif pour éviter les conflits de snapshots +- **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 - **Double protection anti-écrasement** : Vérifications de cohérence des tailles et historique pour prévenir toute perte de données - **Synchronisation récursive du pool** : Tous les datasets sous `zpool1` sont automatiquement inclus - **Contrôle de concurrence par verrou** : Empêche les tâches de réplication simultanées @@ -164,7 +178,7 @@ Ces protections garantissent qu'un disque vide ne pourra jamais écraser acciden ``` . ├── README.md # Ce fichier -├── zfs-nfs-replica.sh # Script principal de réplication (version 1.6.0) +├── zfs-nfs-replica.sh # Script principal de réplication (version 1.7.0) ├── zfs-nfs-replica.service # Définition du service systemd └── zfs-nfs-replica.timer # Configuration du timer systemd ``` @@ -245,6 +259,10 @@ ha-manager migrate ct:103 elitedesk - Cluster Proxmox VE (testé sur 8.x) - Pools ZFS nommés `zpool1` sur les nœuds de production +- **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 + ``` + mp0: /zpool1/data-nfs-share,mp=/data-nfs-share,shared=1 + ``` - Sanoid/Syncoid installés depuis le dépôt officiel Sanoid - Paire de clés SSH dédiée pour la réplication - Conteneur LXC avec rootfs sur LINSTOR/DRBD diff --git a/zfs-nfs-replica.sh b/zfs-nfs-replica.sh index 5140cc8..6e884ed 100644 --- a/zfs-nfs-replica.sh +++ b/zfs-nfs-replica.sh @@ -11,13 +11,13 @@ # - Gère l'activation/désactivation de Sanoid selon le nœud actif # # Auteur : BENE Maël -# Version : 1.6.0 +# Version : 1.7.0 # set -euo pipefail # Configuration -SCRIPT_VERSION="1.6.0" +SCRIPT_VERSION="1.7.0" REPO_URL="https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha" SCRIPT_URL="${REPO_URL}/raw/branch/main/zfs-nfs-replica.sh" SCRIPT_PATH="${BASH_SOURCE[0]}" @@ -176,30 +176,59 @@ verify_lxc_is_active() { fi } -# Gestion de Sanoid selon le nœud actif -manage_sanoid() { - local action="$1" # "enable" ou "disable" +# Configuration dynamique de Sanoid selon le rôle +configure_sanoid() { + local role="$1" # "active" ou "passive" + + if [[ "$role" == "active" ]]; then + log "info" "Configuration de Sanoid en mode ACTIF (autosnap=yes, autoprune=yes)" + cat > /etc/sanoid/sanoid.conf <<'EOF' +[zpool1] + use_template = production + recursive = yes + +[template_production] + hourly = 24 + daily = 7 + monthly = 3 + yearly = 1 + autosnap = yes + autoprune = yes +EOF - if [[ "$action" == "enable" ]]; then - # Activer Sanoid sur le nœud actif if systemctl is-enabled sanoid.timer &>/dev/null; then if ! systemctl is-active sanoid.timer &>/dev/null; then - log "info" "Activation de Sanoid sur le nœud actif" + log "info" "Demarrage de Sanoid sur le noeud actif" systemctl start sanoid.timer fi else - log "info" "Activation et démarrage de Sanoid sur le nœud actif" + log "info" "Activation et demarrage de Sanoid sur le noeud actif" systemctl enable --now sanoid.timer fi - elif [[ "$action" == "disable" ]]; then - # Désactiver Sanoid sur le nœud passif - if systemctl is-active sanoid.timer &>/dev/null; then - log "info" "Désactivation de Sanoid sur le nœud passif" - systemctl stop sanoid.timer - fi + elif [[ "$role" == "passive" ]]; then + log "info" "Configuration de Sanoid en mode PASSIF (autosnap=no, autoprune=yes)" + cat > /etc/sanoid/sanoid.conf <<'EOF' +[zpool1] + use_template = production + recursive = yes + +[template_production] + hourly = 24 + daily = 7 + monthly = 3 + yearly = 1 + autosnap = no + autoprune = yes +EOF + if systemctl is-enabled sanoid.timer &>/dev/null; then - log "info" "Désactivation permanente de Sanoid sur le nœud passif" - systemctl disable sanoid.timer + if ! systemctl is-active sanoid.timer &>/dev/null; then + log "info" "Demarrage de Sanoid sur le noeud passif" + systemctl start sanoid.timer + fi + else + log "info" "Activation et demarrage de Sanoid sur le noeud passif" + systemctl enable --now sanoid.timer fi fi } @@ -432,13 +461,13 @@ log "info" "Nœud distant configuré: ${REMOTE_NODE_NAME} (${REMOTE_NODE_IP})" # Triple vérification de sécurité if ! verify_lxc_is_active; then log "info" "Le LXC ${CTID} n'est pas actif sur ce nœud. Pas de réplication nécessaire." - # Désactiver Sanoid sur le nœud passif - manage_sanoid "disable" + # Configurer Sanoid en mode passif + configure_sanoid "passive" exit 0 fi -# Le LXC est actif ici : activer Sanoid sur ce nœud -manage_sanoid "enable" +# Le LXC est actif ici : configurer Sanoid en mode actif +configure_sanoid "active" # Vérification de l'existence du pool if ! zpool list "$ZPOOL" &>/dev/null; then