Instantané ZFS vers un fichier de sauvegarde avec rotation

14

J'ai un système FreeNAS local et je souhaite utiliser des instantanés ZFS pour les sauvegardes.
FreeNAS a les tâches de réplication intégrées qui utilisent

zfs send snapshot_name

pour envoyer un instantané à un système distant. Mais cela nécessite un système avec ZFS à l'autre bout.

Je veux envoyer l'instantané vers un fichier et envoyer ce fichier compressé et crypté à la machine distante.

C'est possible avec

zfs send snapshot_name | gzip | openssl enc -aes-256-cbc -a -salt > file.gz.ssl

Chaque jour, je crée un instantané du pool de stockage et conserve chaque instantané pendant 30 jours.
Avec chaque instantané pris, je redirige cet instantané vers un fichier.
- snapshot_file 1 contient tous les fichiers (disons 2 Go)
- snapshot_file 2 n'a que les modifications apportées à snapshot_file 1 (disons 5 Mo)
- snapshot_file 3 contient les modifications apportées à snapshot_file 2; etc.

Le jour 31, snapshot_file 1 est supprimé (car je souhaite uniquement les modifications des 30 derniers jours)

Par conséquent, snapshot_file 2 doit contenir chaque fichier (2 Go de modifications de snapshot_file 1 + 5 Mo)

Mais avec cette approche tous les jours (à partir du 31e jour), un nouveau fichier de 2 Go doit être créé et envoyé à un système distant. C'est trop de frais généraux.

Quelle serait la meilleure approche pour utiliser des instantanés dirigés vers un fichier comme stratégie de sauvegarde avec un historique de X jours?

PS: Je sais qu'il existe de nombreux logiciels de sauvegarde (rdiff-backup par exemple), que je pourrais utiliser. Mais je suis curieux de savoir comment cela pourrait être fait.

Martin Grohmann
la source
Pourquoi ne l'utilisez-vous pas zfs recvà l'autre bout (sur un pool avec zfs set compression=gzip-9par exemple). Le stockage de fichiers d'instantanés me semble très inefficace.
Stéphane Chazelas
1
@StephaneChazelas parce que je n'ai pas de système de fichiers ZFS à l'autre bout. Mon système distant est une boîte gentoo avec ext4 (je sais que je pourrais installer zfsonlinux, mais je préfère pas)
Martin Grohmann

Réponses:

12

Si vous stockez les instantanés dans des fichiers, par opposition à dans le système de fichiers (par exemple avec zfs receive), je crains que ce ne soit pas possible.

ZFS côté réception

Si vous utilisez ZFS du côté de l'envoi et du côté de la réception, vous pouvez éviter d'avoir à transférer l'intégralité de l'instantané et ne transférer que les différences de l'instantané par rapport au précédent:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' | \
  zfs receive

ZFS ne connaît les instantanés et ne stocke les blocs mutuels qu'une seule fois. La compréhension des instantanés par le système de fichiers vous permet de supprimer les anciens sans problème.

Autre système de fichiers côté réception

Dans votre cas, vous stockez les instantanés dans des fichiers individuels et votre système de fichiers ne connaît pas les instantanés. Comme vous l'avez déjà remarqué, cela rompt la rotation. Vous devez soit transmettre des instantanés entiers, ce qui gaspillera de la bande passante et de l'espace de stockage, mais vous permettra de supprimer des instantanés individuels. Ils ne dépendent pas les uns des autres. Vous pouvez faire des instantanés incrémentiels comme ceci:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' \
  > incremental-2014-02-04:05

Pour restaurer un instantané incrémentiel, vous avez également besoin des instantanés précédents. Cela signifie que vous ne pouvez pas supprimer les anciens incrémentaux.

Solutions possibles

Vous pouvez faire des incrémentiels comme indiqué dans mon dernier exemple et faire un nouveau non incrémentiel chaque mois. Les nouveaux incrémentiels dépendent de ce non incrémentiel et vous êtes libre de supprimer les anciens instantanés.

Ou vous pouvez rechercher d'autres solutions de sauvegarde. Il y a rsnapshot , qui utilise rsyncet des liens durs. Il fait un très bon travail à la rotation et est très efficace en bande passante, car il ne nécessite une sauvegarde complète qu'une seule fois.

Ensuite, il y a les bareos . Il fait des incrémentaux, qui sont à bande passante et peu encombrants. Il a une très belle fonctionnalité; il peut calculer une sauvegarde complète à partir d'un ensemble d'incréments. Cela vous permet de supprimer les anciens incrémentaux. Mais c'est un système assez complexe et destiné à des configurations plus importantes.

Cependant, la meilleure solution consiste à utiliser ZFS du côté récepteur. Il sera efficace en bande passante, efficace en stockage et beaucoup plus rapide que les autres solutions. Le seul inconvénient auquel je peux penser est que vous devriez avoir un minimum de 8 Gio de mémoire ECC sur cette boîte (vous pourriez bien utiliser 4 Gio si vous n'exécutez aucun service et ne l'utilisez que pour zfs receive).

Marco
la source
oui ça je sais. Mais que se passe-t-il si je supprime (parce que je veux seulement avoir un historique de 30 jours) l'ensemble de données de fichier @ 2014-02-04? Ensuite, je n'ai que les modifications apportées après le 4 février, mais pas tous les fichiers.
Martin Grohmann
2
@MartinGrohmann Je vois ce que tu veux dire maintenant. Eh bien, c'est la beauté de ZFS, vous pouvez supprimer les anciens instantanés sur ZFS sans problème. Sur les autres systèmes de fichiers, vous devez conserver les anciens. Peut-être que vous êtes mieux avec quelque chose comme ça rsnapshot. Ou vous pouvez démarrer un nouveau non incrémentiel après un mois, puis supprimer les incrémentiels précédents.
Marco
Merci de votre aide; Je viens de découvrir la duplicité C'est probablement la voie à suivre avec la capacité de chiffrement.
Martin Grohmann
2
@MartinGrohmann Duplicity est un bon programme, mais il souffre du même problème . Si vous ne faites que des incréments, votre espace ne cesse de croître. Vous ne pouvez pas récupérer de l'espace sans gaspiller la bande passante et faire une nouvelle sauvegarde complète. Soit ZFS des deux côtés ou jetez un œil aux bareos , il peut calculer une nouvelle sauvegarde complète à partir de données incrémentielles. Cela vous permet de supprimer les anciens incrémentaux sans tout re-transférer.
Marco
Si la bande passante de votre source est le problème, une solution potentielle (que j'implémente pour mon NAS ZFS domestique maintenant) consiste à toujours envoyer uniquement des incréments à votre stockage distant, mais une fois par mois, lancez un VPS FreeBSD gratuit à distance (par exemple, sur océan numérique) qui peut ensuite ouvrir le dernier instantané complet, zfs recv le certain # d'incrémentaux en elle, puis stocker le résultat comme un nouvel instantané. Le VPS doit seulement être assez long pour créer la nouvelle sauvegarde de base. L'océan numérique dispose d'une API permettant de créer / détruire facilement leurs VPS. Et votre système local n'a qu'à envoyer des sauvegardes incrémentielles.
stuckj