Migrar de Aerospike a Bigtable

En este tutorial se describe cómo migrar datos de Aerospike a Bigtable. En el tutorial se explican las diferencias entre Aerospike y Bigtable, así como la forma de transformar tu carga de trabajo para que se ejecute en Bigtable. Está dirigida a profesionales de bases de datos que buscan un servicio de bases de datos en Google Cloud similar a Aerospike. En este tutorial se da por supuesto que conoces los esquemas de bases de datos, los tipos de datos, los conceptos básicos de NoSQL y los sistemas de bases de datos relacionales. En este tutorial se utilizan tareas predefinidas para realizar una migración de ejemplo. Una vez que hayas completado el tutorial, puedes modificar el código y los pasos proporcionados para que se ajusten a tu entorno.

Bigtable es un servicio de base de datos NoSQL a escala de petabytes, totalmente gestionado y para grandes cargas de trabajo analíticas y operativas. Puedes usarlo como motor de almacenamiento para tu servicio de baja latencia y a escala de petabytes con mayor disponibilidad y durabilidad. Puedes analizar datos de Bigtable con Google Cloud servicios de analíticas de datos como Dataproc y BigQuery.

Bigtable es ideal para la tecnología publicitaria, la tecnología financiera y los servicios del Internet de las cosas (IoT) que se implementan con bases de datos NoSQL, como AeroSpike o Cassandra. Si buscas un servicio gestionado de NoSQL, usa Bigtable.

Arquitectura

En el siguiente diagrama de arquitectura de referencia se muestran los componentes comunes que puedes usar para migrar datos de Aerospike a Bigtable.

Componentes del proceso de transferencia de datos de Aerospike a Bigtable.

En el diagrama anterior, los datos se migran de un entorno local que usa Aerospike a Bigtable en Google Cloud mediante dos métodos diferentes. El primer método migra los datos mediante el procesamiento por lotes. Para ello, primero se mueven los datos de la copia de seguridad de Aerospike a un segmento de Cloud Storage. Cuando los datos de la copia de seguridad llegan a Cloud Storage, se activan las funciones de Cloud Run para iniciar un proceso de extracción, transformación y carga (ETL) por lotes mediante Dataflow. La tarea de Dataflow convierte los datos de la copia de seguridad a un formato compatible con Bigtable e importa los datos a la instancia de Bigtable.

El segundo método migra los datos mediante el procesamiento de streaming. En este método, te conectas a Aerospike mediante una cola de mensajes, como Kafka, con Aerospike Connect, y transfieres mensajes en tiempo real a Pub/Sub en Google Cloud. Cuando el mensaje llega a un tema de Pub/Sub, la tarea de streaming de Dataflow lo procesa en tiempo real para convertir e importar los datos en la instancia de Bigtable.

Con el procesamiento por lotes, puedes migrar grandes cantidades de datos de forma eficiente. Sin embargo, a menudo requiere un tiempo de inactividad suficiente para migrar y actualizar el servicio de las nuevas bases de datos. Si quieres minimizar el tiempo de inactividad durante el cambio, puedes usar el procesamiento de streaming para migrar los datos gradualmente después del primer procesamiento por lotes y mantener la coherencia de los datos de la copia de seguridad hasta que se complete el cambio. En este documento, puede migrar de Aerospike mediante el procesamiento por lotes con aplicaciones de ejemplo, incluido el proceso de cambio.

Comparación entre Aerospike y Bigtable

Antes de iniciar la migración de datos, es fundamental que conozca las diferencias entre los modelos de datos de Aerospike y Bigtable.

El modelo de datos de Bigtable es un mapa de clave-valor distribuido, multidimensional y ordenado con filas y familias de columnas. Por el contrario, el modelo de datos de Aerospike es una base de datos orientada a filas, donde cada registro se identifica de forma única mediante una clave. La diferencia entre los modelos es la forma en que agrupan los atributos de una entidad. Bigtable agrupa los atributos relacionados en una familia de columnas, mientras que Aerospike agrupa los atributos en un conjunto. Aerospike admite más tipos de datos que Bigtable. Por ejemplo, Aerospike admite enteros, cadenas, listas y mapas. Bigtable trata todos los datos como cadenas de bytes sin formato para la mayoría de los fines.

Un esquema de Aerospike es flexible y los valores dinámicos de los mismos contenedores pueden tener tipos diferentes. Las aplicaciones que usan Aerospike o Bigtable tienen una flexibilidad similar y la misma responsabilidad de administración de datos: las aplicaciones gestionan los tipos de datos y las restricciones de integridad, en lugar de depender del motor de la base de datos.

Migración de estantería

La aplicación Bookshelf es una aplicación web en la que los usuarios pueden almacenar información sobre libros y ver la lista de todos los libros que hay en la base de datos. La aplicación usa un identificador de libro (ID) para buscar información sobre el libro. La aplicación o la base de datos genera automáticamente estos IDs. Cuando un usuario selecciona la imagen de un libro, el backend de la aplicación carga los detalles de ese libro desde la base de datos.

En este tutorial, migrarás datos de la aplicación de estantería usando Aerospike a Bigtable. Después de la migración, puedes acceder a los libros desde Bigtable.

En el siguiente diagrama se muestra cómo se migran los datos de Aerospike a Bigtable:

Pasos para migrar datos.

En el diagrama anterior, los datos se migran de la siguiente manera:

  1. Creas una copia de seguridad de los datos de los libros de la base de datos de Aerospike actual y transfieres los datos a un segmento de Cloud Storage.
  2. Cuando subes los datos de la copia de seguridad al segmento, se activa automáticamente el trabajo de as2bt Dataflow mediante las notificaciones de actualización de Cloud Storage con la función de Cloud Run.
  3. Una vez que la tarea de Dataflow haya completado la migración de datos, cambia la base de datos backend de Aerospike a Bigtable para que la aplicación de estantería cargue los datos de los libros del clúster de Bigtable.as2bt

Preparar el entorno

Para preparar el entorno para la migración de Aerospike a Bigtable, ejecuta las siguientes herramientas directamente desde Cloud Shell:

  • Google Cloud CLI
  • La herramienta de línea de comandos de Bigtable, cbt
  • Terraform
  • Apache Maven

Estas herramientas ya están disponibles en Cloud Shell, por lo que no tienes que instalarlas de nuevo.

Configurar un proyecto

  1. En Cloud Shell, inspecciona el ID de proyecto que Cloud Shell configura automáticamente. La línea de comandos se actualiza para reflejar el proyecto activo y se muestra en este formato: USERNAME@cloudshell:~ (PROJECT_ID)$

    Si el ID de proyecto no está configurado correctamente, puedes configurarlo manualmente:

    gcloud config set project <var>PROJECT_ID</var>
    

    Sustituye PROJECT_ID por el ID de tu proyecto. Google Cloud

  2. Configura us-east1 como región y us-east1-b como zona:

    gcloud config set compute/region us-east1
    gcloud config set compute/zone us-east1-b
    

    Para obtener más información sobre las regiones y las zonas, consulta el artículo sobre geografía y regiones.

Desplegar el entorno del tutorial

  1. En Cloud Shell, clona el repositorio de código:

     git clone https://github.com/fakeskimo/as2bt.git/
    
  2. En Cloud Shell, inicializa el directorio de trabajo de Terraform:

    cd "$HOME"/as2bt/bookshelf/terraform
    terraform init
    
  3. Configura las variables de entorno de Terraform para la implementación:

    export TF_VAR_gce_vm_zone="$(gcloud config get-value compute/zone)"
    export TF_VAR_gcs_bucket_location="$(gcloud config get-value compute/region)"
    
  4. Revisa el plan de ejecución de Terraform:

    terraform plan
    

    El resultado debería ser similar al siguiente:

    Terraform will perform the following actions:
    # google_bigtable_instance.bookshelf_bigtable will be created
    + resource "google_bigtable_instance" "bookshelf_bigtable" {
      + display_name  = (known after apply)
      + id            = (known after apply)
      + instance_type = "DEVELOPMENT"
      + name          = "bookshelf-bigtable"
      + project       = (known after apply)
      + cluster {
          + cluster_id   = "bookshelf-bigtable-cluster"
          + storage_type = "SSD"
          + zone         = "us-east1-b"
        }
    }
    
  5. (Opcional) Para visualizar qué recursos con dependencias implementa Terraform, dibuja gráficos:

    terraform graph | dot -Tsvg > graph.svg
    
  6. Aprovisiona el entorno del tutorial:

    terraform apply
    

Verificar el entorno del tutorial y la aplicación Bookshelf

Después de aprovisionar el entorno y antes de iniciar la tarea de migración de datos, debes verificar que todos los recursos se han implementado y configurado. En esta sección se explica cómo verificar el proceso de aprovisionamiento y se indica qué componentes se configuran en el entorno.

Verificar el entorno del tutorial

  1. En Cloud Shell, verifica la bookshelf-aerospike instancia de Compute Engine:

    gcloud compute instances list
    

    El resultado muestra que la instancia se ha desplegado en la zona us-east1-b:

    NAME                 ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
    bookshelf-aerospike  us-east1-b  n1-standard-2               10.142.0.4   34.74.72.3   RUNNING
    
  2. Verifica la instancia de bookshelf-bigtable Bigtable:

    gcloud bigtable instances list
    

    El resultado debería ser similar al siguiente:

    NAME                DISPLAY_NAME        STATE
    bookshelf-bigtable  bookshelf-bigtable  READY
    

    Esta instancia de Bigtable se usa como destino de migración en pasos posteriores.

  3. Verifica que el segmento de Cloud Storage bookshelf esté en el trabajo de la canalización de Dataflow:

    gcloud storage ls gs://bookshelf-* --buckets
    

    Dado que los nombres de los segmentos de Cloud Storage deben ser únicos de forma global, el nombre del segmento se crea con un sufijo aleatorio. La salida es similar a la siguiente:

    gs://bookshelf-616f60d65a3abe62/
    

Añadir un libro a la aplicación Bookshelf

  1. En Cloud Shell, obtén la dirección IP externa de la instancia bookshelf-aerospike:

    gcloud compute instances list --filter="name:bookshelf-aerospike" \
        --format="value(networkInterfaces[0].accessConfigs.natIP)"
    

    Anota la dirección IP, ya que la necesitarás en el siguiente paso.

  2. Para abrir la aplicación Estantería, ve a http://IP_ADDRESS:8080 en un navegador web.

    Sustituye IP_ADDRESS por la dirección IP externa que has copiado en el paso anterior.

  3. Para crear un libro, haz clic en Añadir libro.

  4. En la ventana Añadir libro, rellena los siguientes campos y, a continuación, haz clic en Guardar:

    • En el campo Title, introduce Aerospike-example.
    • En el campo Author, introduce Aerospike-example.
    • En el campo Fecha de publicación, introduce la fecha de hoy.
    • En el campo Description (Descripción), introduce Aerospike-example.

    Este libro se usa para verificar que la aplicación Bookshelf usa Aerospike como almacenamiento de libros.

  5. En la URL de la aplicación Bookshelf, anota el ID del libro. Por ejemplo, si la URL es 34.74.80.160:8080/books/10000, el ID del libro es 10000.

    ID del libro en la URL.

  6. En Cloud Shell, usa SSH para conectarte a la instancia bookshelf-aerospike:

    gcloud compute ssh bookshelf-aerospike
    
  7. En la sesión de la instancia bookshelf-aerospike, comprueba que se ha creado un libro con el ID que has anotado anteriormente:

    aql -c 'select * from bookshelf.books where id = "BOOK_ID"'
    

    El resultado debería ser similar al siguiente:

    +----------------------+----------------------+---------------+----------------------+----------+---------+
    | title                | author               | publishedDate | description          | imageUrl | id      |
    +----------------------+----------------------+---------------+----------------------+----------+---------+
    | " Aerospike-example" | " Aerospike-example" | "2000-01-01"  | " Aerospike-example" | ""       | "10000" |
    +----------------------+----------------------+---------------+----------------------+----------+---------+
    1 row in set (0.001 secs)
    

    Si no aparece el ID de tu libro, repite los pasos para añadir un libro.

Transferir datos de copias de seguridad de Aerospike a Cloud Storage

  1. En Cloud Shell, desde la sesión de la instancia de bookshelf-aerospike, crea un archivo de copia de seguridad de Aerospike:

    aql -c "select * from bookshelf.books" --timeout=-1 --outputmode=json \`
        | tail -n +2 | jq -c '.[0] | .[]' \
        | gcloud storage cp - $(gcloud storage ls gs://bookshelf-* --buckets)bookshelf-backup.json
    

    Este comando procesa los datos y crea un archivo de copia de seguridad mediante el siguiente proceso:

    • Selecciona la información del libro de Aerospike y la muestra en formato JSON.
    • Elimina los dos primeros encabezados de la salida y convierte los datos al formato JSON delimitado por saltos de línea (ndjson) mediante jq, un procesador JSON de línea de comandos.
    • Usa la CLI gcloud para subir los datos al depósito de Cloud Storage.
  2. Verifica que el archivo de copia de seguridad de Aerospike se haya subido y que esté en el cubo de Cloud Storage:

    gcloud storage ls gs://bookshelf-*/bookshelf-*\
        gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
    
  3. (Opcional) Revisa el contenido del archivo de copia de seguridad del segmento de Cloud Storage:

    gcloud storage cat -r 0-1024 gs://bookshelf-*/bookshelf-backup.json | head -n 2
    

    El resultado debería ser similar al siguiente:

    {"title":"book_2507","author":"write_2507","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_2507","createdBy":"write_2507","createdById":"2507_anonymous","id":"2507"}
    {"title":"book_3867","author":"write_3867","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_3867","createdBy":"write_3867","createdById":"3867_anonymous","id":"3867"}
    
  4. Cierra la sesión SSH y vuelve a Cloud Shell:

    exit
    

Migrar los datos de la copia de seguridad a Bigtable con Dataflow

Ahora puedes migrar los datos de la copia de seguridad de Cloud Storage a una instancia de Bigtable. En esta sección se explica cómo usar las canalizaciones de Dataflow para migrar datos compatibles con un esquema de Bigtable.

Configurar la tarea de migración de Dataflow

  1. En Cloud Shell, ve al directorio dataflow del repositorio de código de ejemplo:

    cd "$HOME"/as2bt/dataflow/
    
  2. Configura las variables de entorno de un trabajo de Dataflow:

    export BOOKSHELF_BACKUP_FILE="$(gcloud storage ls
    gs://bookshelf*/bookshelf-backup.json)"
    export BOOKSHELF_DATAFLOW_ZONE="$(gcloud config get-value compute/zone)"
    
  3. Comprueba que las variables de entorno estén configuradas correctamente:

    env | grep BOOKSHELF
    

    Si las variables de entorno están configuradas correctamente, el resultado será similar al siguiente:

    BOOKSHELF_BACKUP_FILE=gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
    BOOKSHELF_DATAFLOW_ZONE=us-east1-b
    

Ejecutar la tarea de Dataflow

  1. En Cloud Shell, migra los datos de Cloud Storage a la instancia de Bigtable:

    ./run_oncloud_json.sh
    
  2. Para monitorizar la tarea de migración de datos de la copia de seguridad, ve a la página Tareas de la consola deGoogle Cloud .

    Ir a Tareas

    Espera a que el trabajo se complete correctamente. Cuando el trabajo se completa correctamente, el resultado en Cloud Shell es similar al siguiente:

    Dataflow SDK version: 2.13.0
    Submitted job: 2019-12-16_23_24_06-2124083021829446026
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  08:20 min
    [INFO] Finished at: 2019-12-17T16:28:08+09:00
    [INFO] ------------------------------------------------------------------------
    

Consultar los resultados de la tarea de migración

  • En Cloud Shell, comprueba que los datos de la copia de seguridad se hayan transferido correctamente a Bigtable:

    cbt -instance bookshelf-bigtable lookup books 00001
    

    El resultado debería ser similar al siguiente:

      ----------------------------------------
    00001
      info:author                              @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
      info:description                         @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
      info:id                                  @ 2019/12/17-16:26:04.434000
        "00001"
      info:imageUrl                            @ 2019/12/17-16:26:04.434000
        ""
      info:publishedDate                       @ 2019/12/17-16:26:04.434000
        "2019-10-01"
      info:title                               @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
    
    .

Cambiar la base de datos de estantería de Aerospike a Bigtable

Una vez que hayas migrado correctamente los datos de Aerospike a Bigtable, puedes cambiar la configuración de la aplicación Bookshelf para que use Bigtable como almacenamiento. Cuando configures esta opción, los libros nuevos se guardarán en las instancias de Bigtable.

Cambiar la configuración de la aplicación Bookshelf

  1. En Cloud Shell, usa SSH para conectarte a la aplicación bookshelf-aerospike:

    gcloud compute ssh bookshelf-aerospike
    
  2. Verifica que la configuración actual de DATA_BACKEND sea aerospike:

    grep DATA_BACKEND /opt/app/bookshelf/config.py
    

    El resultado es el siguiente:

    DATA_BACKEND = 'aerospike'
    
  3. Cambia la configuración de DATA_BACKEND de aerospike a bigtable:

    sudo sed -i "s/DATA_BACKEND =.*/DATA_BACKEND = 'bigtable'/g" /opt/app/bookshelf/config.py
    
  4. Verifica que la configuración de DATA_BACKEND haya cambiado a bigtable:

    grep DATA_BACKEND /opt/app/bookshelf/config.py
    

    El resultado es el siguiente:

    DATA_BACKEND = 'bigtable'
    
  5. Reinicia la aplicación Bookshelf que usa la nueva configuración del backend bigtable:

    sudo supervisorctl restart bookshelf
    
  6. Comprueba que la aplicación Estantería se haya reiniciado y funcione correctamente:

    sudo supervisorctl status bookshelf
    

    El resultado debería ser similar al siguiente:

    bookshelf  RUNNING   pid 18318, uptime 0:01:00
    

Verificar que la aplicación de estantería usa el backend de Bigtable

  1. En un navegador, ve a http://IP_ADDRESS:8080.
  2. Añade un libro nuevo llamado Bigtable-example.

  3. Para verificar que el libro Bigtable-example se ha creado en una instancia de Bigtable desde la aplicación Bookshelf, copia el ID del libro de la barra de direcciones del navegador.

  4. En Cloud Shell, busca los Bigtable-example datos de libros de una instancia de Bigtable:

    cbt -instance bookshelf-bigtable lookup books 7406950188
    

    El resultado debería ser similar al siguiente:

    ----------------------------------------
    7406950188
      info:author                              @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
      info:description                         @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
      info:id                                  @ 2019/12/17-17:28:25.592000
        "7406950188"
      info:image_url                           @ 2019/12/17-17:28:25.592000
        ""
      info:published_date                      @ 2019/12/17-17:28:25.592000
        "2019-10-01"
      info:title                               @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
    

Has migrado los datos de Aerospike a Bigtable correctamente y has cambiado la configuración de la estantería para conectarte a un backend de Bigtable.