Método mais eficiente para sincronizar um número muito grande de arquivos

3

Eu tenho um grande diretório que precisa ser sincronizado de um servidor local para o meu servidor web e estou procurando o método mais eficiente de fazer isso. Este diretório contém 113k arquivos em diretórios de 14k e tem aproximadamente 5GB de tamanho. A comparação local para remota de cada arquivo / diretório leva várias horas para ser concluída, mesmo com pequenas alterações.

A máquina local é o Win7, o remoto é o CentOS 5.5

Meu setep atual está usando uma sincronização de script com o WinSCP, mas, como dito, o rastreamento pelos diretórios em uma única conexão SCP está demorando horas. O número de arquivos que requerem atualização deve ser muito menor que o conjunto geral e eu gostaria de encontrar uma maneira de fazer o script da sincronização localmente, registrando quais arquivos foram alterados e, em seguida, apenas atingindo o servidor da Web para o upload dos novos arquivos .

Alguma sugestão?

    
por Infraded 15.03.2011 / 20:04

3 respostas

5

Dê uma olhada em Deltacopy ou Syncrify , ambos baseados no protocolo rsync. Eles só transferem arquivos que foram alterados ou são novos, etc. Mais importante, eles só transferem os blocos alterados de arquivos grandes. O Rsync provavelmente já estará instalado na sua máquina Centos

    
por 15.03.2011 / 20:10
1
O

Unison é outra possibilidade. A parte importante é obter algo que você pode executar no servidor via SSH e permitir que o processo do lado do servidor manipule a E / S de disco nesse ponto, em vez de percorrer todo o sistema de arquivos remotamente. O Unison pode ser executado via ssh e usa o algoritmo rsync para transferir somente partes alteradas de arquivos.

    
por 15.03.2011 / 20:47
1

Se as alterações estão ocorrendo apenas localmente (ou seja, uma sincronização unidirecional), você pode pensar apenas em usar um arquivador (zip, tar, etc) para arquivar os arquivos modificados para transporte até o servidor remoto. Presumivelmente, você pode usar a data de modificação, o bit de arquivamento ou, no pior dos casos, manter uma segunda cópia local para usar como base para determinar quais arquivos foram alterados.

O rsync e outros programas de cópia delta são legais, mas eu suspeito que o seu problema pode ser simples o suficiente para resolver sem chegar a esse extremo. Com um grande número de arquivos pequenos, você também passará por muitos atrasos usando o rsync devido à latência.

Como sua origem é uma máquina Windows, você pode usar o bit "Archive" como um indicador para quais arquivos foram modificados (assumindo que o processo de atualização está alterando o bit de archive). Você poderia fazer algo simples como:

@echo off
set SRC=C:\source
set STAGING=C:\staging

rem Copy all files from source to staging, including subdirectories,
rem where "Archive" bit is set.
xcopy "%SRC%\*" "%STAGING%\" /e /s /a

rem Untick archive bit on all files in source
attrib /S /D -A "%SRC%\*"

Isso deixaria o diretório "staging" preenchido apenas com os arquivos que foram alterados (embora com subdiretórios vazios para todos os diretórios onde os arquivos não foram alterados também). Ele também redefiniria o bit de arquivamento em todos os arquivos em todas as subpastas. Você poderia zerar o diretório de preparação (usando seu programa ZIP de linha de comando favorito) e enviá-lo para o servidor remoto para descompactação.

Isso não oferece nenhuma compactação delta, mas em um tamanho médio de 51KB / arquivo, parece que a compactação delta não ajuda muito e a latência "win" desse método simplista pode ser melhor para você.

    
por 15.03.2011 / 20:33