O que é uma estratégia de backup off-site eficiente para um pool espelhado do ZFS?

8

Eu uso um pool do ZFS que consiste em dois discos espelhados. Para obter cópias de segurança externas, comprei mais dois discos.

Meu plano inicial era criar o backup externo anexando um terceiro disco ao espelho, aguardando o resilver do ZFS, em seguida, desconectando a unidade e levando-a para fora do local. Isso funciona bem o suficiente, mas fiquei surpreso ao ver que ele parece executar uma resilver cheia toda vez que um disco é conectado (eu li, e possivelmente entendi mal, que cada conexão resultaria em um incremental ou delta resilver). Isso resulta em backups que levam mais tempo do que o aceitável.

Meus requisitos são ter uma cópia fora do meu zpool e todos os seus instantâneos que eu possa rodar diariamente. Isso significa que o resilvering precisa levar no máximo 24 horas - atualmente é perto disso, mas nossos planos de aumentar nosso pool o levarão além desse prazo.

Como posso manter backups externos que não exigem uma operação completa de resilvering? Devo estar usando um sistema de arquivos diferente em minhas unidades de backup (por exemplo, exportando uma imagem em vez de fazer com que ela faça parte do pool do ZFS)? Devo ter os backups em um pool separado e enviar novos instantâneos para eles quando forem criados?

    
por STW 29.10.2014 / 19:22

2 respostas

3

Depois de muita dedicação e experimentação, encontrei uma solução, embora com um tradeoff bastante grande.

Primeiro, as opções que eu tive que excluir:

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

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

  • Usando o ZFS, anexar e desanexar para girar o disco de backup para dentro e para fora do pool espelhado. Isso funciona bem, mas tem que executar um resilver completo sempre que o disco é adicionado. Isso leva um tempo inaceitavelmente longo e, por isso, não pude contar com isso.

Minha solução é semelhante a usar attach e detach , mas usa online e offline . Isso tem a vantagem de executar uma resilvering delta versus uma resilvering completa, mas a desvantagem de que o pool sempre relata um estado DEGRADED (o pool sempre tem dois discos; os discos externos rotacionais são marcados como offline quando estão em armazenamento remoto e resilver e, em seguida, vêm on-line quando estão no local).

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

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

Quando chega a hora de girar os backups:

  • Espero que um zfs scrub seja concluído para garantir razoavelmente que o disco de backup esteja livre de erros

  • Eu zfs offline o disco que será tomado como remoto. Após o seu offline eu hdparm -Y /dev/id para girar para baixo. Após um minuto, eu removo parcialmente o trenó do disco (o suficiente para garantir a perda de energia) e, em seguida, dou outro minuto antes de puxar totalmente a unidade para garantir que ela parou de girar. O disco entra em uma bolsa estática e, em seguida, em um estojo de proteção e vai para fora do local.

  • Eu trago o outro disco externo. Ele é instalado na bandeja do hotswap e gira. Eu uso zfs online para restaurar o disco para o pool e lançar um resilvering parcial para torná-lo concorrente.

Este sistema garante que, a qualquer momento, eu tenha dois ONLINE mirror discos e um OFFLINE disco remoto (que tenha sido limpo). O quarto disco está sendo resilvered ou on-line, o que traz o benefício de, no caso de uma unidade em execução falhar, provavelmente o pool ainda consistir em dois discos on-line.

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

Atualização: Depois de correr com isso por alguns meses, descobri que, no meu mundo real, o uso do resilvering leva o mesmo tempo para separar / anexar e offline / online. Nos meus testes, eu não acho que eu estava executando um scrub - meu palpite é que, se uma unidade está offline para um scrub, ela requer um resilver completo.

    
por 17.11.2014 / 18:23
2

Por que o zfs não envia seus instantâneos 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 [email protected] 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
    
por 07.12.2014 / 03:33

Tags