Sincronizando milhões de arquivos entre dois servidores Linux

9

Eu tenho um servidor que exporta um diretório contendo ~ 7 milhões de arquivos (principalmente imagens) de seu disco local para clientes da rede via NFS .

Preciso adicionar um segundo por causa da HA e mantê-lo sincronizado com o primeiro com o mínimo de delta possível entre os dois.

Pesquisas sugerem o uso de lsyncd ou outras soluções baseadas em inotify para isso, mas dado o número de arquivos que criam os relógios inotify leva uma eternidade. A mesma coisa para o rsync .

Outras soluções possíveis parece ser DRDB , ou cluster de arquivo sistemas tais como cef ou GlusterFS , mas eu não tenho nenhuma experiência com aqueles e não sei qual deles seria mais apropriado e lidar bem com que muitos arquivos e ainda proporcionar um desempenho decente.

Observe que a atividade é lida principalmente com pouca gravação.

user60039
fonte
2
O DRDB funciona bem e é simples de configurar e entender em uma configuração de cluster de duas máquinas; no entanto, não será dimensionado em um futuro próximo. Também pode haver outras abordagens para o assunto. highscalability.com/blog/2012/6/20/…
Rui F Ribeiro
Você tentou executar rsyncno modo daemon? Isso acelerará a geração inicial da lista de arquivos ao executar o rsynccomando, mas consumirá muita RAM, dependendo da quantidade de arquivos.
Thomas
quanto tempo você pode tolerar? se você pode tolerar alguns minutos (ou mais), usando btrfsou zfspode ser uma opção, combinada com uma tarefa cron para criar snapsnots e / zfs sendou btrfs sendpara o servidor de backup. carga de trabalho muito mais rápida e muito mais leve (para as máquinas remetente e receptora) do que o rsync porque o snapshot + send não precisa comparar registros de data e hora ou somas de verificação de arquivo.
cas
Aliás, com o ceph, você também tem a opção de usá-lo como um armazenamento de objetos (por exemplo, como o s3 da amazon ou o swift do openstacks) em vez de um sistema de arquivos. De fato, o fs do ceph é realmente colocado em cima de seu armazenamento de objetos.
cas
@ Thomas: o rsync -auso de daemon (na fonte) leva 200 minutos para ser concluído, o que é mais do que o aceitável. @cas: btrfs sendpode valer a pena tentar . Não consigo ir para um armazenamento de objetos, pois não sou o desenvolvedor do aplicativo que usa os arquivos.
user60039

Respostas:

1

Estou inclinado a sugerir replicação que é independente de dados, como drbd. O grande número de arquivos fará com que qualquer coisa que esteja sendo executada em um nível mais alto do que o "armazenamento em bloco" gaste uma quantidade excessiva de tempo andando na árvore - como você descobriu usando o rsync ou criando relógios inotify.

A versão curta da minha história pessoal confirma isso: eu não usei o Ceph, mas tenho certeza de que esse não é o principal objetivo de mercado com base na semelhança com o Gluster. No entanto, tenho tentado implementar esse tipo de solução com a Gluster nos últimos anos. Ele está em funcionamento na maior parte do tempo, apesar de várias atualizações importantes de versão, mas não tive problemas com o fim. Se seu objetivo é mais redundância do que desempenho, o Gluster pode não ser uma boa solução. Especialmente se o seu padrão de uso tiver muitas chamadas stat (), o Gluster não se sairá muito bem com a replicação. Isso ocorre porque as chamadas de estatísticas para volumes replicados vão para todos os nós replicados (na verdade, "tijolos", mas você provavelmente terá apenas um tijolo por host). Se você possui uma réplica bidirecional, por exemplo, cada stat () de um cliente aguarda uma resposta de ambos os tijolos para garantir que esteja usando os dados atuais. Você também terá a sobrecarga do FUSE e a falta de armazenamento em cache se estiver usando o sistema de arquivos gluster nativo para redundância (em vez de usar o Gluster como back-end com o NFS como protocolo e o montador automático para redundância, o que ainda é uma merda pelo motivo stat ()) . O Gluster se sai muito bem com arquivos grandes, nos quais você pode espalhar dados por vários servidores; a distribuição e distribuição de dados funciona bem, pois é para isso que serve. E a replicação mais recente do tipo RAID10 tem um desempenho melhor que os volumes replicados retos mais antigos. Mas, com base no que eu acho que é o seu modelo de uso, eu desaconselho. Você também terá a sobrecarga do FUSE e a falta de armazenamento em cache se estiver usando o sistema de arquivos gluster nativo para redundância (em vez de usar o Gluster como back-end com o NFS como protocolo e o montador automático para redundância, o que ainda é uma merda pelo motivo stat ()) . O Gluster se sai muito bem com arquivos grandes, nos quais você pode espalhar dados por vários servidores; a distribuição e distribuição de dados funciona bem, pois é para isso que serve. E a replicação mais recente do tipo RAID10 tem um desempenho melhor que os volumes replicados retos mais antigos. Mas, com base no que eu acho que é o seu modelo de uso, eu desaconselho. Você também terá a sobrecarga do FUSE e a falta de armazenamento em cache se estiver usando o sistema de arquivos gluster nativo para redundância (em vez de usar o Gluster como back-end com o NFS como protocolo e o montador automático para redundância, o que ainda é uma merda pelo motivo stat ()) . O Gluster se sai muito bem com arquivos grandes, nos quais você pode espalhar dados por vários servidores; a distribuição e distribuição de dados funciona bem, pois é para isso que serve. E a replicação mais recente do tipo RAID10 tem um desempenho melhor que os volumes replicados retos mais antigos. Mas, com base no que eu acho que é o seu modelo de uso, eu desaconselho. o que ainda é péssimo pelo motivo stat ()). O Gluster se sai muito bem com arquivos grandes, nos quais você pode espalhar dados por vários servidores; a distribuição e distribuição de dados funciona bem, pois é para isso que serve. E a replicação mais recente do tipo RAID10 tem um desempenho melhor que os volumes replicados retos mais antigos. Mas, com base no que eu acho que é o seu modelo de uso, eu desaconselho. o que ainda é péssimo pelo motivo stat ()). O Gluster se sai muito bem com arquivos grandes, nos quais você pode espalhar dados por vários servidores; a distribuição e distribuição de dados funciona bem, pois é para isso que serve. E a replicação mais recente do tipo RAID10 tem um desempenho melhor que os volumes replicados diretos mais antigos. Mas, com base no que eu acho que é o seu modelo de uso, eu desaconselho.

Lembre-se de que você provavelmente precisará encontrar uma maneira de realizar eleições-mestre entre as máquinas ou implementar o bloqueio distribuído. As soluções de dispositivos de bloco compartilhado requerem um sistema de arquivos com reconhecimento de vários mestres (como GFS) ou requer que apenas um nó monte a leitura / gravação do sistema de arquivos. Os sistemas de arquivos em geral não gostam quando os dados são alterados no nível do dispositivo de bloco abaixo deles. Isso significa que seus clientes precisarão saber qual é o mestre e direcionar solicitações de gravação lá. Isso pode se tornar um grande incômodo. Se o GFS e toda a sua infraestrutura de suporte for uma opção, o drbd no modo multimestre (eles chamam de "dual primário") pode funcionar bem. https://www.drbd.org/en/doc/users-guide-83/s-dual-primary-mode para obter mais informações sobre isso.

Independentemente da direção que você seguir, você poderá descobrir que isso ainda é uma dor bastante grande para fazer em tempo real, sem apenas dar a uma empresa de SAN um caminhão cheio de dinheiro.

dannysauer
fonte
Estou nos estágios iniciais da migração dos comandos rsync no cron para o uso de um sistema de arquivos distribuído. Se o Gluster executar stat () em todos os tijolos, talvez seja necessário reconsiderá-lo como uma solução.
Jesusaur
1
Esse é apenas o caso em um sistema de arquivos replicado; é executado stat()em todos os tijolos que possuem réplicas do bloco específico que você está vendo. Por exemplo, se você tiver uma réplica listrada 2x2, ela statserá executada nos dois tijolos com o bloco replicado, mas não nos outros dois. No meu aplicativo com muitos arquivos pequenos (da ordem de um milhão de arquivos abaixo de 4K de dados cada), nem o NFS nem o FUSE forneceram bom desempenho em volumes replicados. E a georeplicação para ~ 20 máquinas não era confiável em várias configurações.
precisa saber é o seguinte
1
Sua milhagem pode variar, mas mudei do Gluster em qualquer lugar (que eu estava usando exclusivamente para replicação, não para todas as outras coisas realmente legais que o Gluster realmente faz bem) para sincronizar em sistemas de arquivos nativos. :) Estou pensando em mudar para lsyncd ( github.com/axkibe/lsyncd ) agora em vez de cron, para que eu possa chegar quase em tempo real sem a sobrecarga do Gluster.
precisa saber é o seguinte
0

Mudei de rsync para ceph com a ajuda da instalação do Proxmox VE.

Agora, estou gerenciando 14 TB em um cluster com replicação ao vivo. Por quase 4 anos.

Deepen Dhulla
fonte