Duplicação mais rápida de balde s3

93

Tenho tentado encontrar uma ferramenta de linha de comando melhor para duplicar baldes do que s3cmd . s3cmdpode duplicar baldes sem ter que baixar e carregar cada arquivo. O comando que normalmente executo para duplicar intervalos usando s3cmd é:

s3cmd cp -r --acl-public s3://bucket1 s3://bucket2

Isso funciona, mas é muito lento, pois copia cada arquivo por meio da API, um de cada vez. Se s3cmdpudesse rodar em modo paralelo, ficaria muito feliz.

Existem outras opções disponíveis como ferramentas de linha de comando ou código que as pessoas usam para duplicar depósitos mais rápidos do que s3cmd?

Edit: Parece que s3cmd-modify é exatamente o que estou procurando. Pena que não funciona. Existem outras opções?

Sean McCleary
fonte
6
Não sei por que essa questão está sendo repetidamente fechada, uma vez que parece que vários desenvolvedores se depararam com ela. De qualquer forma, resolvi de forma altamente paralela, aqui está o link: github.com/cobbzilla/s3s3mirror obrigado! - Jonathan.
cobbzilla

Respostas:

166

O AWS CLI parece fazer o trabalho perfeitamente e tem a vantagem de ser uma ferramenta com suporte oficial.

aws s3 sync s3://mybucket s3://backup-mybucket

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

Suporta transferências simultâneas por padrão. Consulte http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

Para transferir rapidamente um grande número de arquivos pequenos, execute o script de uma instância EC2 para diminuir a latência e aumente max_concurrent_requestspara reduzir o impacto da latência. Por exemplo:

aws configure set default.s3.max_concurrent_requests 200
python1981
fonte
4
Ele oferece suporte à sincronização não simultânea com base no tempo de modificação do arquivo, tamanho, etc. Foi muito rápido quando tentei. Acredito que os objetos são copiados diretamente no S3 sem baixá-los para a máquina local. Ele não é executado em paralelo por padrão, mas tenho certeza de que você poderia ter vários comandos de sincronização em subpastas separadas ao mesmo tempo. É rápido o suficiente para que você provavelmente não precise executá-lo em paralelo. Acabei de duplicar 100 GB de dados em alguns minutos.
python1981
10
Lento como o inferno se o número de arquivos for alto.
Phương Nguyễn
14
Ao transferir muitos arquivos pequenos, a latência se torna a principal restrição, portanto, a execução desse comando a partir de uma instância do EC2 é essencial.
python1981
1
Eu usei isso para construir um docker e funciona muito bem github.com/sunshineo/s3-bucket-copier
Gordon Sun
3
Agora ele suporta a sincronização simultânea :-) docs.aws.amazon.com/cli/latest/topic/…
python1981
70

Se você não se importa em usar o console AWS, pode:

  1. Selecione todos os arquivos / pastas no primeiro intervalo
  2. Clique em Ações> Copiar
  3. Crie um novo intervalo e selecione-o
  4. Clique em Ações> Colar

Ainda é bastante lento, mas você pode deixá-lo sozinho e deixá-lo fazer seu trabalho.

morto
fonte
Isso está copiando o conteúdo do intervalo de origem para minha máquina enquanto copia para o destino? Há muita atividade de rede e o inspetor de navegador é extremamente lento, por isso é difícil de analisar. 600K / s na minha máquina. Isso seria muito mais rápido iniciar a transferência dentro da rede amazon ... Vou tentar lá.
Brad Goss
9
Acabei de usar esse método hoje. Ele não puxa os arquivos para sua máquina local - faz uma cópia direta e é muito, muito mais rápido.
Greg Benedict
7
Ele ainda busca a lista de arquivos. Se a lista for muito longa (dezenas de milhares de arquivos no meu caso), ela é lenta como o diabo. E o tempo limite / travamento é extremamente provável
Phương Nguyễn
13
Infelizmente, esse processo está vinculado ao navegador. :( Dos documentos : "Após iniciar o processo de cópia, você deve manter o navegador aberto enquanto a cópia está em andamento."
David Lemayian
4
Estou tentando fazer isso em um balde com 8 milhões de arquivos nele. Não sei quantos meses vou levar para selecionar todas as caixas de seleção ...
Chris Harrison
27

Tentei clonar dois baldes usando o console da web da AWS, o s3cmde o AWS CLI. Embora esses métodos funcionem na maioria das vezes, eles são dolorosamente lentos.

Então eu descobri s3s3mirror: uma ferramenta especializada para sincronizar dois buckets S3. É multi-threaded e muito mais rápido do que as outras abordagens que experimentei. Mudei rapidamente Giga-bytes de dados de uma região da AWS para outra.

Confira em https://github.com/cobbzilla/s3s3mirror ou baixe um contêiner Docker em https://registry.hub.docker.com/u/pmoust/s3s3mirror/

Ketil
fonte
1
Se você tiver muitos arquivos para transferir, esta é de longe a melhor ferramenta para o trabalho. É uma pena que esteja tão longe na lista de respostas ...
John Chrysostom
Nota para algumas pessoas: requer Java 6/7 para compilar.
Brian,
1
Estou usando isso de uma instância EC2 e funciona incrivelmente rápido! Tive que substituir <source-bucket> e <destination-bucket> pelo nome real do bucket (não o endpoint ou algo como no AWS CLI).
ironmouse de
1
Ferramenta incrível, altamente recomendada em relação a outras, para grande número de arquivos. O controle sobre o número de threads de cópia é brilhante.
Shaunak
Você não acha que é mais seguro usar o aws-cli e não aplicativos de terceiros para fazer o trabalho? Afinal, precisamos fornecer credenciais ou chaves de acesso para usar essas ferramentas.
Keet Sugathadasa
10

Para solução ad hoc, use aws clipara sincronizar entre os intervalos:

aws s3 synca velocidade depende de:
- latência para uma chamada API para o endpoint S3
- quantidade de chamadas API feitas em simultâneo

Para aumentar a velocidade de sincronização:
- execute a aws s3 syncpartir de uma instância AWS (c3.large no FreeBSD está OK ;-))
- atualize ~ / .aws / config com:
- max_concurrent_requests = 128
-max_queue_size = 8096

com a seguinte configuração e tipo de instância, consegui sincronizar o intervalo (309 GB, 72K arquivos, us-east-1) em 474 segundos.

Para uma solução mais genérica, considere - AWS DataPipeLine ou replicação entre regiões S3.

Tom Lime
fonte
Você sabe se eu poderia esperar o mesmo desempenho se usasse S3 cp? Tem certeza de que quando você usou a sincronização, ele realmente transferiu todos os 309 GB? sync sincronizará apenas arquivos que não sejam iguais ou estejam presentes no outro intervalo.
gelado
Além disso, o que você acha disso para um caso de uso em que tenho arquivos de 1k ou menos, mas eles são maiores (10 gb)? Você acha que eu veria um desempenho semelhante ao seu?
gelado
@frosty, no meu caso, o balde de destino estava vazio. por awsclidocumento - aws synccopia apenas arquivos novos e atualizados. provavelmente você deve esperar alto desempenho com aws cp(a cópia é feita internamente, seu cliente apenas emite uma chamada de API). o desempenho depende destes fatores: 1. latência entre as regiões src e dst (por exemplo, us-east-X para us-west-X) 2. latência entre seu cliente e o endpoint da API AWS (quão rápido você pode emitir uma chamada de API) 3. quantidade de solicitações simultâneas (quantas solicitações por segundo seu cliente pode emitir). No meu caso, 309G foi copiado entre baldes na mesma região (us-east-1)
Tom Lime
2

Não conheço nenhuma outra ferramenta de linha de comando S3, mas se nada aparecer aqui, pode ser mais fácil escrever a sua própria.

Escolha o idioma e o Amazon SDK / Toolkit de sua preferência. Então você só precisa listar / recuperar o conteúdo do intervalo de origem e copiar cada arquivo (em paralelo, obviamente)

Olhando para o código - fonte para s3cmd-modify (e eu admito que não sei nada sobre python), parece que eles não paralelizaram o código bucket-to-bucket, mas talvez você possa usar o código paralelo de upload / download padrão como ponto de partida para faça isso.

Geoff Appleford
fonte
Sim. Eu tenho brincado com essa ideia e escrito em ruby ​​com a maneira evented com event machine ou encadeada com JRuby. No entanto, o s3cmd já está bem completo e prefiro apenas usá-lo. Tenho conversado com o desenvolvedor do s3cmd e ele tem algumas soluções em preparação que provavelmente resolverão problemas de desempenho.
Sean McCleary
1

um simples aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursivefunciona bem (supondo que você tenha uma configuração de aws cli)

mdmjsh
fonte