Cómo migrar la base de datos de backend de Looker a MySQL

De forma predeterminada, Looker usa una base de datos en memoria HyperSQL para almacenar su configuración, usuarios y otros datos. En una instancia con mucho trabajo, esta base de datos puede alcanzar un tamaño de gigabytes, lo que puede provocar problemas de rendimiento, presión de memoria de Java y tiempos de inicio prolongados.

En una instancia alojada por el cliente, te recomendamos que reemplaces la base de datos HyperSQL por un backend de base de datos de MySQL completo cuando el tamaño de la base de datos HyperSQL interna supere los 600 MB. Para verificar el tamaño de la base de datos de HyperSQL, consulta el tamaño del archivo looker.script:

cd looker
cd .db
ls -lah

Si el archivo looker.script supera los 600 MB de tamaño, sigue los siguientes procedimientos para migrar a una base de datos de MySQL externa.

Aprovisionar una instancia de MySQL

Aprovisionar una instancia de MySQL 8.0.x para usarla como backend No se admiten versiones de MySQL anteriores a la 8.0.

En AWS RDS, es probable que una instancia de la clase db.m5.large sea suficiente como backend para una sola instancia de Looker. Aunque es probable que el uso real de la base de datos esté en el rango de 5 a 10 GB, es una buena idea aprovisionar entre 100 y 150 GB de almacenamiento SSD, ya que las IOPS aprovisionadas se basan en la cantidad de almacenamiento solicitado.

MySQL 8.0.X: cómo cambiar el complemento de autenticación predeterminado

En MySQL 8.0.X, el complemento de autenticación predeterminado es caching_sha2_password. Looker usa el complemento mysql_native_password para intentar autenticarse en las bases de datos de MySQL a través del controlador JDBC. Para que esta versión de MySQL funcione correctamente, debes realizar los siguientes pasos adicionales:

  1. Configura la base de datos de MySQL para usar el complemento mysql_native_password. Esto se puede hacer de varias maneras y dependerá de cómo se implemente tu base de datos de MySQL 8 y del tipo de acceso que tengas a la configuración:

    • Comienza el proceso con la marca --default-auth=mysql_native_password.

    • Configura la propiedad en el archivo de configuración my.cnf:

      [mysqld]
      default-authentication-plugin=mysql_native_password
      
    • Si tu instancia de base de datos se aloja a través de AWS RDS, configura el parámetro default_authentication_plugin a través de un grupo de parámetros de RDS que se aplique a esta instancia de base de datos.

  2. Emite las siguientes instrucciones y reemplaza some_password_here por una contraseña única y segura:

    CREATE USER looker IDENTIFIED WITH mysql_native_password BY 'some_password_here';
    GRANT SELECT ON database_name.* TO 'looker'@'%';
    

Ajustar MySQL

Ajusta la siguiente configuración en tu instancia de MySQL.

Aumentar el tamaño máximo del paquete

El tamaño predeterminado de max_allowed_packet de MySQL es demasiado pequeño para la migración de la base de datos y puede hacer que la migración falle con un error PACKET_TOO_LARGE. Establece max_allowed_packet en el valor máximo permitido de 1073741824:

max_allowed_packet = 1073741824

Configura el algoritmo de tabla temporal

MySQL 8 maneja las tablas temporales internas de manera diferente a las versiones anteriores. La configuración predeterminada puede causar problemas para ejecutar algunas de las consultas necesarias para que se ejecute Looker, en especial para las instancias de Looker con muchos usuarios y proyectos. La práctica recomendada es establecer la siguiente configuración global del servidor:

internal_tmp_mem_storage_engine = MEMORY

Configura grupos de caracteres

Configura los siguientes parámetros predeterminados para usar UTF8mb4, que admite grupos de caracteres UTF8. Consulta el artículo En MySQL, nunca uses "utf8". Usa “utf8mb4”. para obtener información sobre por qué recomendamos el uso de UTF8mb4 (no UTF8) con MySQL.

character_set_client = utf8mb4
character_set_results = utf8mb4
character_set_connection = utf8mb4
character_set_database = utf8mb4
character_set_server = utf8mb4
collation_connection = utf8mb4_general_ci
collation_server = utf8mb4_general_ci

En las instancias de Amazon RDS, puedes aplicar este parámetro de configuración si creas o modificas un grupo de parámetros y editas el parámetro de configuración adecuado. Te recomendamos que copies el grupo de parámetros actual y realices los cambios en la copia, especialmente si compartes grupos de parámetros en varias instancias de RDS. Después de guardar el grupo de parámetros, aplícalo a la instancia de RDS. Es posible que debas reiniciar el dispositivo.

Establece tu esquema de réplica

Looker se basa en una funcionalidad que requiere un binlog mixed o row. Si alojas tu propia instancia de MySQL, establece tu binlog_format en mixed o row mediante la emisión de uno de los siguientes comandos:

SET GLOBAL binlog_format = 'MIXED';

o

SET GLOBAL binlog_format = 'ROW';

Crea una base de datos y un usuario

Crea un usuario y una base de datos en la instancia de la base de datos. Para ello, reemplaza <DB_username>, <DB_name> y <DB_password> por los valores reales del usuario y la base de datos. También reemplaza <DB_charset> y <DB_collation> por el conjunto de caracteres y la intercalación elegidos que coincidan con la configuración del grupo de parámetros de la instancia de RDS (para una compatibilidad real con UTF8, recomendamos utf8mb4 y utf8mb4_general_ci).

create user <DB_username>;
set password for <DB_username> = password ('<DB_password>');
create database <DB_name> default character set <DB_charset> default collate <DB_collation>;
grant all on <DB_name>.* to <DB_username>@'%';
grant all on looker_tmp.* to '<DB_username>'@'%';

No es necesario que la base de datos looker_tmp de la última línea exista, pero la sentencia grant es necesaria para los informes internos.

Crea un archivo de credenciales de la base de datos

Looker necesita saber con qué base de datos de MySQL comunicarse y qué credenciales usar. En el directorio Looker, crea un archivo llamado looker-db.yml con el siguiente contenido y reemplaza <DB_hostname>, <DB_username>, <DB_password> y <DB_name> por valores de tu base de datos:

dialect: mysql
host: <DB_hostname>
username: <DB_username>
password: <DB_password>
database: <DB_name>
port: 3306

Si tu base de datos de MySQL requiere una conexión SSL, agrega la siguiente línea a looker-db.yml:

ssl: true

Si también quieres habilitar la verificación del certificado SSL, agrega la siguiente línea a looker-db.yml:

verify_ssl: true

De manera opcional, también puedes especificar cualquier otro parámetro de JDBC adicional que admita el controlador de JDBC de MariaDB agregando jdbc_additional_params. Por ejemplo, si necesitas usar un archivo específico de almacén de confianza, puedes agregar el siguiente parámetro a la cadena de conexión de MySQL JDBC:

jdbc_additional_params: trustStore=/path/to/my/truststore.jks&keyStore=/path/to/my/keystore.jks

En el caso de las instalaciones alojadas por el cliente, puedes agregar max_connections para especificar de forma opcional la cantidad máxima de conexiones que Looker puede establecer con tu base de datos. Por ejemplo, para limitar a 10 la cantidad de conexiones simultáneas a tu base de datos, agrega lo siguiente:

max_connections: 10

Con el esquema de encriptación de Looker, todos los datos sensibles de la base de datos se encriptan en reposo. Incluso si alguien obtuviera acceso a las credenciales de la base de datos de texto simple y a la base de datos, Looker encripta o genera un hash de los datos sensibles antes de almacenarlos. Esto se aplica a contraseñas, credenciales de bases de datos de análisis, caché de consultas, etcétera. Sin embargo, si no deseas almacenar la contraseña de texto simple para esta configuración en el archivo looker-db.yml en el disco, puedes configurar la variable de entorno LOOKER_DB para que contenga una lista de claves o valores para cada línea del archivo looker-db.yml. Por ejemplo:

export LOOKER_DB="dialect=mysql&host=localhost&username=root&password=&database=looker&port=3306"

Crea una copia de seguridad del directorio .db

Crea una copia de seguridad del directorio .db, que contiene los archivos necesarios para compilar la base de datos de HyperSQL en la memoria, en caso de que necesites restablecer HyperSQL:

cp -r .db .db-backup
tar -zcvf db-backup.tar.gz ./.db-backup

Migra la base de datos

La migración de la base de datos a MySQL puede tardar horas en una instancia mediana o grande, especialmente si la base de datos de HyperSQL es de 1 GB o más. Te recomendamos que actualices temporalmente la instancia de EC2 a una m5.2xlarge (con 32 GB de RAM para permitir el montón de 26 GB especificado en los pasos) durante la migración, lo que reduce el tiempo requerido a alrededor de 10 minutos.

  1. En el host de Looker, sigue estos pasos:

    cd looker
    ./looker stop
    vi looker
    
  2. En la secuencia de comandos de inicio de Looker, crea una segunda línea nueva en el archivo:

    exit
    
  3. Detén la instancia en la consola de AWS. Una vez que se detenga, cambia el tamaño de la instancia de EC2 a m5.2xlarge. Luego, vuelve a iniciar la instancia.

  4. Conéctate al host a través de SSH como el usuario de Looker. Primero, asegúrate de que Java no se esté ejecutando y, luego, ejecuta lo siguiente:

    cd looker
    java -Xms26000m -Xmx26000m -jar looker.jar migrate_internal_data  looker-db.yml
    

    Cuando se ejecuta el paso migrate_internal_data, es posible que no se encuentre libcrypt y aparezca un seguimiento de pila que comienza con lo siguiente:

    NotImplementedError: getppid unsupported or native support failed to load
    ppid at org/jruby/RubyProcess.java:752
    ppid at org/jruby/RubyProcess.java:749
    

    Si esto sucede, configura el LD_LIBRARY_PATH de forma manual antes de ejecutar el comando de Java:

    export LD_LIBRARY_PATH=$HOME/looker/.tmp/:$LD_LIBRARY_PATH
    
  5. Una vez que se complete correctamente, detén la instancia desde la consola de AWS.

  6. Ahora puedes restablecer la instancia a su tamaño original.

  7. Reiniciar la instancia.

Inicia Looker

  1. Edita la secuencia de comandos de inicio de Looker y borra la línea exit que agregaste antes.

  2. Asegúrate de que no haya argumentos definidos en LOOKERARGS en la secuencia de comandos de inicio. En su lugar, debes mover cualquier argumento al archivo lookerstart.cfg para que las versiones nuevas de la secuencia de comandos de inicio no lo reemplacen. Guarda y sal de la secuencia de comandos de inicio.

  3. Editar lookerstart.cfg. El resultado debería ser similar al siguiente:

    LOOKERARGS="-d looker-db.yml"
    

    Si había otros argumentos en la secuencia de comandos de inicio de Looker, agrégalos al archivo lookerstart.cfg.

  4. Archiva el directorio .db si aún no está archivado.

    mv .db .db-backup
    tar -zcvf db-backup.tar.gz ./.db-backup
    rm -rf ./.db-backup/
    
  5. Inicia Looker:

    ./looker start
    

Verifica que Looker esté usando la base de datos nueva

Si Looker usa correctamente el backend de MySQL, deberías ver conexiones de red entre la instancia de Looker y la nueva instancia de la base de datos. Para verificar esto, ejecuta el siguiente comando en la instancia de Looker:

netstat -na | grep 3306

Deberías ver algunas conexiones a la instancia de la base de datos. El siguiente es un resultado de muestra que muestra una instancia de base de datos en la dirección IP 10.0.3.155:

looker@instance1:~$ netstat -na | grep 3306
tcp6       0      0 10.0.5.131:56583        10.0.3.155:3306         ESTABLISHED
tcp6       0      0 10.0.5.131:56506        10.0.3.155:3306         ESTABLISHED
tcp6       0      0 10.0.5.131:56582        10.0.3.155:3306         ESTABLISHED
tcp6       0      0 10.0.5.131:56508        10.0.3.155:3306         ESTABLISHED

Cómo crear una copia de seguridad de Looker

Después de migrar a un backend de MySQL, las copias de seguridad automatizadas de S3 de Looker ya no funcionarán. Recomendamos que se realicen al menos copias de seguridad nocturnas de la base de datos de MySQL junto con copias de seguridad nocturnas del sistema de archivos del directorio de trabajo de Looker. Es posible que el directorio looker/log/ se excluya de las copias de seguridad del sistema de archivos. Consulta la página de documentación Cómo crear copias de seguridad para obtener más información.