Contêiner LXD de backup para outro host LXD

1

Eu tenho dois servidores A e B que estão executando o Ubuntu 16.04 e um sistema de arquivos RAID1 ZFS para o LXD. No momento, existem alguns contêineres em execução no servidor A. Agora, minha ideia é fazer backups noturnos de cada contêiner no servidor A para o servidor B. Dessa forma, quero poder iniciar um contêiner no servidor B se o servidor A travar. Eu também posso usar os instantâneos locais no servidor A para restaurar um contêiner muito rápido se alguém excluir arquivos por acidente, por exemplo.

A maneira mais simples seria parar o contêiner C no servidor A, fazer o instantâneo Snap0 e iniciá-lo novamente. Em seguida, use lxc copy C/Snap0 serverB:C para copiar o instantâneo para o servidor B, supondo que eu já tenha adicionado o servidor B como host remoto ao servidor A. O problema aqui é que isso funciona apenas na primeira vez. Para um outro backup, eu teria que excluir o contêiner C no servidor B antes que eu possa copiá-lo novamente. E o segundo problema é que o contêiner está crescendo de backup para backup e, eventualmente, há tantos dados para transferir para o servidor B que todos os serviços executados nele terão largura de banda insuficiente.

Portanto, a solução para isso deve ser apenas transferir as diferenças entre os instantâneos noturnos. Pode-se conseguir isso com zfs send/receive que é em conjunto com o ssh capaz de enviar diferenças entre os instantâneos no servidor A para um servidor B sobre o ssh e depois adicionar essas diferenças ao sistema de arquivos do servidor B. Mas há um problema novamente. Ele não funciona se eu criei o sistema de arquivos inicial do contêiner C usando lxc copy porque esse comando não está usando zfs send/receive internamente, mas cria um novo sistema de arquivos no servidor B que, por sua vez, tem uma soma de verificação diferente do sistema de arquivos original servidor A. Portanto, um backup diferencial não é possível e zfs receive retornará com um erro, pois compara as somas de verificação dos sistemas de arquivos.

Minha próxima idéia é usar somente zfs send/receive para transferir todo o sistema de arquivos do contêiner C do servidor A para o servidor B sem criar um contêiner usando lxc copy/init . Depois disso, não será problema enviar as diferenças entre dois instantâneos consecutivos todas as noites, porque as somas de verificação coincidem. Mas, em seguida, há o problema de eu não conseguir iniciar a cópia do contêiner C no servidor B em caso de emergência porque não há entrada no banco de dados do LXD localizado em /var/lib/lxd/lxd.db , portanto, lxc start C não funcionará. Eu acho que posso simplesmente copiar as entradas relevantes do banco de dados LXD do servidor A para o banco de dados LXD do servidor B, a fim de fazê-lo funcionar, mas não tenho certeza disso. Talvez você possa me ajudar aqui. Eu não quero destruir nada nesses bancos de dados.

Algumas informações básicas: Na verdade, os servidores A e B estão executando contêineres, mas cada servidor deve conter backups dos contêineres do outro servidor.

Talvez já exista uma estratégia de backup funcional usando dois ou mais hosts LXD, mas não consegui encontrá-la. Existem apenas rsync - como estratégias de backup ou cópias completas de contêineres toda noite lá fora.

Atualização: Eu só tenho uma dica para este github commit que implementa um novo subcomando para o comando lxd, ou seja, lxd import . Então, eu precisava atualizar o lxd em ambos os servidores usando os backports do Ubuntu usando apt-get install -t xenial-backports lxd lxd-client .

Ninguém deve conseguir importar um contêiner de um sistema de arquivos existente. Eu tentei. Primeiro vá ao servidor A e tire um instantâneo

lxc snapshot C Snap0

Envie o instantâneo para o servidor B usando zfs send/receive usando o argumento extra -p no site do remetente para incluir também as propriedades do sistema de arquivos.

zfs send -p lxd/containers/C@snapshot-Snap0 | ssh serverB zfs receive lxd/containers/C

Mude para o servidor B e crie um link simbólico:

ln -s /var/lib/lxd/containers/C.zfs /var/lib/lxd/containers/C

E agora devo conseguir importar:

lxd import C

Mas, em vez disso, recebo um erro:

error: open /var/lib/lxd/containers/C/backup.yaml: no such file or directory

Como não sei de onde esse arquivo backup.yaml deve vir, tentei copiar o metadata.yawl para backup.yaml existente. Depois de outra tentativa, recebo este erro:

error: no response!

E agora não tenho ideia do que fazer porque não há conselhos de onde esse backup.yaml deve vir.

Atualização 2: Como o bubble mencionou, pode-se obter este arquivo backup.yaml parando e iniciando um container novamente ou simplesmente pegando outro snapshot após atualizar para lxc 2.7 +.

Então, finalmente, meu script está finalmente funcionando bem. Agora há apenas um pequeno problema. Depois de importar um contêiner com lxc import , não posso mais removê-lo sem destruir todo o sistema de arquivos do contêiner. Estou pensando em um comando como lxc import --update <container> ou lxc delete --keep-root-fs ou similar. Eu já fiz uma solicitação de recurso sobre essa ideia.

Atualização 3: E aqui você pode ver o progresso: Melhorar o manuseio de backup do LXD # 3005

    
por Nicolas 16.02.2017 / 15:23

1 resposta

1

Nicolas

Encontrei o mesmo problema que você enfrenta. No meu teste, eu tenho que atualizar de lxd 2.0.8 para 2.7 up e tem que parar lxc (que criou ou iniciar a partir do 2.0.x), em seguida, iniciar lxc novamente, você verá o backup.yaml e pode copiar para o destino para use a importação lxd (antes de importar, não esqueça do zfs set mountpoint e crie o nome do container de link para o ponto de montagem)

Espero que isso ajude.

    
por 02.03.2017 / 09:17