Crea secuencias de comandos de transferencias de producción

Descripción general

Si usas gsutil en tareas de producción grandes (como subir o descargar muchos GiB de datos cada noche), tienes varias opciones para garantizar un resultado exitoso. En esta sección, se analiza en concreto cómo ejecutar secuencias de comandos para tareas de producción grandes relacionadas con el mecanismo de transferencia reanudable de gsutil.

Información general sobre transferencias reanudables

Primero, es útil comprender el mecanismo de transferencia reanudable de gsutil y cómo se debe implementar la secuencia de comandos a este mecanismo para trabajar de manera confiable. gsutil usa la compatibilidad con la transferencia reanudable cuando intentas descargar un archivo de cualquier tamaño o subir un archivo más grande que el límite que se puede configurar (de forma predeterminada, este límite es de 8 MiB). Si parte de la transferencia falla (p. ej., debido a un problema de red intermitente), gsutil usa una estrategia de retirada y reintento exponencial truncada, binaria y aleatoria que, de forma predeterminada, volverá a intentar realizar las transferencias 23 veces durante un período de 10 minutos (consulta reintentos de ayuda de gsutil para obtener más información). Si la transferencia falla en cada uno de estos intentos sin progreso intermedio, gsutil abandona la transferencia, pero mantiene un archivo de “seguimiento” en una ubicación que se pueda configurar (la ubicación predeterminada es ~/.gsutil/) en un archivo cuyo nombre está conformado por la combinación del hash SHA1 del nombre del depósito y del objeto que se transferirá y los últimos 16 caracteres del nombre del archivo). Cuando las transferencias fallan de esta manera, puedes volver a ejecutar gsutil en algún momento más adelante (p. ej., después de que se haya resuelto el problema de la red) y la transferencia reanudable continúa desde donde se detuvo.

Tareas de transferencia de datos de secuencias de comandos

Para ejecutar una secuencia de comandos de tareas de transferencia de datos de producción grandes en este mecanismo, puedes implementar una secuencia de comandos que se ejecute de forma periódica que determine qué transferencias de archivos aún no se realizaron de forma correcta y que ejecute gsutil para copiarlas. A continuación, ofrecemos una serie de sugerencias sobre cómo se debe implementar este tipo de secuencia de comandos:

  1. Cuando las transferencias reanudables fallan sin ningún progreso 23 veces seguidas en un transcurso de hasta 10 minutos, es probable que no funcione con tan solo reintentar la transferencia de inmediato. Una estrategia más exitosa sería tener un trabajo cron que se ejecute cada 30 minutos y que determine qué transferencias deben ejecutarse y las ejecute. Si la red experimenta problemas intermitentes, la secuencia de comandos continuará desde donde se detuvo y, al final, se completará (una vez que se haya resuelto el problema de red).

  2. Si tu empresa depende de que la transferencia de datos se realice a tiempo, deberías considerar implementar una supervisión de red. Por ejemplo, puedes implementar una tarea que intente realizar una descarga pequeña cada pocos minutos y genere una alerta si el intento falla en varios intentos seguidos (o con mayor o menor frecuencia según tus requisitos) para que el personal de TI pueda investigar los problemas a la brevedad. Como suele suceder con las implementaciones de supervisión, debes experimentar con los límites de alerta a fin de evitar alertas de falsos positivos que hagan que tu personal empiece a ignorar las alertas.

  3. Existen varias formas de determinar qué archivos aún quedan por transferir. Te recomendamos que no intentes obtener una lista completa de un depósito que contenga muchos objetos (p. ej., decenas de miles o más). Una estrategia es estructurar los nombres de objetos de una manera que represente el proceso de transferencia y usar comodines de prefijo de gsutil para solicitar listas de depósitos parciales. Por ejemplo, si el proceso periódico involucra la descarga de los objetos del día actual, puedes nombrar los objetos mediante un formato de año-mes-día-objeto-ID y, luego, encontrar los objetos de hoy mediante un comando como gsutil ls “gs://bucket/2011-09-27-*”. Ten en cuenta que es más eficaz tener un prefijo no comodín como este que usar algo como gsutil ls “gs://bucket/*-2011-09-27”. Con el último comando, se solicita una lista completa de depósitos y luego se filtra en gsutil, mientras que con el primero, se le pide a Google Storage que muestre el subconjunto de objetos cuyos nombres comienzan con todo lo que esté antes de “*”.

    Para las cargas de datos, otra técnica sería mover los archivos locales de un área “que se procesará” a un área “ya procesada”, ya que la secuencia de comandos copia de forma correcta los archivos a la nube. Puedes hacerlo en lotes paralelos mediante un comando como el siguiente:

    gsutil -m cp -r to_upload/subdir_$i gs://bucket/subdir_$i
    

    En el comando anterior, i es una variable de bucle de shell. Asegúrate de verificar que la variable de shell $status sea 0 después de cada comando gsutil cp, para detectar si algunas de las copias fallaron, y vuelve a ejecutar las copias afectadas.

    Con esta estrategia, el sistema de archivos realiza un seguimiento de todo el trabajo que queda por hacer.

  4. Si tienes una gran cantidad de objetos en un solo depósito (por ejemplo, cientos de miles o más), deberías considerar hacer un seguimiento de los objetos en una base de datos, en lugar de usar listas de depósitos para enumerar los objetos. Por ejemplo, esta base de datos podría realizar un seguimiento del estado de las descargas, por lo que puedes determinar qué objetos debe descargar la secuencia de comandos de descarga periódica si consultas la base de datos de forma local en lugar de realizar una lista de depósitos.

  5. Asegúrate de no borrar los archivos temporales descargados de forma parcial después de una falla: gsutil continúa desde donde se detuvo (y realiza un hash del contenido final descargado para garantizar la integridad de los datos). Por lo tanto, si borras los archivos transferidos de forma parcial, se perderá el progreso y se desaprovechará el uso de tu red.

  6. Si tienes una conexión de red rápida, puedes acelerar la transferencia de grandes cantidades de archivos mediante la opción gsutil -m (multisubprocesos o multiprocesamiento). Sin embargo, ten en cuenta que gsutil no intenta realizar un seguimiento de cuáles son los archivos que se descargaron de forma correcta en caso de que algunos archivos no se hayan descargado. Por ejemplo, si usas transferencias de multisubprocesos para descargar 100 archivos, y 3 no se pudieron descargar, dependerá del proceso de secuencias de comandos determinar qué transferencias no se realizaron de forma correcta y volver a intentarlo. Este caso se podría controlar mediante un enfoque periódico de verificación y ejecución como el que se describió antes.

    Si usas transferencias paralelas (gsutil -m), es posible que desees experimentar con la cantidad de subprocesos que se usan (a través de la configuración parallel_thread_count setting en el archivo de configuración .boto). De forma predeterminada, gsutil usa 10 subprocesos para Linux y 24 subprocesos para otros sistemas operativos. Según la velocidad de tu red, la memoria disponible, la carga de la CPU y otras condiciones, esto puede o no ser óptimo. Intenta experimentar con una mayor o menor cantidad de subprocesos para encontrar la mejor cantidad de subprocesos para tu entorno.