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
This commit is contained in:
Tellsanguis 2025-11-16 11:01:07 +01:00
parent 9279932f8b
commit 464540696b
2 changed files with 71 additions and 24 deletions

View file

@ -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

View file

@ -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