Avertissement: Comme je n'ai jamais utilisé de zvols, je ne peux pas dire s'ils sont différents dans la réplication des systèmes de fichiers ou des instantanés normaux. Je suppose que oui, mais ne me croyez pas sur parole.
Votre question est en fait plusieurs questions, j'essaie d'y répondre séparément:
Comment répliquer / mettre en miroir le pool complet vers un emplacement distant
Vous devez diviser la tâche en deux parties: tout d'abord, la réplication initiale doit être terminée, ensuite la réplication incrémentielle est possible, tant que vous ne dérangez pas avec vos instantanés de réplication . Pour activer la réplication incrémentielle, vous devez conserver les derniers instantanés de réplication, tout ce qui précède peut être supprimé. Si vous supprimez l'instantané précédent, vous vous zfs recv
plaindrez et abandonnerez la réplication. Dans ce cas, vous devez tout recommencer, alors essayez de ne pas le faire.
Si vous avez juste besoin des bonnes options, ce sont:
zfs send
:
-R
: envoie tout sous le pool ou le jeu de données donné (réplication récursive, nécessaire tout le temps, inclut -p
). De plus, lors de la réception, tous les instantanés source supprimés sont supprimés sur la destination.
-I
: inclure tous les instantanés intermédiaires entre le dernier instantané de réplication et l'instantané de réplication actuel (nécessaire uniquement avec les envois incrémentiels)
zfs recv
:
-F
: étendre le pool cible, y compris la suppression des ensembles de données existants qui sont supprimés sur la source
-d
: ignorer le nom du pool source et le remplacer par le nom du pool de destination (le reste des chemins du système de fichiers sera conservé et, si nécessaire, également créé)
-u
: ne pas monter le système de fichiers sur la destination
Si vous préférez un exemple complet, voici un petit script:
#!/bin/sh
# Setup/variables:
# Each snapshot name must be unique, timestamp is a good choice.
# You can also use Solaris date, but I don't know the correct syntax.
snapshot_string=DO_NOT_DELETE_remote_replication_
timestamp=$(/usr/gnu/bin/date '+%Y%m%d%H%M%S')
source_pool=tank
destination_pool=tank
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=remotehostname
# Initial send:
# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Initial replication via SSH.
zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Incremental sends:
# Get old snapshot name.
old_snap=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$source_pool"@"$snapshot_string" | tail --lines=1)
# Create new recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Delete older snaps on the local source (grep -v inverts the selection)
delete_from=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$snapshot_string" | grep -v "$timestamp")
for snap in $delete_from; do
zfs destroy "$snap"
done
Utilisez quelque chose de plus rapide que SSH
Si vous disposez d'une connexion suffisamment sécurisée, par exemple un tunnel IPSec ou OpenVPN et un VLAN distinct qui n'existe qu'entre l'expéditeur et le récepteur, vous pouvez passer de SSH à des alternatives non chiffrées comme mbuffer comme décrit ici , ou vous pouvez utiliser SSH avec un chiffrement faible / nul et la compression désactivée, qui est détaillée ici . Il y avait aussi un site Web sur la recompilation de SSH pour être beaucoup plus rapide, mais malheureusement je ne me souviens pas de l'URL - je le modifierai plus tard si je le trouve.
Pour les jeux de données très volumineux et les connexions lentes, il peut également être utile de procéder à la première transmission via le disque dur (utilisez un disque crypté pour stocker zpool et transmettez-le dans un emballage scellé via courrier, courrier ou en personne). Comme la méthode de transmission n'a pas d'importance pour l'envoi / recv, vous pouvez tout diriger vers le disque, exporter le pool, envoyer le disque vers sa destination, importer le pool, puis transmettre tous les envois incrémentiels via SSH.
Le problème avec les instantanés foirés
Comme indiqué précédemment, si vous supprimez / modifiez vos instantanés de réplication, vous recevrez le message d'erreur
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
ce qui signifie que votre commande était incorrecte ou que vous êtes dans un état incohérent où vous devez supprimer les instantanés et recommencer à zéro.
Cela a plusieurs implications négatives:
- Vous ne pouvez pas supprimer un instantané de réplication tant que le nouvel instantané de réplication n'a pas été transféré avec succès. Comme ces instantanés de réplication incluent l'état de tous les autres instantanés (plus anciens), l'espace vide des fichiers supprimés et des instantanés ne sera récupéré que si la réplication se termine. Cela peut entraîner des problèmes d'espace temporaires ou permanents sur votre pool que vous ne pouvez résoudre qu'en redémarrant ou en terminant la procédure de réplication complète.
- Vous aurez de nombreux instantanés supplémentaires, ce qui ralentit la commande list (sauf sur Oracle Solaris 11, où cela a été corrigé).
- Vous devrez peut-être protéger les instantanés contre la suppression (accidentelle), sauf par le script lui-même.
Il existe une solution possible à ces problèmes, mais je ne l'ai pas essayée moi-même. Vous pouvez utiliser zfs bookmark
une nouvelle fonctionnalité d'OpenSolaris / illumos créée spécifiquement pour cette tâche. Cela vous libérerait de la gestion des instantanés. Le seul inconvénient est qu'à l'heure actuelle, cela ne fonctionne que pour des ensembles de données uniques, pas récursivement. Vous devez enregistrer une liste de tous vos anciens et nouveaux jeux de données, puis les parcourir, les mettre en signet, les envoyer et les recevoir, puis mettre à jour la liste (ou une petite base de données, si vous préférez).
Si vous essayez la route des signets, je serais intéressé de savoir comment cela a fonctionné pour vous!
zfs send -R ...
? Si vous avez canalisé la sortie viassh
, avez-vous désactivé les caractères d'échappement aveczfs send -R ... | ssh -e none ...
?