Conselho de backup do ZFS com outro servidor

2

Atualmente, tenho dois servidores com o mesmo hardware, discos, etc.

Um servidor (server1) será o servidor "principal". É basicamente um servidor com raidz2 que possui compartilhamentos SMB nos quais as pessoas se conectam.

O outro servidor (server2) é configurado da mesma forma que server1 (raidz2), mas deve ser apenas para fazer backup do server1. É para ser um backup externo no caso de perdermos server1 de falha de disco, fogo, danos causados pela água, etc.

Estou tentando descobrir a melhor maneira de fazer os backups para o server2.

No começo, eu estava pensando em algo como rsync. Isso é trivial para configurar em um cron, e eu posso fazer isso uma vez por semana.

Alternativamente, eu estava pensando em algo com zfs send / recv. Meu entendimento é que o ZFS pode fazer "snapshots", então achei que seria ótimo se eu pudesse criar snapshots / backups incrementais sem perder muito espaço. Eu sinto que isso pode ser mais difícil de implementar / propenso a erros.

Como eu disse antes, ambos os servidores são configurados da mesma forma em termos de hardware e layout raidz2. O que vocês recomendariam para minha situação atual?

    
por Robert Goulet 23.12.2014 / 22:29

5 respostas

4

O ZFS é muito resiliente. O exemplo mais básico de envio de um sistema de arquivos seria:

# zfs snapshot tank/test@tuesday
# zfs send tank/test@tuesday | ssh [email protected] "zfs receive pool/test"

Observe o instantâneo antes do envio (e envio do instantâneo).

Você poderia incluir isso em um script para excluir o instantâneo local depois de enviá-lo para o controle remoto - ou mantê-lo se você tiver o espaço em disco para poder. Mantenha os instantâneos anteriores no servidor de backup.

Fonte e leitura altamente recomendada: link

    
por 23.12.2014 / 23:30
2

Eu usaria envio / recebimento incremental do ZFS. Ele deve ser mais eficiente do que rsync , pois o ZFS sabe o que foi alterado desde o instantâneo anterior sem precisar explorar todo o sistema de arquivos.

Supondo que você deseja fazer backup completo de um nome de sistema de arquivos datapool/fs .

Primeiro, você cria um pool para armazenar seu backup no servidor de destino e um instantâneo recursivo no pool de origem:

dest # zpool create datapool ...
source # zfs snapshot -r datapool/fs@snap1

você envia os dados completos como um backup inicial:

source # zfs send -R datapool/fs@snap1 | ssh dest zfs receive datapool/fs

Na próxima semana (ou em qualquer período que você desejar), crie um segundo instantâneo no pool de origem e envie-o incrementalmente no destino. Naquela época, o ZFS é inteligente o suficiente para enviar apenas o que foi alterado durante a semana (arquivos excluídos, criados e modificados). Quando um arquivo é modificado, ele não é enviado como um todo, mas somente os blocos modificados são transmitidos e atualizados.

source # zfs snapshot -r datapool/fs@snap2
source # zfs send -ri snap1 datapool/fs@snap2 | 
            ssh dest zfs receive -F datapool/fs

Repita a operação incrementando os números dos instantâneos sempre que fizer backup.

Remova os instantâneos antigos não utilizados nos servidores quando você não precisar mais deles.

Se você tiver restrições de largura de banda, poderá compactar / descompactar dados rapidamente, por exemplo, inserindo comandos gzip / zip no pipeline ou ativando a compactação ssh.

source # zfs send -ri snap1 datapool/fs@snap2 | gzip | 
            ssh dest "gunzip | zfs receive -F datapool/fs"

Você também pode aproveitar mbuffer para obter um uso de largura de banda mais estável, conforme descrito neste página :

dest # mbuffer -s 128k -m 1G -I 9090 | zfs receive datapool/fs

source # zfs send -i snap2 datapool/fs@snap3 | 
            mbuffer -s 128k -m 1G -O w.x.y.z:9090

Observação: o sinalizador zfs -r não está disponível para implementações não ZFS do Solaris, consulte link . Nesse caso, não use o sinalizador -F no destino, mas em vez disso, reverta explicitamente os conjuntos de dados. Se novos conjuntos de dados tiverem sido criados na origem, envie-os primeiro de forma independente antes de fazer o snapshot + envio / recebimento incremental.

É claro que, se você tiver apenas um sistema de arquivos para backup sem uma hierarquia de conjunto de dados subjacente ou se desejar executar backups independentes, o backup incremental será mais simples de implementar e deverá funcionar de forma idêntica em qualquer implementação do ZFS:

T0:

zfs snapshot datapool/fs@snap1
zfs send datapool/fs@snap1 | ssh dest zfs receive datapool/fs

T1:

zfs snapshot datapool/fs@snap2
zfs send -i snap1 datapool/fs@snap2 | 
            ssh dest zfs receive -F datapool/fs
    
por 24.12.2014 / 10:42
1

Eu tive problemas ao usar o zfs send / receive para enviar 1 TB para um controle remoto. Eu decidi quebrar o único sistema de arquivos de 1 TB para conter vários filhos. Agora, após uma falha de rede, na pior das hipóteses, apenas uma criança precisa ser reenviada. Eu uso meu script para cuidar de envios recursivos e manter o controle remoto em sincronia: link

Espero que este script possa ser útil para outra pessoa.

Exemplo de saída:

# zfsDup.sh shelltests
Test: array_add()
Test: array_clear()
Test: array_iterator()
Test: nameValidation()
Test: isValidSnapshot()
Test: getSnapshotFilesystems()
Test: getSnapshotData()
Test: getRemoteDestination()
Test: printElapsed()
Test: convertToBytes()
Shell tests completed, check the output for errors.

# zfsDup.sh zfstests
Start zfs tests.
Test: new parent file system.
Test: new child file system.
Test: simulate a failed send of the child filesystem.
Test: duplicate and check the child@2 snapshot is resent.
Test: snapshot existing files with updated child data.
Test: simulate a fail send os child@3
Test: snapshot test1.
Test: snapshot test2.
Test: snapshot test3.
Snapshot tests completed ok.
Test: remote host free space.
Test: new remote FS with no quota.
Test: incremental remote FS update with no quota.
Cleaning up zroot/tmp/zfsDupTest/dest zroot/tmp/zfsDupTest/source
Test execution time: 89secs
ZFS tests completed, check the output for errors.


# zfs list -t all -r ztest
NAME  USED  AVAIL  REFER  MOUNTPOINT
ztest  344K  448M  19K  /ztest
ztest@1  9K  -  19K  -
ztest@6  9K  -  19K  -
ztest/backup  112K  448M  19K  /ztest/backup
ztest/backup@1  9K  -  19K  -
ztest/backup@2  0  -  19K  -
ztest/backup@3  0  -  19K  -
ztest/backup@4  9K  -  19K  -
ztest/backup@5  0  -  19K  -
ztest/backup@6  0  -  19K  -
ztest/backup/data  57.5K  448M  20.5K  /ztest/backup/data
ztest/backup/data@1  0  -  19.5K  -
ztest/backup/data@2  0  -  19.5K  -
ztest/backup/data@3  9K  -  19.5K  -
ztest/backup/data@4  9K  -  19.5K  -
ztest/backup/data@5  0  -  20.5K  -
ztest/backup/data@6  0  -  20.5K  -

# zfs list -t all -r zroot/tmp
NAME  USED  AVAIL  REFER  MOUNTPOINT
zroot/tmp  38K  443M  19K  /tmp
zroot/tmp/zfsDupTest  19K  443M  19K  /tmp/zfsDupTest

# zfsDup.sh ztest zroot/tmp root@localhost
================================================================================
Starting duplication 20151001 16:10:56 ...
[email protected]
ztest/[email protected]
ztest/backup/[email protected]
Duplication complete 20151001 16:11:04.
================================================================================

# zfsDup.sh ztest zroot/tmp root@localhost
================================================================================
Starting duplication 20151001 16:11:25 ...
[email protected] to date
ztest/[email protected] to date
ztest/backup/[email protected] to date
Duplication complete 20151001 16:11:29.
================================================================================

# zfs snapshot -r ztest@7
# zfsDup.sh ztest zroot/tmp root@localhost
================================================================================
Starting duplication 20151001 16:12:25 ...
[email protected]
ztest/[email protected]
ztest/backup/[email protected]
Duplication complete 20151001 16:12:33.
================================================================================

# zfs list -t all -r zroot/tmp
NAME  USED  AVAIL  REFER  MOUNTPOINT
zroot/tmp  124K  442M  19K  /tmp
zroot/tmp/zfsDupTest  19K  442M  19K  /tmp/zfsDupTest
zroot/tmp/ztest  86K  442M  19K  /tmp/ztest
zroot/tmp/ztest@6  9K  -  19K  -
zroot/tmp/ztest@7  0  -  19K  -
zroot/tmp/ztest/backup  58K  442M  19K  /tmp/ztest/backup
zroot/tmp/ztest/backup@6  9K  -  19K  -
zroot/tmp/ztest/backup@7  0  -  19K  -
zroot/tmp/ztest/backup/data  30K  442M  20K  /tmp/ztest/backup/data
zroot/tmp/ztest/backup/data@6  10K  -  20K  -
zroot/tmp/ztest/backup/data@7  0  -  20K  -
    
por 02.12.2015 / 08:38
0

Existe uma boa ferramenta para gerenciar o envio / recv e integrar uma barra de progresso

está na árvore de ports do freebsd sob sysutils / zxfer ou no github

Você também pode usar uma ferramenta como sysutils / zfstools ou sysutils / zfsnap para automatizar a criação dos instantâneos, que serão sincronizados com a máquina remota via zxfer

Há mais documentação sobre o processo de envio / recada do zfs no Manual do FreeBSD

    
por 25.12.2014 / 16:35
0

Você também pode canalizar o envio / recebimento para, por exemplo. bzip2 e rsync . Como este post do blog observa, o escravo deve ter um conjunto "somente leitura".

    
por 24.12.2014 / 06:12