Migrar la base de datos backend de Looker a MySQL

De forma predeterminada, Looker usa una base de datos en memoria HyperSQL para almacenar su configuración, sus usuarios y otros datos. En una instancia con mucha actividad, esta base de datos puede alcanzar un tamaño de varios 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 sustituyas la base de datos HyperSQL por un backend de base de datos MySQL completo cuando la base de datos HyperSQL interna supere los 600 MB. Para comprobar el tamaño de la base de datos HyperSQL, consulta el tamaño del archivo looker.script:

cd looker
cd .db
ls -lah

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

Aprovisionar una instancia de MySQL

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

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

MySQL 8.0.X: 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 bases de datos MySQL a través del controlador JDBC. Para que esta versión de MySQL funcione correctamente, debes seguir estos pasos adicionales:

  1. Configura la base de datos MySQL para que use el complemento mysql_native_password. Esto se puede hacer de varias formas, en función de cómo se haya implementado tu base de datos MySQL 8 y del tipo de acceso que tengas a la configuración:

    • Inicia el proceso con la marca --default-auth=mysql_native_password

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

      [mysqld]
      default-authentication-plugin=mysql_native_password
      
    • Si tu instancia de base de datos está alojada en AWS RDS, define el parámetro default_authentication_plugin mediante un grupo de parámetros de RDS que se aplique a esta instancia de base de datos.

  2. Ejecuta las siguientes instrucciones y sustituye 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 de los paquetes

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

max_allowed_packet = 1073741824

Definir el algoritmo de la tabla temporal

MySQL 8 gestiona las tablas temporales internas de forma diferente a las versiones anteriores. La configuración predeterminada puede provocar problemas al ejecutar algunas de las consultas necesarias para que Looker funcione, especialmente en las instancias de Looker con muchos usuarios y proyectos. Lo más recomendable es definir el siguiente ajuste global del servidor:

internal_tmp_mem_storage_engine = MEMORY

Configurar conjuntos de caracteres

Define los siguientes parámetros predeterminados para usar UTF8mb4, que admite conjuntos de caracteres UTF8. Consulta el artículo En MySQL, nunca uses "utf8". Consulta "utf8mb4" para obtener información sobre por qué recomendamos usar UTF8mb4 (y 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 ajuste creando o modificando un grupo de parámetros y editando los ajustes correspondientes. Te recomendamos que copies el grupo de parámetros actual y hagas los cambios en la copia, sobre todo 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. Puede que tengas que reiniciar el dispositivo.

Definir el esquema de réplica

Looker se basa en funciones que requieren un archivo de registro binario mixed o row. Si alojas tu propia instancia de MySQL, define binlog_format como mixed o row con uno de los siguientes comandos:

SET GLOBAL binlog_format = 'MIXED';

o

SET GLOBAL binlog_format = 'ROW';

Crear una base de datos y un usuario

Crea un usuario y una base de datos en la instancia de base de datos. Para ello, sustituye <DB_username>, <DB_name> y <DB_password> por los valores reales del usuario y la base de datos. También debes sustituir <DB_charset> y <DB_collation> por el conjunto de caracteres y la recopilación de datos que coincidan con los ajustes del grupo de parámetros de la instancia de RDS (para que se admita UTF8, te recomendamos que uses 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>'@'%';

La base de datos looker_tmp de la última línea no tiene por qué existir, pero la instrucción grant es necesaria para generar informes internos.

Crear un archivo de credenciales de base de datos

Looker necesita saber con qué base de datos de MySQL debe comunicarse y qué credenciales debe usar. En el directorio de Looker, crea un archivo llamado looker-db.yml con el siguiente contenido. Sustituye <DB_hostname>, <DB_username>, <DB_password> y <DB_name> por los 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 MySQL requiere una conexión SSL, añade la siguiente línea a looker-db.yml:

ssl: true

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

verify_ssl: true

También puedes especificar otros parámetros JDBC adicionales que admita el controlador JDBC de MariaDB añadiendo jdbc_additional_params. Por ejemplo, si necesitas usar un archivo de almacén de confianza específico, puedes añadir el siguiente parámetro a la cadena de conexión JDBC de MySQL:

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

En las instalaciones alojadas por el cliente, puedes especificar el número máximo de conexiones que Looker puede establecer con tu base de datos añadiendo max_connections. Por ejemplo, para limitar el número de conexiones simultáneas a tu base de datos a 10, añade lo siguiente:

max_connections: 10

Según el esquema de cifrado de Looker, todos los datos sensibles de la base de datos se cifran en reposo. Aunque alguien obtuviera acceso a las credenciales de la base de datos en texto sin cifrar y accediera a la base de datos, Looker cifra o aplica un hash a los datos sensibles antes de almacenarlos. Esto se aplica a contraseñas, credenciales de bases de datos de analíticas, caché de consultas, etc. Sin embargo, si no quieres almacenar la contraseña de texto sin cifrar de esta configuración en el archivo looker-db.yml del disco, puedes configurar la variable de entorno LOOKER_DB para que contenga una lista de claves y valores de cada línea del archivo looker-db.yml. Por ejemplo:

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

Crear una copia de seguridad del directorio .db

Crea una copia de seguridad del directorio .db, que contiene los archivos necesarios para crear la base de datos HyperSQL en memoria, por si necesitas restaurar HyperSQL:

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

Migrar la base de datos

Migrar la base de datos a MySQL puede llevar horas en una instancia mediana o grande, sobre todo si la base de datos HyperSQL tiene 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 los 26 GB de montículo especificados en los pasos) durante la migración, lo que reduce el tiempo necesario a unos 10 minutos.

  1. En el host de Looker:

    cd looker
    ./looker stop
    vi looker
    
  2. En la secuencia de comandos de inicio de Looker, añade una segunda línea al archivo:

    exit
    
  3. Detén la instancia en la consola de AWS. Cuando se detenga, cambia el tamaño de la instancia de EC2 a m5.2xlarge. A continuación, vuelve a iniciar la instancia.

  4. Conéctate al host mediante SSH como usuario de Looker. Primero, asegúrate de que Java no se esté ejecutando y, a continuación, ejecuta el siguiente comando:

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

    Al ejecutar el paso migrate_internal_data, es posible que no se encuentre libcrypt y que aparezca un rastreo de pila que empiece por 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 ocurre, defina el LD_LIBRARY_PATH manualmente antes de ejecutar el comando de Java:

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

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

  7. Vuelve a iniciar la instancia.

Iniciar Looker

  1. Edita el script de inicio de Looker y elimina la línea exit que has añadido antes.

  2. Asegúrate de que no haya argumentos definidos en LOOKERARGS en la secuencia de comandos de inicio. En su lugar, los argumentos deben moverse al archivo lookerstart.cfg para que no se sobrescriban con las nuevas versiones de la secuencia de comandos de inicio. Guarda la secuencia de comandos de inicio y sal.

  3. Editar lookerstart.cfg. Debería tener un aspecto similar al siguiente:

    LOOKERARGS="-d looker-db.yml"
    

    Si había otros argumentos en la secuencia de comandos de inicio de Looker, añádelos al archivo lookerstart.cfg.

  4. Archiva el directorio .db si aún no lo has hecho.

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

    ./looker start
    

Comprobar que Looker esté usando la nueva base de datos

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

netstat -na | grep 3306

Deberías ver algunas conexiones a la instancia de base de datos. A continuación, se muestra un ejemplo de resultado 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

Crear copias de seguridad de Looker

Después de migrar a un backend de MySQL, las copias de seguridad automáticas de S3 de Looker dejarán de funcionar. Recomendamos que se hagan copias de seguridad de la base de datos MySQL al menos una vez al día, así como copias de seguridad del sistema de archivos del directorio de trabajo de Looker. El directorio looker/log/ se puede excluir de las copias de seguridad del sistema de archivos. Para obtener más información, consulta la página de documentación sobre creación de copias de seguridad.