He estado tratando de encontrar una mejor herramienta de línea de comandos para duplicar depósitos que s3cmd . s3cmd
puede 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 s3cmd
pudiera 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?
amazon-web-services
amazon-s3
Sean McCleary
fuente
fuente
Respuestas:
AWS CLI parece hacer el trabajo a la perfección y tiene la ventaja de ser una herramienta con soporte oficial.
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_requests
para reducir el impacto de la latencia. P.ej:fuente
Si no le importa usar la consola de AWS, puede:
Todavía es bastante lento, pero puede dejarlo solo y dejar que haga lo suyo.
fuente
Intenté clonar dos depósitos con la consola web de AWS,
s3cmd
y 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/
fuente
Para la solución ad hoc, use
aws cli
para sincronizar entre depósitos:aws s3 sync
la 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 sync
desde 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.
fuente
awscli
documento:aws sync
copie solo archivos nuevos y actualizados. probablemente debería esperar un alto rendimiento conaws 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)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
fuente
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.
fuente
un simple
aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursive
funciona bien (suponiendo que tenga la configuración de AWS CLI)fuente