5 votes

Conseils pour la sauvegarde de ZFS avec un autre serveur

J'ai actuellement deux serveurs qui ont exactement le même matériel, les mêmes disques, etc.

Un serveur (server1) sera le serveur "principal". Il s'agit essentiellement d'un serveur avec raidz2 qui comporte des partages SMB auxquels les utilisateurs se connectent.

L'autre serveur (serveur 2) est configuré de la même manière que le serveur 1 (raidz2), mais il doit uniquement servir à sauvegarder le serveur 1. Il s'agit d'une sauvegarde hors site au cas où nous perdrions le serveur 1 à la suite d'une panne de disque, d'un incendie, d'un dégât des eaux, etc.

J'essaie de trouver la meilleure façon d'effectuer les sauvegardes sur le serveur 2.

Au début, je pensais à quelque chose comme rsync. C'est trivial à mettre en place dans un cron, et je peux le faire fonctionner une fois par semaine.

Alternativement, je pensais à quelque chose avec zfs send/recv. Si j'ai bien compris, ZFS peut faire des "instantanés", alors je me suis dit que ce serait génial si je pouvais créer des instantanés/sauvegardes incrémentielles sans perdre beaucoup d'espace. J'ai l'impression que cela pourrait être plus difficile à mettre en œuvre/pris au piège des erreurs.

Comme je l'ai déjà dit, les deux serveurs sont configurés de la même manière en termes de matériel et de configuration raidz2. Qu'est-ce que vous recommandez pour ma situation actuelle ?

5voto

fukawi2 Points 5257

ZFS est très résistant. L'exemple le plus élémentaire d'expédition d'un système de fichiers est le suivant :

# zfs snapshot tank/test@tuesday
# zfs send tank/test@tuesday | ssh user@server.example.com "zfs receive pool/test"

Notez l'instantané avant l'envoi (et l'envoi de l'instantané).

Vous pourriez intégrer cela dans un script pour supprimer l'instantané local après l'avoir envoyé au distant -- ou le conserver si vous disposez de l'espace disque nécessaire. Conservez les instantanés précédents sur le serveur de sauvegarde.

Source et lecture hautement recommandées : https://pthree.org/2012/12/20/zfs-administration-part-xiii-sending-and-receiving-filesystems/

4voto

jlliagre Points 8651

J'utiliserais l'envoi/réception incrémentiel de ZFS. Cela devrait être plus efficace que rsync car ZFS sait ce qui a été modifié depuis l'instantané précédent sans avoir à explorer l'ensemble du système de fichiers.

Supposons que vous souhaitiez effectuer une sauvegarde complète d'un système de fichiers nommé datapool/fs .

Vous créez d'abord un pool pour stocker votre sauvegarde sur le serveur de destination et un instantané récursif sur le pool source :

dest # zpool create datapool ...
source # zfs snapshot -r datapool/fs@snap1

vous envoyez alors l'ensemble des données en tant que sauvegarde initiale :

source # zfs send -R datapool/fs@snap1 | ssh dest zfs receive datapool/fs

La semaine suivante (ou la période de votre choix), vous créez un deuxième instantané sur le pool source et l'envoyez de manière incrémentielle sur le pool de destination. Cette fois, ZFS est suffisamment intelligent pour n'envoyer que ce qui a été modifié au cours de la semaine (fichiers supprimés, créés et modifiés). Lorsqu'un fichier est modifié, il n'est pas envoyé dans son intégralité, mais seuls les blocs modifiés sont transmis et mis à jour.

source # zfs snapshot -r datapool/fs@snap2
source # zfs send -ri snap1 datapool/fs@snap2 | 
            ssh dest zfs receive -F datapool/fs

Répétez l'opération en incrémentant les numéros d'instantanés à chaque sauvegarde.

Supprimez les anciens clichés inutilisés sur l'un ou l'autre des serveurs lorsque vous n'en avez plus besoin.

Si vous avez des contraintes de bande passante, vous pouvez compresser/décompresser les données à la volée, par exemple en insérant des fichiers gzip / zip dans le pipeline ou en activant la compression ssh.

source # zfs send -ri snap1 datapool/fs@snap2 | gzip | 
            ssh dest "gunzip | zfs receive -F datapool/fs"

Vous pouvez également tirer parti de mbuffer obtenir une utilisation plus régulière de la bande passante, comme décrit dans le présent document. page :

dest # mbuffer -s 128k -m 1G -I 9090 | zfs receive datapool/fs

source # zfs send -i snap2 datapool/fs@snap3 | 
            mbuffer -s 128k -m 1G -O w.x.y.z:9090

Note : Le zfs -r n'est pas disponible avec les implémentations ZFS non Solaris, voir http://lists.freebsd.org/pipermail/freebsd-fs/2012-September/015074.html . Dans ce cas, n'utilisez pas l'option -F sur la cible, mais au lieu de cela, il faut annuler explicitement les ensembles de données. Si de nouveaux jeux de données ont été créés sur la source, envoyez-les d'abord indépendamment avant d'effectuer l'envoi/la réception de l'instantané et de l'incrémental.

Bien entendu, si vous n'avez qu'un seul système de fichiers à sauvegarder sans hiérarchie de données sous-jacente, ou si vous souhaitez effectuer des sauvegardes indépendantes, la sauvegarde incrémentielle est plus simple à mettre en œuvre et devrait fonctionner de manière identique quelle que soit l'implémentation de ZFS :

T0 :

zfs snapshot datapool/fs@snap1
zfs send datapool/fs@snap1 | ssh dest zfs receive datapool/fs

T1 :

zfs snapshot datapool/fs@snap2
zfs send -i snap1 datapool/fs@snap2 | 
            ssh dest zfs receive -F datapool/fs

1voto

Zaenille Points 151

J'ai eu des problèmes en utilisant zfs send/receive pour envoyer 1 TB à un distant. J'ai décidé de diviser le système de fichiers unique de 1 To pour qu'il contienne plusieurs enfants. Maintenant, après une panne de réseau, au pire, seul un enfant doit être renvoyé. J'utilise mon script pour prendre soin des envois récursifs et pour garder le distant synchronisé : https://github.com/dareni/shellscripts/blob/master/zfsDup.sh

J'espère que ce script pourra être utile à quelqu'un d'autre.

Exemple de sortie :

# zfsDup.sh shelltests
Test: array_add()
Test: array_clear()
Test: array_iterator()
Test: nameValidation()
Test: isValidSnapshot()
Test: getSnapshotFilesystems()
Test: getSnapshotData()
Test: getRemoteDestination()
Test: printElapsed()
Test: convertToBytes()
Shell tests completed, check the output for errors.

# zfsDup.sh zfstests
Start zfs tests.
Test: new parent file system.
Test: new child file system.
Test: simulate a failed send of the child filesystem.
Test: duplicate and check the child@2 snapshot is resent.
Test: snapshot existing files with updated child data.
Test: simulate a fail send os child@3
Test: snapshot test1.
Test: snapshot test2.
Test: snapshot test3.
Snapshot tests completed ok.
Test: remote host free space.
Test: new remote FS with no quota.
Test: incremental remote FS update with no quota.
Cleaning up zroot/tmp/zfsDupTest/dest zroot/tmp/zfsDupTest/source
Test execution time: 89secs
ZFS tests completed, check the output for errors.

# zfs list -t all -r ztest
NAME  USED  AVAIL  REFER  MOUNTPOINT
ztest  344K  448M  19K  /ztest
ztest@1  9K  -  19K  -
ztest@6  9K  -  19K  -
ztest/backup  112K  448M  19K  /ztest/backup
ztest/backup@1  9K  -  19K  -
ztest/backup@2  0  -  19K  -
ztest/backup@3  0  -  19K  -
ztest/backup@4  9K  -  19K  -
ztest/backup@5  0  -  19K  -
ztest/backup@6  0  -  19K  -
ztest/backup/data  57.5K  448M  20.5K  /ztest/backup/data
ztest/backup/data@1  0  -  19.5K  -
ztest/backup/data@2  0  -  19.5K  -
ztest/backup/data@3  9K  -  19.5K  -
ztest/backup/data@4  9K  -  19.5K  -
ztest/backup/data@5  0  -  20.5K  -
ztest/backup/data@6  0  -  20.5K  -

# zfs list -t all -r zroot/tmp
NAME  USED  AVAIL  REFER  MOUNTPOINT
zroot/tmp  38K  443M  19K  /tmp
zroot/tmp/zfsDupTest  19K  443M  19K  /tmp/zfsDupTest

# zfsDup.sh ztest zroot/tmp root@localhost
================================================================================
Starting duplication 20151001 16:10:56 ...
ztest@6...new...19K...0hr.0min.1sec
ztest/backup@6...new...19K...0hr.0min.1sec
ztest/backup/data@6...new...20.5K...0hr.0min.0sec
Duplication complete 20151001 16:11:04.
================================================================================

# zfsDup.sh ztest zroot/tmp root@localhost
================================================================================
Starting duplication 20151001 16:11:25 ...
ztest@6...up to date
ztest/backup@6...up to date
ztest/backup/data@6...up to date
Duplication complete 20151001 16:11:29.
================================================================================

# zfs snapshot -r ztest@7
# zfsDup.sh ztest zroot/tmp root@localhost
================================================================================
Starting duplication 20151001 16:12:25 ...
ztest@7...incremental...9K...0hr.0min.1sec
ztest/backup@7...incremental...9K...0hr.0min.1sec
ztest/backup/data@7...incremental...10K...0hr.0min.0sec
Duplication complete 20151001 16:12:33.
================================================================================

# zfs list -t all -r zroot/tmp
NAME  USED  AVAIL  REFER  MOUNTPOINT
zroot/tmp  124K  442M  19K  /tmp
zroot/tmp/zfsDupTest  19K  442M  19K  /tmp/zfsDupTest
zroot/tmp/ztest  86K  442M  19K  /tmp/ztest
zroot/tmp/ztest@6  9K  -  19K  -
zroot/tmp/ztest@7  0  -  19K  -
zroot/tmp/ztest/backup  58K  442M  19K  /tmp/ztest/backup
zroot/tmp/ztest/backup@6  9K  -  19K  -
zroot/tmp/ztest/backup@7  0  -  19K  -
zroot/tmp/ztest/backup/data  30K  442M  20K  /tmp/ztest/backup/data
zroot/tmp/ztest/backup/data@6  10K  -  20K  -
zroot/tmp/ztest/backup/data@7  0  -  20K  -

0voto

Andrew Points 7614

Vous pouvez également pipe l'envoi/la réception dans par exemple bzip2 et le rsync . En cet article de blog l'esclave doit avoir la mention "readonly" (lecture seule).

0voto

tsbertalan Points 467

Il existe un outil intéressant pour gérer les envois/réceptions et intégrer une barre de progression.

il se trouve dans le catalogue des logiciels portés de freebsd sous sysutils/zxfer ou sur github

Vous pouvez également utiliser un outil comme sysutils/zfstools ou sysutils/zfsnap pour automatiser la création des instantanés, qui seront synchronisés avec la machine distante via zxfer.

Il existe une documentation plus complète sur le processus d'envoi/récupération de zfs dans le document officiel Manuel FreeBSD

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X