Quelle est une stratégie de sauvegarde hors site efficace pour un pool en miroir ZFS?

9

J'utilise un pool ZFS composé de deux disques en miroir. Pour lancer les sauvegardes hors site, j'ai acheté deux disques supplémentaires.

Mon plan initial était de créer la sauvegarde hors site en attachant un troisième disque au miroir, en attendant que ZFS se resilver, puis détacher le lecteur et le transporter hors site. Cela fonctionne assez bien, mais j'ai été surpris qu'il semble effectuer un resilver complet chaque fois qu'un disque est connecté (j'avais lu, et peut-être mal compris, que chaque pièce jointe entraînerait une resilver incrémentielle ou delta). Cela entraîne des sauvegardes prenant plus de temps que ce qui est acceptable.

Mes exigences sont d'avoir une copie hors site de mon zpool et de tous ses instantanés que je peux faire pivoter quotidiennement. Cela signifie que la réargenture doit prendre au plus 24 heures - actuellement, elle est proche de cela, mais nos plans de croissance de notre piscine le pousseront au-delà de cette période.

Comment puis-je conserver des sauvegardes hors site qui ne nécessitent pas une opération de réargenture complète? Dois-je utiliser un système de fichiers différent sur mes lecteurs de sauvegarde (par exemple, exporter une image plutôt que de les faire faire partie du pool ZFS)? Dois-je avoir les sauvegardes dans un pool séparé et lui envoyer de nouveaux instantanés lors de leur création?

STW
la source
Ma stratégie actuelle est la méthode du pool multiple, avec l'envoi et la réception de zfs pour garder les instantanés synchronisés. J'adorerais entendre si vous avez trouvé un argument contre cela ou une meilleure option.
so12311

Réponses:

3

Après beaucoup de bricolage et d'expérimentation, j'ai trouvé une solution, mais avec un compromis assez important.

Tout d'abord, les options que j'ai dû exclure:

  • Avoir un deuxième serveur ZFS hors site avec un pool en miroir n'était pas une option en raison du coût. Si cela avait été une option, cela aurait été de loin la meilleure approche, en utilisant l'envoi / la réception ZFS pour envoyer des instantanés au pool distant.

  • Avoir un deuxième pool de miroirs ZFS sur site, dont je pourrais retirer les disques à ramener à la maison. C'est plus faisable que la première option, mais j'aurais besoin du deuxième pool pour avoir toujours deux disques sur place (ou pour utiliser deux copies de données sur un seul disque sur place). Actuellement, j'ai quatre disques et plus d'espace pour un cinquième sur le serveur. Ce serait une approche équitable mais pas toujours idéale.

  • Utilisation de l'attachement et du détachement de ZFS pour faire pivoter le disque de sauvegarde dans et hors du pool en miroir. Cela fonctionne bien, mais doit effectuer un resilver complet chaque fois que le disque est ajouté. Cela prend un temps inacceptable et je ne pouvais donc pas m'y fier.

Ma solution est similaire à l'utilisation attachet detach, cependant, elle utilise onlineet offline. Cela présente l'avantage d'effectuer une réargenture delta par rapport à une réargenture complète, mais l'inconvénient que le pool signale toujours un DEGRADEDétat (le pool a toujours deux disques; les disques rotatifs hors site sont marqués offlinelorsqu'ils sont dans le stockage distant et le resilver, puis sont mis en ligne lorsqu'ils sont sur place).

Donc, un bref récapitulatif et un aperçu de ma configuration:

J'ai un serveur ZFS et quatre disques identiques. ZFS est configuré pour utiliser un pool en miroir. Deux des quatre disques sont des membres permanents de ce pool. Les deux autres disques tournent; l'un est toujours dans le stockage hors site, l'autre fait partie du pool pour agir comme une sauvegarde prête à l'emploi.

Quand vient le temps de faire pivoter les sauvegardes:

  • J'attends la fin d'un zfs scrubpour m'assurer raisonnablement que le disque de sauvegarde est exempt d'erreurs

  • Je zfs offlinele disque qui sera pris à distance. Après sa mise hors ligne, je l'ai fait hdparm -Y /dev/idtourner. Après une minute, j'enlève partiellement le traîneau à disques (juste assez pour assurer sa perte de puissance), puis je lui donne une autre minute avant de tirer complètement le lecteur pour garantir qu'il a cessé de tourner. Le disque est placé dans un sac statique, puis dans un étui de protection et hors site.

  • J'apporte l'autre disque hors site. Il s'installe dans le plateau de hotswap et tourne. J'utilise zfs onlinepour restaurer le disque dans le pool et lancer une réargenture partielle pour le rendre simultané.

Ce système garantit qu'à tout moment j'ai deux ONLINEdisques miroirs et un OFFLINEdisque distant (qui a été nettoyé). Le quatrième disque est en cours de réargenture ou en ligne, ce qui présente l'avantage qu'en cas de défaillance d'un lecteur en cours d'exécution, il est probable que le pool sera toujours cohérent de deux disques en ligne.

Cela a bien fonctionné au cours des deux dernières semaines, mais je considère toujours que c'est une approche hackish. Je ferai un suivi si je rencontre des problèmes majeurs.


Mise à jour: Après avoir exécuté cela pendant quelques mois, j'ai constaté que dans mon utilisation réelle, la réargenture prend le même temps pour détacher / attacher et hors ligne / en ligne. Lors de mes tests, je ne pense pas que j'exécutais un nettoyage - mon intuition est que si un lecteur est hors ligne pour un nettoyage, il nécessite un resilver complet.

STW
la source
Cela ne fonctionnera-t-il certainement pas avec seulement trois appareils au lieu de quatre? Le manuel Oracle Solaris ZFS Administration Guide indique qu'un pool de miroirs est défectueux "Si tous les composants d'un miroir sont supprimés" [c'est moi qui souligne], ce qui semble impliquer qu'un quatrième lecteur n'est pas strictement nécessaire.
Kenny Evitt
1
Par trois périphériques, voulez-vous dire deux disques qui sont toujours dans le pool et un qui est parfois hors site, ou un disque qui est toujours dans le pool et deux qui tournent hors site? Avec la deuxième option, je m'attendrais à une perte de données si le pool rencontre des données incorrectes alors qu'il n'y a qu'un seul disque entièrement en ligne (lorsque le 2ème disque est en rotation ou n'est pas encore entièrement réargenté). Mon deux cents est de toujours m'assurer que votre pool en miroir dispose de deux disques en ligne à temps plein.
STW
Je voulais dire la deuxième option que vous mentionnez. Avec cette option, quelle est la probabilité de mauvaises données alors qu'un seul disque est en ligne? La réargenture partielle / incrémentielle devrait être relativement rapide, non? Et même s'il y avait de mauvaises données, ne devriez-vous pas pouvoir récupérer à partir du deuxième disque? Ou récupérer du troisième disque, le pire des cas? [Évidemment, il existe des scénarios où la récupération n'est pas possible; mais c'est vrai même avec quatre disques; ou n'importe quel nombre en fait.]
Kenny Evitt
Je m'en tiendrai à toujours avoir deux disques en miroir en ligne, avec un troisième et un quatrième utilisés pour faire pivoter les sauvegardes. Chaque fois que vous n'avez qu'un seul disque en ligne dans un miroir est un moment où vous êtes vulnérable - et même avec mon approche, il y a le risque que le disque de sauvegarde hors site puisse développer des problèmes d'intégrité et ne pas être récupérable à 100% (idéalement, il y aurait être deux disques en miroir hors site à tout moment, afin que l'intégrité des deux puisse être comparée).
STW du
Pour résumer, ZFS consiste à éviter une seule copie de données (ou au moins à avoir la parité, permettant la reconstruction de mauvaises données). Lorsque vous ne disposez que d'un disque en ligne ou d'une copie des données de sauvegarde, vous risquez de perdre des données.
STW
2

Pourquoi pas zfs envoyer vos instantanés à une machine ZFS distante? J'utilise un simple script bash pour cela:

#!/usr/local/bin/bash
# ZFS Snapshot BASH script by Shawn Westerhoff
# Updated 1/14/2014

### DATE VARIABLES
# D = Today's date
# D1 = Yesterday's date
# D# = Today less # days date
Y=$(date -v-1d '+%m-%d-%Y')
D=$(date +%m-%d-%Y)
D1=$(date -v-1d '+%m-%d-%Y')
D10=$(date -v-10d '+%m-%d-%Y')
D20=$(date -v-20d '+%m-%d-%Y')

# Step 1: Make the snapshots

for i in $( zfs list -H -o name ); do
    if [ $i == tier1 ]
    then echo "$i found, skipping"
    else
    zfs snapshot $i@$D
    fi
done

# Step 2: Send the snapshots to backup ZFS sever

    for i in $( zfs list -H -o name ); do
        zfs send -i $i@$D1 $i@$D | ssh -c arcfour root@10.10.10.10 zfs recv $i
    done

# Step 3: Destroy snapshots that are 20 days old

for i in $( zfs list -H -o name ); do
        if [ $i == tier1 ]
        then echo "$i found, skipping"
        else
        zfs destroy $i@$D20
        fi
done
Shawn Westerhoff
la source
0

J'ai créé un outil appelé snapdump qui vous permet de créer des sauvegardes incrémentielles de vos jeux de données zfs vers un système de fichiers étranger (non zfs). Snapdump prend également en charge la restauration d'une chaîne d'instantanés incrémentielle avec une seule commande.

Omry Yadan
la source