Duplicación de cubos s3 más rápida

93

He estado tratando de encontrar una mejor herramienta de línea de comandos para duplicar depósitos que s3cmd . s3cmdpuede duplicar depósitos sin tener que descargar y cargar cada archivo. El comando que normalmente ejecuto para duplicar depósitos usando s3cmd es:

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

Esto funciona, pero es muy lento ya que copia cada archivo a través de la API de uno en uno. Si s3cmdpudiera funcionar en modo paralelo, estaría muy feliz.

¿Hay otras opciones disponibles como herramientas de línea de comandos o código que la gente usa para duplicar depósitos que son más rápidos que s3cmd?

Editar: Parece que la modificación de s3cmd es exactamente lo que estoy buscando. Lástima que no funcione. ¿Hay más opciones?

Sean McCleary
fuente
6
No estoy seguro de por qué esta pregunta se cierra repetidamente, ya que parece que varios desarrolladores se han encontrado con ella. De todos modos, lo resolví de manera muy paralela, aquí está el enlace: github.com/cobbzilla/s3s3mirror ¡gracias! - Jonathan.
cobbzilla

Respuestas:

166

AWS CLI parece hacer el trabajo a la perfección y tiene la ventaja de ser una herramienta con soporte oficial.

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

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

Admite transferencias simultáneas de forma predeterminada. Ver http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

Para transferir rápidamente una gran cantidad de archivos pequeños, ejecute el script desde una instancia EC2 para disminuir la latencia y aumente max_concurrent_requestspara reducir el impacto de la latencia. P.ej:

aws configure set default.s3.max_concurrent_requests 200
python1981
fuente
4
Soporta sincronización no concurrente basada en el tiempo de modificación del archivo, tamaño, etc. Fue increíblemente rápido cuando lo probé. Creo que los objetos se copian directamente en S3 sin descargarlos a la máquina local. No se ejecuta en paralelo de forma predeterminada, pero estoy seguro de que podría tener varios comandos de sincronización ejecutándose en subcarpetas separadas al mismo tiempo. Es lo suficientemente rápido como para que probablemente no necesite que se ejecute en paralelo de todos modos. Acabo de duplicar 100 GB de datos en unos minutos.
python1981
11
Lento como el infierno si la cantidad de archivos es alta.
Phương Nguyễn
14
Cuando se transfieren muchos archivos pequeños, la latencia se convierte en la restricción clave, por lo que ejecutar este comando desde una instancia EC2 es esencial.
python1981
1
Usé
Gordon Sun
3
Ahora
python1981
70

Si no le importa usar la consola de AWS, puede:

  1. Seleccione todos los archivos / carpetas en el primer depósito
  2. Haga clic en Acciones> Copiar
  3. Crea un nuevo depósito y selecciónalo
  4. Haga clic en Acciones> Pegar

Todavía es bastante lento, pero puede dejarlo solo y dejar que haga lo suyo.

muertos
fuente
¿Se está copiando el contenido del depósito de origen en mi máquina mientras se copia en el destino? Hay mucha actividad en la red y el inspector del navegador es extremadamente lento, por lo que es difícil de analizar. 600K / s en mi máquina. Entonces, esto sería mucho más rápido iniciar la transferencia dentro de la red de Amazon ... Lo intentaré allí.
Brad Goss
9
Acabo de usar este método hoy. No transfiere los archivos a su máquina local, hace una copia directa y es mucho, mucho más rápido.
Greg Benedict
7
Todavía recupera la lista de archivos. Si la lista es demasiado larga (docenas de miles de archivos en mi caso), entonces es muy lento. Y el tiempo de espera / bloqueo es extremadamente probable
Phương Nguyễn
13
Desafortunadamente, este proceso está vinculado al navegador. :( De los documentos : "Después de iniciar el proceso de copia, debe mantener el navegador abierto mientras la copia está en curso".
David Lemayian
4
Estoy tratando de hacer esto en un depósito con 8 millones de archivos. No sé cuántos meses me llevará seleccionar todas las casillas de verificación ...
Chris Harrison
28

Intenté clonar dos depósitos con la consola web de AWS, s3cmdy la AWS CLI. Aunque estos métodos funcionan la mayor parte del tiempo, son dolorosamente lentos.

Luego encontré s3s3mirror: una herramienta especializada para sincronizar dos cubos de S3. Es multiproceso y mucho más rápido que los otros enfoques que he probado. Moví rápidamente Giga-bytes de datos de una región de AWS a otra.

Compruébelo en https://github.com/cobbzilla/s3s3mirror , o descargue un contenedor Docker desde https://registry.hub.docker.com/u/pmoust/s3s3mirror/

Ketil
fuente
1
Si tiene muchos archivos para transferir, esta es, con mucho, la mejor herramienta para el trabajo. Es una pena que esté tan abajo en la lista de respuestas ...
John Chrysostom
Nota para algunas personas: Requiere Java 6/7 para compilar.
Brian
1
¡Estoy usando esto desde una instancia EC2 y funciona increíblemente rápido! Tuve que reemplazar <source-bucket> y <destination-bucket> con el nombre real del bucket (no el punto final o algo parecido en la AWS CLI).
ironmouse
1
Increíble herramienta, muy recomendada sobre otras, para gran cantidad de archivos. El control sobre el número de subprocesos de copia es brillante.
Shaunak
¿No cree que es más seguro utilizar aws-cli y no aplicaciones de terceros para hacer el trabajo? Después de todo, necesitamos proporcionar credenciales o claves de acceso para usar estas herramientas.
Keet Sugathadasa
10

Para la solución ad hoc, use aws clipara sincronizar entre depósitos:

aws s3 syncla velocidad depende de:
- latencia para una llamada API al punto final S3
- cantidad de llamadas API realizadas en

Para aumentar la velocidad de sincronización:
- ejecutar aws s3 syncdesde una instancia de AWS (c3.large en FreeBSD está bien ;-))
- actualizar ~ / .aws / config con:
- max_concurrent_requests = 128
-max_queue_size = 8096

con la siguiente configuración y el tipo de instancia, pude sincronizar el depósito (309 GB, archivos de 72 K, us-east-1) en 474 segundos.

Para una solución más genérica, considere: AWS DataPipeLine o replicación entre regiones de S3.

Tom Lime
fuente
¿Sabes si podría esperar el mismo rendimiento si usara S3 cp? ¿Estás seguro de que cuando usaste la sincronización, realmente transfirió los 309 GB? sync solo sincronizará archivos que no sean iguales o que estén presentes en el otro depósito.
helado
Además, ¿qué piensa sobre esto para un caso de uso en el que tengo 1k o menos archivos, pero son más grandes (10gb)? ¿Crees que vería un desempeño similar al tuyo?
helado
@frosty, en mi caso, el depósito de destino estaba vacío. por awsclidocumento: aws synccopie solo archivos nuevos y actualizados. probablemente debería esperar un alto rendimiento con aws cp(la copia se realiza internamente, su cliente simplemente emite una llamada a la API). el rendimiento depende de estos factores: 1. latencia entre las regiones src y dst (por ejemplo, us-east-X a us-west-X) 2. latencia entre su cliente y el punto final de la API de AWS (qué tan rápido puede emitir una llamada a la API) 3. cantidad de solicitudes simultáneas (cuántas solicitudes por segundo puede emitir su cliente). En mi caso, 309G se copió entre cubos en la misma región (us-east-1)
Tom Lime
3

Como se trata del primer éxito de Google en este tema, agregando información adicional.

'Cyno' creó una versión más reciente de la modificación s3cmd, que ahora admite la sincronización de cubo a cubo en paralelo. Exactamente lo que estaba esperando también.

La solicitud de extracción está en https://github.com/pcorliss/s3cmd-modification/pull/2 , su versión en https://github.com/pearltrees/s3cmd-modification

Jean-Pierre Deckers
fuente
La modificación de s3cmd me ahorró días de copiar.
GAK
2

No conozco ninguna otra herramienta de línea de comandos de S3, pero si no surge nada aquí, podría ser más fácil escribir la suya propia.

Elija el idioma y el kit de herramientas / SDK de Amazon que prefiera. Entonces solo necesita enumerar / recuperar el contenido del depósito de origen y copiar cada archivo (en paralelo, obviamente)

Mirando la fuente de la modificación de s3cmd (y admito que no sé nada sobre Python), parece que no han paralelizado el código de cubo a cubo, pero tal vez podría usar el código paralelo de carga / descarga estándar como punto de partida para hacer esto.

Geoff Appleford
fuente
Si. He estado jugando con esta idea y escribiéndola en rubí de manera uniforme con la máquina de eventos o enhebrada con JRuby. Sin embargo, s3cmd ya está bastante completo y prefiero usarlo. He estado hablando con el desarrollador de s3cmd, y él tiene un par de soluciones en proceso que probablemente abordarán problemas de rendimiento.
Sean McCleary
1

un simple aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursivefunciona bien (suponiendo que tenga la configuración de AWS CLI)

mdmjsh
fuente