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:
parent
9279932f8b
commit
464540696b
2 changed files with 71 additions and 24 deletions
24
README.md
24
README.md
|
|
@ -112,7 +112,21 @@ Sanoid crée des snapshots selon un calendrier défini :
|
||||||
- **Mensuel** : 3 snapshots (rétention de 3 mois)
|
- **Mensuel** : 3 snapshots (rétention de 3 mois)
|
||||||
- **Annuel** : 1 snapshot (rétention de 1 an)
|
- **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
|
### 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
|
- **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
|
- **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
|
- **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
|
- **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
|
- **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
|
- **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
|
├── 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.service # Définition du service systemd
|
||||||
└── zfs-nfs-replica.timer # Configuration du timer 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)
|
- Cluster Proxmox VE (testé sur 8.x)
|
||||||
- Pools ZFS nommés `zpool1` sur les nœuds de production
|
- 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
|
- Sanoid/Syncoid installés depuis le dépôt officiel Sanoid
|
||||||
- Paire de clés SSH dédiée pour la réplication
|
- Paire de clés SSH dédiée pour la réplication
|
||||||
- Conteneur LXC avec rootfs sur LINSTOR/DRBD
|
- Conteneur LXC avec rootfs sur LINSTOR/DRBD
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,13 @@
|
||||||
# - Gère l'activation/désactivation de Sanoid selon le nœud actif
|
# - Gère l'activation/désactivation de Sanoid selon le nœud actif
|
||||||
#
|
#
|
||||||
# Auteur : BENE Maël
|
# Auteur : BENE Maël
|
||||||
# Version : 1.6.0
|
# Version : 1.7.0
|
||||||
#
|
#
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
SCRIPT_VERSION="1.6.0"
|
SCRIPT_VERSION="1.7.0"
|
||||||
REPO_URL="https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha"
|
REPO_URL="https://forgejo.tellserv.fr/Tellsanguis/zfs-sync-nfs-ha"
|
||||||
SCRIPT_URL="${REPO_URL}/raw/branch/main/zfs-nfs-replica.sh"
|
SCRIPT_URL="${REPO_URL}/raw/branch/main/zfs-nfs-replica.sh"
|
||||||
SCRIPT_PATH="${BASH_SOURCE[0]}"
|
SCRIPT_PATH="${BASH_SOURCE[0]}"
|
||||||
|
|
@ -176,30 +176,59 @@ verify_lxc_is_active() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Gestion de Sanoid selon le nœud actif
|
# Configuration dynamique de Sanoid selon le rôle
|
||||||
manage_sanoid() {
|
configure_sanoid() {
|
||||||
local action="$1" # "enable" ou "disable"
|
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-enabled sanoid.timer &>/dev/null; then
|
||||||
if ! systemctl is-active 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
|
systemctl start sanoid.timer
|
||||||
fi
|
fi
|
||||||
else
|
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
|
systemctl enable --now sanoid.timer
|
||||||
fi
|
fi
|
||||||
elif [[ "$action" == "disable" ]]; then
|
elif [[ "$role" == "passive" ]]; then
|
||||||
# Désactiver Sanoid sur le nœud passif
|
log "info" "Configuration de Sanoid en mode PASSIF (autosnap=no, autoprune=yes)"
|
||||||
if systemctl is-active sanoid.timer &>/dev/null; then
|
cat > /etc/sanoid/sanoid.conf <<'EOF'
|
||||||
log "info" "Désactivation de Sanoid sur le nœud passif"
|
[zpool1]
|
||||||
systemctl stop sanoid.timer
|
use_template = production
|
||||||
fi
|
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
|
if systemctl is-enabled sanoid.timer &>/dev/null; then
|
||||||
log "info" "Désactivation permanente de Sanoid sur le nœud passif"
|
if ! systemctl is-active sanoid.timer &>/dev/null; then
|
||||||
systemctl disable sanoid.timer
|
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
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
@ -432,13 +461,13 @@ log "info" "Nœud distant configuré: ${REMOTE_NODE_NAME} (${REMOTE_NODE_IP})"
|
||||||
# Triple vérification de sécurité
|
# Triple vérification de sécurité
|
||||||
if ! verify_lxc_is_active; then
|
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."
|
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
|
# Configurer Sanoid en mode passif
|
||||||
manage_sanoid "disable"
|
configure_sanoid "passive"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Le LXC est actif ici : activer Sanoid sur ce nœud
|
# Le LXC est actif ici : configurer Sanoid en mode actif
|
||||||
manage_sanoid "enable"
|
configure_sanoid "active"
|
||||||
|
|
||||||
# Vérification de l'existence du pool
|
# Vérification de l'existence du pool
|
||||||
if ! zpool list "$ZPOOL" &>/dev/null; then
|
if ! zpool list "$ZPOOL" &>/dev/null; then
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue