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.
rsync
no modo daemon? Isso acelerará a geração inicial da lista de arquivos ao executar orsync
comando, mas consumirá muita RAM, dependendo da quantidade de arquivos.btrfs
ouzfs
pode ser uma opção, combinada com uma tarefa cron para criar snapsnots e /zfs send
oubtrfs send
para 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.rsync -a
uso de daemon (na fonte) leva 200 minutos para ser concluído, o que é mais do que o aceitável. @cas:btrfs send
pode 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.Respostas:
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.
fonte
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, elastat
será 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.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.
fonte