Temos uma estrutura de pastas em nossa intranet que contém cerca de 800.000 arquivos divididos em cerca de 4.000 pastas. Precisamos sincronizar isso com um pequeno cluster de máquinas em nossas DMZs. A profundidade da estrutura é muito rasa (nunca excede dois níveis).
A maioria dos arquivos nunca muda, todos os dias existem alguns milhares de arquivos atualizados e 1-2 mil novos arquivos. Os dados são dados históricos de relatórios sendo mantidos onde os dados de origem foram limpos (ou seja, são relatórios finalizados para os quais os dados de origem são suficientemente antigos para arquivá-los e excluí-los). A sincronização uma vez por dia é suficiente, pois isso pode ocorrer em um período de tempo razoável. Os relatórios são gerados da noite para o dia e sincronizamos a primeira coisa da manhã como uma tarefa agendada.
Obviamente, como poucos arquivos são alterados regularmente, podemos nos beneficiar muito com a cópia incremental. Tentamos o Rsync, mas isso pode levar de oito a doze horas apenas para concluir a operação "lista de arquivos de construção". É claro que estamos superando rapidamente o que o rsync é capaz (o período de 12 horas é muito longo).
Estávamos usando outra ferramenta chamada RepliWeb para sincronizar as estruturas e ela pode fazer uma transferência incremental em cerca de 45 minutos. No entanto, parece que excedeu seu limite, ele começou a ver os arquivos sendo exibidos como exclusões quando não estão (talvez alguma estrutura de memória interna tenha sido esgotada, não temos certeza).
Alguém mais se deparou com um projeto de sincronização em larga escala desse tipo? Existe algo projetado para lidar com estruturas de arquivos maciças como esta para sincronização?
fonte
Respostas:
Se você pode confiar nos carimbos de data e hora da última modificação do sistema de arquivos, pode acelerar as coisas combinando o Rsync com o utilitário 'find' do UNIX / Linux. O 'find' pode montar uma lista de todos os arquivos que mostram os horários da última modificação nos últimos dias e depois canalizar APENAS essa lista reduzida de arquivos / diretórios para o Rsync. Isso é muito mais rápido do que o Rsync comparar os metadados de cada arquivo no remetente com o servidor remoto.
Em resumo, o seguinte comando executará o Rsync SOMENTE na lista de arquivos e diretórios que foram alterados nas últimas 24 horas: (o Rsync NÃO se preocupará em verificar outros arquivos / diretórios.)
Caso você não esteja familiarizado com o comando 'find', ele se repete através de uma subárvore de diretório específica, procurando arquivos e / ou diretórios que atendam aos critérios especificados. Por exemplo, este comando:
será iniciado no diretório atual (".") e será repetido em todos os subdiretórios, procurando:
Ele imprime o nome do caminho completo ("-print") de qualquer coisa que corresponda a esses critérios na saída padrão. As opções '-name', '-type' e '-ctime' são chamadas de "testes" e a opção '-print' é chamada de "ação". A página de manual para 'find' possui uma lista completa de testes e ações.
Se você quiser ser realmente inteligente, poderá usar o teste '-newer' do comando 'find', em vez de '-ctime' para tornar esse processo mais tolerante a falhas e flexível. '-cnewer' testa se cada arquivo / diretório na árvore teve seus metadados modificados mais recentemente do que algum arquivo de referência. Use 'touch' para criar o arquivo de referência da próxima execução no início de cada execução, logo antes de 'localizar ... | O comando rsync ... 'é executado. Aqui está a implementação básica:
Esse script sabe automaticamente quando foi a última execução e só transfere arquivos modificados desde a última execução. Embora isso seja mais complicado, ele protege você contra situações nas quais você pode ter perdido a execução do trabalho por mais de 24 horas, devido a tempo de inatividade ou algum outro erro.
fonte
touch $next_ref_file
no final? Isso nos deixa sem a capacidade de lidar com caminhos excluídos (mesmo esses relatórios estáticos de arquivamento acabam ficando velhos o suficiente para serem arquivados e excluídos). Isso pode não ser um obstáculo para o show.find . -ctime 0
é muito lento nessa estrutura de diretórios (ainda estou aguardando a conclusão para relatar seu tempo). Isso realmente me desanima um pouco, porque parece que essa pode ser uma operação de nível bastante baixo, que provavelmente define a fasquia para o mais rápido que poderíamos esperar que esse trabalho fosse concluído. Pode ser que a E / S do disco seja o fator limitante aqui.Experimente o uníssono , ele foi projetado especificamente para resolver esse problema, mantendo as listas de alterações (lista de arquivos de construção), localmente em cada servidor, acelerando o tempo para calcular o delta e a quantidade reduzida que é enviada posteriormente pela conexão.
fonte
http://oss.linbit.com/csync2/ foi projetado para esse tipo de coisa, eu daria uma chance.
fonte
Se você estiver usando a opção -z no rsync, tente executar sem ela. Por alguma razão, eu já vi isso acelerar até a enumeração inicial de arquivos.
fonte
Tirar -z do comando rsync, que não é compactação, fez com que a "lista de arquivos de recebimento" fosse muito mais rápida e tivemos que transferir cerca de 500 GB. Antes de levar um dia com a opção -z.
fonte