Como executar backups incrementais / contínuos do pool zfs?

25

Como é possível fazer backup externo / incremental de pools do zfs externamente?

Eu reconheço que o send/receiveover ssh é um método, no entanto, que envolve a necessidade de gerenciar snapshots manualmente.

Existem algumas ferramentas que encontrei, no entanto, a maioria não é mais suportada.

A única ferramenta que parece promissora é https://github.com/jimsalterjrs/sanoid, no entanto, estou preocupado que uma ferramenta não conhecida possa causar mais mal do que bem, pois pode danificar / excluir dados.

Como são realizados os backups contínuos / incrementais do zfs?

Greg
fonte
2
Responderei um pouco mais tarde, mas tenho uma solução que executa esse tipo de replicação a cada 15 segundos do servidor ZFS primário para o secundário.
precisa saber é o seguinte

Respostas:

33

O ZFS é um sistema de arquivos incrível e resolve muitas das minhas necessidades de armazenamento de dados locais e compartilhados.

Embora eu goste da ideia de ZFS em cluster sempre que possível, às vezes não é prático ou preciso de uma separação geográfica dos nós de armazenamento.

Um dos casos de uso que tenho é para armazenamento replicado de alto desempenho em servidores de aplicativos Linux. Por exemplo, eu apoio um produto de software legado que se beneficia das unidades SSD NVMe de baixa latência para seus dados. O aplicativo possui uma opção de espelhamento no nível do aplicativo que pode ser replicada em um servidor secundário, mas geralmente é imprecisa e é um RPO de 10 minutos .

Resolvi esse problema com um servidor secundário (também executando o ZFS em hardware semelhante ou diferente) que pode ser local, remoto ou ambos. Ao combinar os três utilitários detalhados abaixo, criei uma solução de replicação que me oferece replicação contínua, retenção profunda de instantâneos e opções flexíveis de failover.

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

Apenas uma ferramenta útil para habilitar instantâneos periódicos no nível do sistema de arquivos ZFS. Normalmente, eu executo o seguinte cronograma nos volumes de produção:

# /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

Este programa pode executar snap / replicação ad-hoc de um sistema de arquivos ZFS para um destino secundário. Eu uso apenas a parte syncoid do produto.

Supondo server1 e server2 , um comando simples é executado no server2 para extrair dados do server1 :

#!/bin/bash

/usr/local/bin/syncoid root@server1:vol1/data vol2/data

exit $?

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

O Monit é um agendador de tarefas e um gerenciador de execução extremamente flexíveis. Por padrão, ele funciona em um intervalo de 30 segundos, mas modifico a configuração para usar um ciclo de tempo base de 15 segundos.

Um exemplo de configuração que executa o script de replicação acima a cada 15 segundos (1 ciclo)

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

Isso é simples de automatizar e adicionar via gerenciamento de configuração. Ao envolver a execução do instantâneo / replicação no Monit, você obtém status centralizado, controle de tarefas e alertas (email, SNMP, script personalizado).


O resultado é que tenho servidores com vários meses de instantâneos mensais e muitos pontos de reversão e retenção em: https://pastebin.com/zuNzgi0G - Além disso, uma réplica atômica contínua de 15 segundos:

# 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
fonte
4
Obrigado por postar, sua resposta é fenomenal e exatamente o que eu estava procurando (da latência ao monitoramento do processo). Também estou lendo github.com/ewwhite/zfs-ha/wiki e estou completamente impressionado. Obrigado mais uma vez :)
Greg
6

Você tem duas maneiras diferentes de fazer isso:

  1. A maneira tradicional, independente de sistema de arquivos, que é / foi usada nas últimas décadas, com ferramentas como rsyncou Bacula. Lá você testou e (esperançosamente) software grande e estável, que pode ser personalizado para grandes implantações e pode ser usado mesmo que você se afaste do ZFS
  2. Uma das ferramentas que aproveitam o ZFS send/recv. Essa pode ser sua própria solução, um script ou um script estendido de vários no Github et al., Ou mais ferramentas ricas em recursos como Sanoid ou ZnapZend (envie / recupere com suporte a mbuffer e planos de retenção). Nesse caso, é provável que você não encontre grandes soluções "corporativas" (no sentido negativo), mas ferramentas que executam apenas a tarefa única e podem ser combinadas com outras ferramentas para atender à sua configuração específica.

Em geral, eu confiava apenas em uma ferramenta cujo código-fonte está disponível e a mantinha o mais simples possível. Se estiver usando send/recv, você não precisa gerenciar muito, basta excluir o instantâneo n-1 no lado local quando a transmissão e o estabelecimento do instantâneo n no lado remoto foram bem-sucedidos.

Você pode dividir seu transporte da maneira que desejar, podendo até ser assíncrono (os instantâneos não precisam ser recebidos imediatamente), se você apenas mantiver a regra de ferro de que você só pode enviar uma diferença entre o instantâneo atual atual / novo e o local anterior , e que o instantâneo anterior local seja o mais recente no lado remoto (até que o backup termine e tudo seja redefinido).

Agora que penso nisso, você provavelmente pode codificar isso em uma máquina de estado e, em seguida, ter certeza de que nenhum caso imprevisto possa passar despercebido.

user121391
fonte
Não vejo como uma rsyncsolução baseada em escala seria dimensionada para replicar continuamente um grande sistema de arquivos em escala corporativa. As mudanças podem acontecer mais rapidamente do que rsyncpoderiam descobri-las.
Andrew Henle
2
@AndrewHenle Também não defenderia isso, só queria apresentá-lo, porque a pergunta não especificava o escopo / tamanho dos dados ou o prazo. Portanto, em caso de ação pouco frequente, é possível que seja independente do sistema de arquivos. Claro, você perderia os deltas agradáveis em nível de bloco ...
user121391
@ user121391 Concordo totalmente com você sobre o código aberto ser o caminho a percorrer. Obrigado pela sua resposta detalhada.
5117 Greg
@ Dave, assim como eu estou escrevendo ...
ewwhite
1
recomendo znapzend
Trent Lloyd