Processo confiável de cópia de arquivos (move) - principalmente Unix / Linux

3

Breve história: Precisamos de um processo confiável de movimentação de arquivos confiável. Nós temos diretórios de origem que estão sendo escritos para o que precisamos para mover arquivos. Os arquivos vêm em pares - um grande binário e um pequeno índice XML. Obtemos um arquivo CTL que define esses pacotes de arquivos. Existe um processo que opera nos arquivos quando eles estão no diretório de destino; que se livrar deles quando estiver pronto. O rsync faria o melhor trabalho, ou precisamos nos tornar mais complexos? Longa história da seguinte forma:

Temos várias origens para extrair: um conjunto de diretórios está em uma máquina Windows (que tem Cygwin e um daemon SSH) e uma pilha inteira de diretórios está em um conjunto de servidores SFTP (a maioria deles também é Windows.) Nossos destinos são uma lista de diretórios nos servidores AIX.

Costumávamos usar um script Perl muito confiável na máquina Windows / Cygwin quando era nossa única fonte. No entanto, estamos trabalhando para nos livrar dessa máquina, e agora existem outras fontes, os servidores SFTP, nos quais não podemos executar nossos próprios scripts.

Por motivos de segurança, não podemos executar os trabalhos de cópia em nossos servidores AIX - eles não têm acesso aos servidores de origem. Atualmente, temos um programa Java caseiro em uma máquina Linux que usa o SFTP para extrair vários diretórios de origem do SFTP, copia para um diretório tmp local, verifica se tudo está presente, copia isso para as máquinas AIX e exclui os arquivos da fonte. No entanto, estamos encontrando vários erros ou erros na verificação de erros. Nenhum de nós é especialista em Java, então consertar / melhorar isso pode ser difícil.

As preocupações para nós são:

  • Com uma fonte remota (SFTP), o rsync deixará sozinho qualquer arquivo ainda sendo gravado? Alguns desses arquivos são grandes.
  • Ao ler os documentos, parece que o rysnc será muito bom em não remover a origem até que o destino seja gravado de forma confiável. Alguém tem experiência em confirmar ou refutar isso?
  • Informações adicionais Nós nos preocuparemos com o processo de processamento que opera nos arquivos quando eles estiverem no diretório de destino. Não queremos que ele funcione em arquivos enquanto estamos no processo de copiá-los; aguarda até que o pequeno arquivo de índice XML esteja presente. Nosso trabalho de cópia atual deve copiar o arquivo XML por último.
  • Às vezes, a rede tem problemas, às vezes os servidores de origem do SFTP nos enganam. Às vezes nós digitamos os arquivos de configuração e um diretório de destino não existe. Nós nunca queremos perder um arquivo devido a este tipo de erro.
  • Precisamos de bons registros

Se você fosse presenteado com isso, você criaria um script rsync? Ou você construiria ou compraria uma ferramenta e, em caso afirmativo, qual seria (ou quais tecnologias ela usaria?) Eu (e outros da minha equipe) somos decentes com o Perl.

    
por mfinni 30.12.2010 / 17:00

1 resposta

3

Editar: O Rsync faz uma verificação de ponta a ponta: depois que o arquivo é transferido, ele calcula a soma de verificação do arquivo no destino e o compara à soma de verificação na origem. Quando as somas de verificação coincidem, somente então declara a transferência bem-sucedida. Isso é refletido no código de status de saída final - se TODOS os arquivos transferidos passarem no teste, o código de saída será 0 (Êxito).

Em uma configuração semelhante, criei minha própria solução baseada em rsync. Foi para backups noturnos e não excluímos arquivos automaticamente.

Para resolver algumas das suas preocupações:

  • O Rsync nunca modifica nada no lado da origem (a menos que você use a opção --remove-source-files ).
  • Se a rede ficar inativa por muito tempo, o Rsync desistirá e dará um status de saída adequado . Eu verifico isso no meu script e para códigos de saída específicos (o que eu observei na prática por registro) Eu tenho o script re-tente o comando rsync até 3 vezes.
  • Sim, seu script deve registrar o máximo possível. Carimbo de data / hora, Tempo de execução total, status de existência de Rsync, saída de estatísticas de Rsync (valor transmitido). Eu também executo find no final da transferência para contar o número de arquivos e du * para obter tamanhos de diretórios e registrá-los.

Basicamente, você precisa cuidar de algumas coisas no script. Principalmente: Coletando o status de saída, algumas estatísticas e removendo os arquivos de origem em uma transferência bem-sucedida.

Você pode confiar no status de saída do rsync de que todos os arquivos solicitados foram transferidos, mas você deve pensar em quanto você confia no script para fornecer ao rsync os arquivos corretos (diretório de origem) antes de excluí-los na máquina de origem. Talvez contar os arquivos com find na origem e, em seguida, no destino (e verificar se esses números correspondem) seria uma boa verificação final antes que o script exclua os arquivos automaticamente.

Dê 10 a 20 tentativas para desenvolver e testar seu roteiro. Você precisaria instalar o Cygwin com clientes rsync e ssh nas máquinas Windows.

É bom se sentir confidente sobre um aplicativo como esse, sabendo exatamente como ele funciona. Eu nunca usei um software de backup comercial - mas se você pode encontrar um sólido e confiar nele - então vá para isso - você pode economizar muito tempo.

    
por 30.12.2010 / 17:27