O que é uma estratégia eficaz de backup externo para um pool espelhado do ZFS?

9

Eu uso um pool ZFS que consiste em dois discos espelhados. Para fazer backups externos, comprei mais dois discos.

Meu plano inicial era criar o backup externo anexando um terceiro disco ao espelho, aguardando o ZFS voltar a prender, desconectar a unidade e transportá-la para fora do local. Isso funciona bem o suficiente, mas fiquei surpreso ao ver que ele executa um resilver completo toda vez que um disco é conectado (eu li e, possivelmente, mal entendi, que cada anexo resultaria em um resilver incremental ou delta). Isso resulta em backups que demoram mais do que o aceitável.

Meus requisitos são ter uma cópia externa do meu zpool e todos os seus instantâneos que eu possa girar diariamente. Isso significa que a recuperação precisa levar no máximo 24 horas - no momento, é quase isso, mas nossos planos de aumentar nossa piscina o levarão além desse prazo.

Como posso manter backups externos que não exigem uma operação completa de resilver? Devo usar um sistema de arquivos diferente nas minhas unidades de backup (por exemplo, exportar uma imagem em vez de fazer parte do pool do ZFS)? Devo ter os backups em um pool separado e enviar novos instantâneos para ele à medida que são criados?

STW
fonte
Minha estratégia atual é o método de vários pools, com o zfs send and receive para manter os snapshots sincronizados. Gostaria de saber se você encontrou um argumento contra isso ou uma opção melhor.
precisa

Respostas:

3

Depois de muitos ajustes e experiências, encontrei uma solução, embora com uma troca bastante grande.

Primeiro, as opções que eu tinha que descartar:

  • Ter um segundo servidor ZFS externo com um pool espelhado não era uma opção devido ao custo. Se tivesse sido uma opção, essa seria de longe a melhor abordagem, utilizando o envio / recebimento do ZFS para enviar instantâneos ao pool remoto.

  • Ter um segundo pool espelhado do ZFS no local, do qual eu poderia remover os discos para levar para casa. Isso é mais viável do que a primeira opção, mas eu precisaria do segundo pool para sempre ter dois discos no local (ou usar duas cópias de dados em um único disco no local). No momento, tenho quatro discos e não há mais espaço para um quinto no servidor. Essa seria uma abordagem justa, mas ainda não ideal.

  • O uso do ZFS anexa e desanexa para girar o disco de backup para dentro e para fora do pool espelhado. Isso funciona bem, mas é necessário executar um resilver completo toda vez que o disco é adicionado. Isso leva inaceitavelmente tempo e, portanto, não pude confiar nisso.

Minha solução é semelhante ao uso attache detach, no entanto, usa onlinee offline. Isso tem a vantagem de realizar uma nova pesquisa delta versus uma pesquisa completa, mas a desvantagem de o pool sempre relatar um DEGRADEDestado (o pool sempre tem dois discos; os discos rotativos externos são marcados offlinequando estão no armazenamento e resilver remotos e ficam on-line quando estiverem no local).

Então, uma rápida recapitulação e visão geral da minha configuração:

Eu tenho um servidor ZFS e quatro discos idênticos. O ZFS está configurado para usar um pool espelhado. Dois dos quatro discos são membros permanentes desse pool. Os outros dois discos giram; um está sempre no armazenamento externo, o outro faz parte do pool para atuar como um backup pronto para uso.

Quando chegar a hora de girar os backups:

  • Espero que um zfs scrubseja concluído para garantir razoavelmente que o disco de backup está livre de erros

  • Eu zfs offlineo disco que será levado remoto. Depois de offline, eu diminuí hdparm -Y /dev/id-lo. Depois de um minuto, removo parcialmente o suporte de disco (apenas o suficiente para garantir a energia perdida) e depois dou outro minuto antes de puxar completamente a unidade para garantir que ela parou de girar. O disco entra em uma bolsa estática e, em seguida, em uma caixa protetora e sai do local.

  • Trago o outro disco externo. Ele é instalado na bandeja de aquecimento e gira. Eu uso zfs onlinepara restaurar o disco no pool e iniciar uma resilver parcial para torná-lo simultâneo.

Esse sistema garante que, a qualquer momento, eu tenha dois ONLINEdiscos espelhos e um OFFLINEdisco remoto (que foi limpo). O quarto disco está sendo resilvered ou online, o que tem o benefício de que, no caso de uma unidade em execução falhar, é provável que o pool ainda seja consistente com dois discos online.

Funcionou bem nas últimas duas semanas, mas eu ainda consideraria isso uma abordagem hackeada. Vou acompanhar se tiver problemas importantes.


Atualização: depois de executar isso por alguns meses, descobri que, no meu mundo real, o resilvering está demorando o mesmo tempo para desanexar / anexar e offline / online. Nos meus testes, acho que não estava executando uma limpeza - meu palpite é que, se uma unidade estiver offline para uma limpeza, ela precisará de um resilver completo.

STW
fonte
Definitivamente, isso não funcionará com apenas três dispositivos em vez de quatro? O Guia de administração do Oracle Solaris ZFS declara que há falha no pool de espelhos "Se todos os componentes de um espelho forem removidos" [grifo meu], o que parece implicar que uma quarta unidade não é estritamente necessária.
precisa saber é o seguinte
1
Por três dispositivos, você quer dizer dois discos que estão sempre no pool e um que está ocasionalmente fora do local, ou um disco que está sempre no pool e dois que rodam fora do local? Com a segunda opção, eu esperaria a perda de dados se o pool encontrar dados incorretos enquanto houver apenas um disco totalmente online (quando o 2º disco estiver sendo girado ou ainda não estiver totalmente resilvered). Meu objetivo é garantir sempre que seu pool espelhado tenha dois discos online em período integral.
STW
Eu quis dizer a segunda opção que você mencionou. Com essa opção, qual a probabilidade de haver dados incorretos enquanto apenas um disco está online? A resilver parcial / incremental deve ser relativamente rápida, certo? E mesmo que houvesse dados ruins, você não conseguiria se recuperar da segunda unidade? Ou se recuperar da terceira unidade, na pior das hipóteses? [Obviamente, existem cenários em que a recuperação não é possível; mas isso é verdade mesmo com quatro unidades; ou qualquer número, na verdade.]
Kenny Evitt
Eu sempre manteria dois discos espelhados on-line, com um terceiro e um quarto usados ​​para alternar backups. Sempre que você tem apenas um disco on-line em um espelho, é vulnerável - e mesmo com a minha abordagem, existe o risco de o disco de backup externo desenvolver problemas de integridade e não ser 100% recuperável (o ideal seria dois discos espelhados fora do local a qualquer momento, para que a integridade dos dois possa ser comparada).
STW
Para resumir, o ZFS visa evitar uma única cópia de dados (ou pelo menos ter paridade, permitindo a reconstrução de dados incorretos). Quando você possui apenas um disco online ou uma cópia dos dados de backup, isso corre o risco de perda de dados.
STW
2

Por que o zfs não envia seus snapshots para uma máquina ZFS remota? Eu uso um script bash simples para isso:

#!/usr/local/bin/bash
# ZFS Snapshot BASH script by Shawn Westerhoff
# Updated 1/14/2014

### DATE VARIABLES
# D = Today's date
# D1 = Yesterday's date
# D# = Today less # days date
Y=$(date -v-1d '+%m-%d-%Y')
D=$(date +%m-%d-%Y)
D1=$(date -v-1d '+%m-%d-%Y')
D10=$(date -v-10d '+%m-%d-%Y')
D20=$(date -v-20d '+%m-%d-%Y')

# Step 1: Make the snapshots

for i in $( zfs list -H -o name ); do
    if [ $i == tier1 ]
    then echo "$i found, skipping"
    else
    zfs snapshot $i@$D
    fi
done

# Step 2: Send the snapshots to backup ZFS sever

    for i in $( zfs list -H -o name ); do
        zfs send -i $i@$D1 $i@$D | ssh -c arcfour root@10.10.10.10 zfs recv $i
    done

# Step 3: Destroy snapshots that are 20 days old

for i in $( zfs list -H -o name ); do
        if [ $i == tier1 ]
        then echo "$i found, skipping"
        else
        zfs destroy $i@$D20
        fi
done
Shawn Westerhoff
fonte
0

Criei uma ferramenta chamada snapdump que permite criar despejos incrementais dos conjuntos de dados do zfs para um sistema de arquivos externo (não zfs). O Snapdump também suporta a restauração de uma cadeia incremental de instantâneos com um único comando.

Omry Yadan
fonte