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

25

Comment les pools zfs peuvent-ils être sauvegardés de manière continue / incrémentielle hors site?

Je reconnais que send/receiveover ssh est une méthode qui implique cependant 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 car il peut corrompre / supprimer des données.

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

Greg
la source
2
Je répondrai un peu plus tard, mais j'ai une solution qui effectue ce type de réplication toutes les 15 secondes du serveur ZFS principal au serveur secondaire.
ewwhite

Réponses:

33

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 ZFS en cluster dans la mesure du possible, parfois ce n'est pas pratique, ou j'ai besoin d'une séparation géographique des nœuds de stockage.

L'un des cas d'utilisation que j'ai concerne le stockage répliqué hautes performances sur les 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 est un RPO de 10 minutes .

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 d'instantanés approfondie 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 que server1 et server2 , une commande simple exécutée à partir de server2 pour extraire les données de server1 :

#!/bin/bash

/usr/local/bin/syncoid root@server1: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, une réplique atomique continue de 15 secondes:

# 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
ewwhite
la source
4
Merci d'avoir posté, votre réponse est phénoménale et exactement ce que je cherchais (de la latence à la surveillance du processus). Je lis également github.com/ewwhite/zfs-ha/wiki et je suis vraiment impressionné. Merci encore :)
Greg
6

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 rsyncou 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. Il peut s'agir de votre propre solution, d'un script ou d'un script étendu parmi les différents de Github et al., Ou d'outils plus riches en fonctionnalités comme Sanoid ou ZnapZend (envoi / 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 lorsque la transmission et l'établissement de l'instantané n du côté distant ont 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.

user121391
la source
Je ne vois pas comment une rsyncsolution basée sur le système évoluerait pour répliquer en continu un système de fichiers à grande échelle. Les changements pourraient se produire plus rapidement que les rsyncdécouvrir.
Andrew Henle
2
@AndrewHenle Je ne le préconiserais pas non plus, je voulais juste le présenter, car la question ne précisait pas la portée / taille des données ni le calendrier. Ainsi, en cas d'action peu fréquente, il pourrait être possible qu'elle soit indépendante du système de fichiers. Bien sûr, vous
perdriez
@ user121391 Entièrement d'accord avec vous sur l'open source comme voie à suivre. Merci pour votre réponse détaillée.
Greg
@Dave au moment où je tape ...
ewwhite
1
recommande vivement znapzend
Trent Lloyd