Mover um volume lógico diretamente de um servidor para outro pela rede?

13

Eu tenho uma máquina host KVM com várias VMs. Cada VM usa um volume lógico no host. Preciso copiar os LVs para outra máquina host.

Normalmente, eu usaria algo como:

dd if=/the/logical-volume of=/some/path/machine.dd

Para transformar o LV em um arquivo de imagem e use o SCP para movê-lo. Em seguida, use DD para copiar o arquivo de volta para um novo LV no novo host.

O problema com esse método é que você precisa do dobro do espaço em disco que a VM ocupa nas duas máquinas. ie um LV de 5 GB usa 5 GB de espaço para o LV e a cópia em dd também usa 5 GB de espaço adicional para a imagem. Isso é bom para LVs pequenos, mas e se (como é o meu caso) você tiver um LV de 500 GB para uma grande VM? A nova máquina host possui um disco rígido de 1 TB, portanto, não pode conter um arquivo de imagem dd de 500 GB e possui um volume lógico de 500 GB para copiar e espaço para o sistema operacional host e espaço para outros convidados menores.

O que eu gostaria de fazer é algo como:

dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv

Em outras palavras, copie os dados diretamente de um volume lógico para outro na rede e pule o arquivo de imagem intermediário.

Isso é possível?

usuario
fonte

Respostas:

24

Claro, é claro que é possível.

dd if=/dev/mygroup-mylv | ssh 192.168.1.103 dd of=/dev/newvgroup-newlv

Estrondo.

Faça um favor a si mesmo e use algo maior que o tamanho padrão do bloco. Talvez adicione bs = 4M (leitura / gravação em pedaços de 4 MB). Você pode ver que há alguns detalhes sobre tamanhos de blocos nos comentários; se isso é algo que você se faz com bastante frequência, reserve um tempo para experimentá-lo algumas vezes com tamanhos de bloco diferentes e veja por si mesmo o que oferece as melhores taxas de transferência.

Respondendo a uma das perguntas dos comentários:

Você pode canalizar a transferência através de pv para obter estatísticas sobre a transferência. É muito melhor do que a saída que você obtém ao enviar sinais dd.

Eu também direi que, embora, obviamente, o uso do netcat - ou qualquer outra coisa que não imponha a sobrecarga de criptografia - seja mais eficiente, geralmente acho que a velocidade adicional ocorre com alguma perda de conveniência. A menos que eu esteja movendo conjuntos de dados muito grandes, normalmente fico com o ssh, apesar da sobrecarga, porque na maioria dos casos tudo já está configurado para Just Work.

larsks
fonte
1
O bs afeta apenas a velocidade da cópia ou afeta a maneira como os dados são armazenados?
Nick
3
Não afeta a maneira como os dados são armazenados, mas é muito mais eficiente do que usar o tamanho de bloco padrão (de 512 bytes) para leitura e gravação.
Larsks
3
@ Nick: No Linux, você pode enviar o ddprocesso ao USR1sinal para exibir uma linha de status com o valor transferido. Obter o número do processo do seu ddprocesso com algo parecido ps aux | grep dde, em seguida, usar esta PID com o comando kill -USR1 $PID. A mensagem será exibida no terminal original onde você começou dd.
Sven
3
Você provavelmente não deseja usar um bs tão grande, pois ele bloqueará a gravação no pipe para ssh até que possa transferir a maior parte para o soquete de rede, durante o qual o disco ficará ocioso. Como o tamanho padrão do readahead é 128k, você provavelmente deseja manter isso. Ou aumente o tamanho do readahead do disco.
9134 psusi
1
@psusi: O link que o Zoredache colocou como comentário abaixo da pergunta demonstrou o contrário: eles obtiveram o resultado mais rápido com tamanhos de bloco de 16M, mas usaram o netcat em vez do ssh como método de transferência, o que é sempre uma opção melhor quando a criptografia não é necessária.
Sven
18

Aqui está uma versão otimizada, que mostra o progresso usando pve usa BS para pedaços maiores e também usa gzippara reduzir o tráfego de rede.

Isso é perfeito ao mover os dados entre conexões lentas, como servidores da Internet. Eu recomendo executar o comando dentro de uma sessão de tela ou tmux. Dessa forma, a conexão ssh com o host de onde você executa o comando pode ser desconectada sem problemas.

$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
    ssh [email protected] 'gzip -d | dd of=/dev/volumegroupname/logicalvolume  bs=4096'
Johannes Doering
fonte
2
Você poderia usar em ssh -Cvez de gzip. Não tenho certeza se há um impacto no desempenho, mas é muito menos digitação.
Samuel Edwin Ward
1
Também sugiro usar pigz ou pxz -1 em vez de gzip, o multithreading realmente ajuda em qualquer servidor moderno.
SCiphre
pvpode causar problemas (na minha experiência, movendo mais 500 vps para outros servidores com este sistema) com o número de bytes e, após esse problema, os volumes lvm são inconsistentes. Os benefícios de ver o progresso do trabalho são nulos e perigosos. Se você gosta de ver o progresso, abra um console com ifto, por exemplo.
abkrim
4

Que tal usar um amigo antigo para fazer isso. NetCat.

No sistema que está perdendo o tipo de volume lógico

  • $ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]

Depois, no sistema receptor. tipo

  • $ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]

Traduzindo, orgin box dd esse arquivo e canalize-o para nc (netcat) que ouvirá essa porta. No sistema receptor, o netcat aguardará 10 segundos se não obtiver dados antes de fechar para [ip ou nome] em [porta] e depois canalize esses dados para dd para gravá-los.

linuxrebel
fonte
2
O Netcat não usa o UDP com essas opções.
Samuel Edwin Ward
3

Primeiro, eu tiraria um instantâneo do lv:

lvcreate --snapshot --name my_shot --size <thesize> /dev/<name of vg>/<name of lv>

Depois disso, você deve criar um novo lv no novo host (por exemplo, usando lvcreate) com o mesmo tamanho. Em seguida, você pode copiar os dados diretamente para o novo host. Aqui está o meu exemplo do comando copy:

dd if=/dev/vg0/my_shot bs=4096 | pv | ssh root@some_host -C 'dd of=/dev/vg1/<created lv> bs=4096'

Eu usei o procedimento para copiar uma VM mantida proxmox pve para outro host. O volume lógico continha vários LVs adicionais que foram mantidos pela própria VM.

Woolf
fonte
2

Primeiro, verifique se o volume lógico não está montado. Se for e você deseja fazer uma "cópia quente", crie primeiro um instantâneo e use-o: lvcreate --snapshot --name transfer_snap --size 1G

Eu tenho que transferir muitos dados (7 TB) entre dois servidores conectados de 1 Gbit, então eu precisava da maneira mais rápida possível de fazê-lo.

Você deve usar SSH?

O uso de ssh está fora de questão, não por causa de sua criptografia (se você possui uma CPU com suporte AES-NI, não dói muito), mas por causa de seus buffers de rede. Aqueles não estão bem dimensionados. Existe uma versão Ssh corrigida que resolve esse problema, mas como não existem pacotes pré-compilados, isso não é muito conveniente.

Usando compactação

Ao transferir imagens de disco bruto, é sempre aconselhável usar a compactação. Mas você não deseja que a compactação se torne um gargalo. A maioria das ferramentas de compactação unix, como o gzip, são de thread único; portanto, se a compactação saturar uma CPU, será um gargalo. Por esse motivo, eu sempre uso pigz, uma variante gzip que usa todos os núcleos da CPU para compactação. E é necessário que você queira ir acima e acima da velocidade do GBit.

Usando criptografia

Como dito anteriormente, o ssh é lento. Se você possui uma CPU AES-NI, isso não deve ser um gargalo. Então, ao invés de usar o ssh, podemos usar o openssl diretamente.

Velocidades

Para lhe dar uma idéia do impacto na velocidade dos componentes, aqui estão meus resultados. Essas são velocidades de transferência entre dois sistemas de produção, lendo e gravando na memória. Os resultados reais dependem da velocidade da rede, da velocidade do disco rígido e da velocidade da CPU de origem! Estou fazendo isso para mostrar que pelo menos não há uma queda enorme no desempenho. Simple nc dd: 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 47.3576 s, 106 MB/s +pigz compression level 1 (speed gain depends on actual data): network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 38.8045 s, 130 MB/s +pigz compression level 5: network traffic: 2.43GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 44.4623 s, 113 MB/s +compression level 1 + openssl encryption: network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 43.1163 s, 117 MB/s Conclusão: o uso de compactação proporciona uma aceleração notável, pois reduz muito o tamanho dos dados. Isso é ainda mais importante se você tiver velocidades de rede mais lentas. Ao usar a compactação, observe o uso da CPU. se o uso for maximizado, você pode tentar sem ele. Usar a compactação como apenas um pequeno impacto nos sistemas AES-NI, imho apenas porque rouba cerca de 30 a 40% da CPU.

Usando a tela

Se você estiver transferindo muitos dados como eu, não deseja que eles sejam interrompidos por uma desconexão de rede do seu cliente ssh, portanto é melhor iniciá-lo com a tela dos dois lados. Esta é apenas uma observação, não vou escrever um tutorial de tela aqui.

Permite copiar

Instale algumas dependências (na origem e destino): apt install pigz pv netcat-openbsd

em seguida, crie um volume no destino com o mesmo tamanho da fonte. Se não tiver certeza, use lvdisplay na fonte para obter o tamanho e criar o destino, ou seja: lvcreate -n lvname vgname -L 50G

Em seguida, prepare o destino para receber os dados:

nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname

e quando estiver pronto, inicie a transferência na fonte:

pv -r -t -b -p -e /dev/vgname/lvname | pigz -1 | openssl aes-256-cbc -salt -pass pass:asdkjn2hb | nc <destip/host> 444 -q 1

Nota: Se você estiver transferindo os dados localmente ou não se importa com criptografia, basta remover a parte Openssl dos dois lados. Se você se importa, asdkjn2hb é a chave de criptografia, você deve alterá-la.

bhelm
fonte
NUNCA FAÇA ISTO EM UM SERVIDOR PROXMOX: apt install netcat-openbsd A instalação do netcat-openbsd limpou completamente o ProxMox do servidor e causou mais de 5 horas de inatividade e trabalho !!!
Zoltan