web-dev-qa-db-fra.com

Comment effectuer des sauvegardes incrémentielles / continues du pool zfs?

Comment les pools zfs peuvent-ils être sauvegardés de façon continue/incrémentielle hors site?

Je reconnais le send/receive over ssh est cependant une méthode qui implique de devoir gérer les instantanés manuellement.

Il y a certains outils que j'ai trouvés, mais la plupart ne sont plus pris en charge.

Le seul outil qui semble prometteur est https://github.com/jimsalterjrs/sanoid mais je crains qu'un outil peu connu puisse faire plus de mal que de bien dans la mesure où il peut corrompre/supprimer des données.

Comment les sauvegardes zfs continues/incrémentielles sont-elles effectuées?

26
Greg

ZFS est un système de fichiers incroyable et résout bon nombre de mes besoins de stockage de données locaux et partagés.

Bien que j'aime l'idée de clustered ZFS dans la mesure du possible, parfois ce n'est pas pratique, ou j'ai besoin d'une certaine séparation géographique de nœuds de stockage.

L'un de mes cas d'utilisation concerne le stockage répliqué hautes performances sur des serveurs d'applications Linux. Par exemple, je prends en charge un produit logiciel hérité qui bénéficie de disques SSD NVMe à faible latence pour ses données. L'application a une option de mise en miroir au niveau de l'application qui peut être répliquée sur un serveur secondaire, mais elle est souvent inexacte et dure 10 minutes RPO .

J'ai résolu ce problème en ayant un serveur secondaire (exécutant également ZFS sur un matériel similaire ou différent) qui peut être local, distant ou les deux. En combinant les trois utilitaires détaillés ci-dessous, j'ai conçu une solution de réplication qui me donne une réplication continue, une rétention instantanée des instantanés et des options de basculement flexibles.

zfs-auto-snapshot - https://github.com/zfsonlinux/zfs-auto-snapshot

Juste un outil pratique pour activer des instantanés périodiques au niveau du système de fichiers ZFS. Je cours généralement avec le calendrier suivant sur les volumes de production:

# /etc/cron.d/zfs-auto-snapshot

PATH="/usr/bin:/bin:/usr/sbin:/sbin"

*/5 * * * * root /sbin/zfs-auto-snapshot -q -g --label=frequent --keep=24 //
00 * * * * root /sbin/zfs-auto-snapshot -q -g --label=hourly --keep=24 //
59 23 * * * root /sbin/zfs-auto-snapshot -q -g --label=daily --keep=14 //
59 23 * * 0 root /sbin/zfs-auto-snapshot -q -g --label=weekly --keep=4 //
00 00 1 * * root /sbin/zfs-auto-snapshot -q -g --label=monthly --keep=4 //

Syncoid (Sanoid) - https://github.com/jimsalterjrs/sanoid

Ce programme peut exécuter un snap/réplication ad hoc d'un système de fichiers ZFS sur une cible secondaire. J'utilise uniquement la partie syncoid du produit.

En supposant server1 et server2 , commande simple exécutée à partir de server2 to pull data from server1 :

#!/bin/bash

/usr/local/bin/syncoid [email protected]:vol1/data vol2/data

exit $?

Monit - https://mmonit.com/monit/

Monit est un planificateur de tâches et un gestionnaire d'exécution extrêmement flexibles. Par défaut, cela fonctionne sur un intervalle de 30 secondes, mais je modifie la configuration pour utiliser un cycle de base de 15 secondes.

Un exemple de configuration qui exécute le script de réplication ci-dessus toutes les 15 secondes (1 cycle)

check program storagesync with path /usr/local/bin/run_storagesync.sh
        every 1 cycles
        if status != 0 then alert

C'est simple à automatiser et à ajouter via la gestion de la configuration. En encapsulant l'exécution de l'instantané/réplication dans Monit, vous obtenez un état centralisé, un contrôle des tâches et des alertes (e-mail, SNMP, script personnalisé).


Le résultat est que j'ai des serveurs qui ont plusieurs mois d'instantanés mensuels et de nombreux points de restauration et de rétention dans: https://Pastebin.com/zuNzgi0G - Plus, un réplique atomique de 15 secondes à roulement continu:

# monit status

Program 'storagesync'
  status                            Status ok
  monitoring status                 Monitored
  last started                      Wed, 05 Apr 2017 05:37:59
  last exit value                   0
  data collected                    Wed, 05 Apr 2017 05:37:59
.
.
.
Program 'storagesync'
  status                            Status ok
  monitoring status                 Monitored
  last started                      Wed, 05 Apr 2017 05:38:59
  last exit value                   0
  data collected                    Wed, 05 Apr 2017 05:38:59
36
ewwhite

Vous pouvez procéder de deux manières différentes:

  1. La manière traditionnelle, indépendante du système de fichiers, qui est/a été utilisée au cours des dernières décennies, avec des outils comme rsync ou Bacula. Là, vous avez testé et (espérons-le) un gros logiciel stable qui peut être personnalisé pour des déploiements massifs et peut être utilisé même si vous quittez ZFS
  2. L'un des outils qui tirent parti de ZFS send/recv. Cela peut être soit votre propre solution, un script ou un script étendu à partir des différents sur Github et al., Ou des outils plus riches en fonctionnalités comme Sanoid ou ZnapZend (send/recv avec prise en charge de mbuffer et plans de rétention ). Dans ce cas, vous ne trouverez probablement pas de grandes solutions "d'entreprise" (au sens négatif), mais des outils qui ne font que la tâche unique et peuvent être combinés avec d'autres outils pour répondre à votre configuration spécifique.

En général, je ne ferais confiance qu'à un outil dont le code source est disponible, et je le garderais aussi simple que possible. Si vous utilisez send/recv, vous n'avez pas besoin de gérer beaucoup, il vous suffit de supprimer l'instantané n-1 du côté local lors de la transmission et de l'établissement de l'instantané n du côté distant a réussi.

Vous pouvez diviser votre transport comme vous le souhaitez, il peut même être asynchrone (les instantanés ne doivent pas être reçus immédiatement), si vous conservez la règle de fer selon laquelle vous ne pouvez envoyer qu'un diff entre l'instantané local actuel/nouveau et l'instantané local précédent , et que l'instantané local précédent est le plus récent du côté distant (jusqu'à ce que la sauvegarde se termine et que tout soit réinitialisé).

Maintenant que j'y pense, vous pourriez probablement encoder cela dans une machine d'état et être sûr qu'aucun cas imprévu ne peut passer.

7
user121391