Instantâneo do ZFS para arquivar como backup com rotação

14

Eu tenho um sistema FreeNAS local e quero usar snapshots do ZFS para backups.
O FreeNAS possui as Tarefas de replicação internas que usam

zfs send snapshot_name

para enviar um instantâneo para um sistema remoto. Mas isso precisa de um sistema com o ZFS do outro lado.

Quero enviar o instantâneo para um arquivo e enviar esse arquivo compactado e criptografado para a máquina remota.

Isso é possível com

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

Todos os dias, faço um instantâneo do pool de armazenamento e mantenho todos os instantâneos por 30 dias.
Com cada instantâneo tirado, canalizo esse instantâneo para um arquivo.
- snapshot_file 1 possui todos os arquivos (digamos 2GB)
- snapshot_file 2 possui apenas as alterações no snapshot_file 1 (digamos 5MB)
- snapshot_file 3 mantém as alterações no snapshot_file 2; e assim por diante.

No dia 31, o snapshot_file 1 está sendo excluído (porque eu só quero as alterações dos últimos 30 dias)

Portanto, o snapshot_file 2 precisa armazenar todos os arquivos (2 GB de snapshot_file 1 + 5 MB são alterados)

Mas com essa abordagem todos os dias (a partir do dia 31), um novo arquivo de 2 GB deve ser criado e enviado para um sistema remoto. Isso é demais.

Qual seria a melhor abordagem para usar os instantâneos canalizados para um arquivo como uma estratégia de backup com um histórico de X dias?

PS: Eu sei que há muitos softwares de backup por aí (rdiff-backup, por exemplo), que eu poderia usar. Mas estou curioso para saber como isso pode ser feito.

Martin Grohmann
fonte
Por que você não usa zfs recvdo outro lado (em uma piscina, zfs set compression=gzip-9por exemplo). Armazenar arquivos de instantâneo parece muito ineficiente para mim.
Stéphane Chazelas
1
@StephaneChazelas porque não tenho um sistema de arquivos ZFS na outra extremidade. Meu sistema remoto é uma caixa gentoo com ext4 (eu sei que eu poderia instalar zfsonlinux, mas eu prefiro não)
Martin Grohmann

Respostas:

12

Se você armazena os instantâneos nos arquivos, ao contrário do sistema de arquivos (por exemplo, com zfs receive), receio que isso não seja possível.

ZFS no lado receptor

Se você usar o ZFS no lado de envio e de recebimento, poderá evitar a transferência de todo o instantâneo e transferir apenas as diferenças do instantâneo em comparação com o anterior:

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

O ZFS conhece os instantâneos e armazena blocos mútuos apenas uma vez. O fato de o sistema de arquivos entender os instantâneos permite excluir os antigos sem problemas.

Outro sistema de arquivos no lado de recebimento

No seu caso, você armazena os instantâneos em arquivos individuais, e seu sistema de arquivos não os conhece. Como você já percebeu, isso interrompe a rotação. Você precisa transmitir instantâneos inteiros, o que desperdiçará largura de banda e espaço de armazenamento, mas permitirá excluir instantâneos individuais. Eles não dependem um do outro. Você pode fazer snapshots incrementais como este:

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

Para restaurar um instantâneo incremental, você também precisa dos instantâneos anteriores. Isso significa que você não pode excluir os incrementais antigos.

Soluções possíveis

Você pode fazer incrementais, como mostrado no meu último exemplo, e fazer um novo não incremental a cada mês. Os novos incrementais dependem desse não incremental e você pode excluir os instantâneos antigos.

Ou você pode procurar outras soluções de backup. Há o rsnapshot , que usa rsynce links físicos. Faz um trabalho muito bom na rotação e é muito eficiente na largura de banda, pois requer um backup completo apenas uma vez.

Depois, há bareos . Faz incrementais, que economizam largura de banda e espaço. Tem um recurso muito bom; Ele pode calcular um backup completo de um conjunto de incrementais. Isso permite excluir incrementais antigos. Mas é um sistema bastante complexo e destinado a configurações maiores.

A melhor solução, no entanto, é usar o ZFS no lado de recebimento. Será eficiente em largura de banda, armazenamento eficiente e muito mais rápido que as outras soluções. A única desvantagem real que consigo pensar é que você deve ter no mínimo 8 GiB de memória ECC nessa caixa (você pode usar 4 GiB se não executar nenhum serviço e usá-lo apenas zfs receive).

Marco
fonte
sim isso eu sei. Mas e se eu excluir (porque só quero ter um histórico de 30 dias) o conjunto de dados do arquivo @ 2014-02-04? Só tenho as alterações feitas depois do dia 4 de fevereiro, mas nem todos os arquivos.
Martin Grohmann
2
@MartinGrohmann Entendo o que você quer dizer agora. Bem, essa é a beleza do ZFS, você pode excluir os instantâneos antigos no ZFS sem problemas. Em outros sistemas de arquivos, você deve manter os antigos. Talvez você esteja melhor com algo assim rsnapshot. Ou você pode iniciar um novo não incremental após um mês e excluir os incrementais anteriores.
Marco
obrigado pela ajuda; Acabei de encontrar duplicidade Esse é provavelmente o caminho a seguir com a capacidade de criptografia.
Martin Grohmann
2
O @MartinGrohmann Duplicity é um bom programa, mas sofre do mesmo problema . Se você fizer apenas incrementais, seu espaço continuará crescendo. Você não pode recuperar espaço sem desperdiçar largura de banda e fazer um novo backup completo. Seja o ZFS nos dois lados ou dê uma olhada no bareos , ele pode calcular um novo backup completo a partir de incrementais. Isso permite excluir incrementais antigos sem transferir novamente tudo.
Marco
Se a largura de banda da sua fonte for o problema, uma solução em potencial (que estou implementando para o meu ZFS NAS em casa agora) é enviar sempre apenas incrementais para o armazenamento remoto, mas uma vez por mês gere um freeBSD VPS remoto (por exemplo, em oceano digital) que pode abrir o último instantâneo completo, o zfs recupera alguns # de incrementais nele e armazena o resultado como um novo instantâneo. O VPS só precisa ter tempo suficiente para criar o novo backup de base. O oceano digital possui uma API que permite fácil criação / destruição de seus VPS. E seu sistema local precisa enviar apenas backups incrementais.
stuckj