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

20

Como os pools do zfs podem ser armazenados de forma contínua / incremental externamente?

Eu reconheço que o send/receive over ssh é um método que envolve gerenciar os snapshots manualmente.

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

A única ferramenta que parece promissora é o link . No entanto, estou preocupado que ferramentas não amplamente conhecidas possam causar mais danos do que boas que pode corromper / excluir dados.

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

    
por Greg 04.04.2017 / 17:59

2 respostas

22

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

Embora eu goste da ideia de ZFS agrupado sempre que possível, às vezes não é prático, ou eu preciso de alguma separação geográfica de 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 suporte um produto de software legado que se beneficia de unidades SSD NVMe de baixa latência para seus dados. O aplicativo tem uma opção de espelhamento no nível do aplicativo que pode ser replicada para um servidor secundário, mas muitas vezes é imprecisa e é um RPO .

Eu resolvi esse problema tendo um servidor secundário (também executando o ZFS em hardware similar ou diferente) que pode ser local, remoto ou ambos. Combinando os três utilitários detalhados abaixo, criei uma solução de replicação que me fornece replicação contínua, retenção profunda de snapshots e opções flexíveis de failover.

zfs-auto-snapshot - link

Apenas uma ferramenta útil para habilitar instantâneos periódicos no nível do sistema de arquivos do ZFS. Normalmente corro com o seguinte cronograma em 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) - link

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

Supondo que server1 e server2 , o comando simples seja executado de server2 para puxe os dados de server1 :

#!/bin/bash

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

exit $?

Monit - link

Monit é um agendador de tarefas e gerenciador de execução extremamente flexível. Por padrão, ele funciona em um intervalo de 30 segundos, mas modifico a configuração para usar um ciclo de tempo 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 (e-mail, SNMP, script personalizado).

O resultado é que tenho servidores que têm vários meses de snapshots mensais e muitos pontos de rollback e retenção em: link - 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
    
por 05.04.2017 / 14:42
5

Você tem duas maneiras diferentes de fazer isso:

  1. A maneira tradicional e independente de sistema que é / foi usada nas últimas décadas, com ferramentas como rsync ou Bacula . Lá você testou e (espero) estáveis, grandes softwares que podem ser personalizados para grandes implementações e podem ser usados mesmo se você mudar do ZFS
  2. Uma das ferramentas que alavancam o ZFS send/recv . Isso pode ser sua própria solução, um script ou script estendido dos vários no Github et al., Ou mais ferramentas ricas em recursos como o Sanoid ou o ZnapZend (enviar / recv com suporte a mbuffer e planos de retenção). Nesse caso, é muito provável que você não encontre soluções grandes, "empreendedor" (no sentido negativo), mas ferramentas que façam apenas uma única tarefa e possam ser combinadas com outras ferramentas para atender a sua configuração específica.

Em geral, eu confiaria apenas em uma ferramenta cujo código-fonte estivesse disponível, e manteria o mais simples possível. Se estiver usando send/recv , você não precisa gerenciar muito, você só tem que deletar o snapshot n-1 no lado local quando a transmissão e o estabelecimento do snapshot n no o lado remoto foi bem sucedido.

Você pode dividir o seu transporte da maneira que quiser, ele pode até ser assíncrono (instantâneos não precisam ser recebidos imediatamente), se você apenas mantiver a regra de ferro, você só pode enviar um diff entre o local atual / novo e instantâneo anterior local e que o instantâneo anterior local é o mais recente no lado remoto (até o backup terminar e tudo ser reiniciado).

Agora que penso nisso, você provavelmente poderia codificar isso em uma máquina de estado e, então, ter certeza de que nenhum caso imprevisto pode passar.

    
por 05.04.2017 / 09:00