Migrazione del database di backend Looker a MySQL

Per impostazione predefinita, Looker utilizza un database in memoria HyperSQL per archiviare la configurazione, gli utenti e altri dati. In un'istanza con molti dati, le dimensioni del database possono arrivare fino a gigabyte, il che può causare problemi di prestazioni, pressione della memoria Java e tempi di avvio lunghi.

In un'istanza ospitata dal cliente, ti consigliamo di sostituire il database HyperSQL con un backend di database MySQL completo se le dimensioni del database HyperSQL interno superano i 600 MB. Per controllare le dimensioni del database HyperSQL, visualizza le dimensioni del file looker.script:

cd looker
cd .db
ls -lah

Se le dimensioni del file looker.script superano i 600 MB, segui le procedure riportate di seguito per eseguire la migrazione a un database MySQL esterno.

Esegui il provisioning di un'istanza MySQL

Esegui il provisioning di un'istanza MySQL 8.0.x da utilizzare come backend. Le versioni di MySQL precedenti alla 8.0 non sono supportate.

In AWS RDS, un'istanza di classe db.m5.large è probabilmente sufficiente come backend per una singola istanza Looker. Anche se l'utilizzo effettivo del database sarà probabilmente compreso nell'intervallo 5-10 GB, è una buona idea eseguire il provisioning di 100-150 GB di spazio di archiviazione SSD perché le IOPS sottoposte a provisioning si basano sulla quantità di spazio di archiviazione richiesta.

MySQL 8.0.X: modifica del plug-in di autenticazione predefinito

In MySQL 8.0.X, il plug-in di autenticazione predefinito è caching_sha2_password. Looker utilizza il plug-in mysql_native_password per tentare di eseguire l'autenticazione nei database MySQL tramite il driver JDBC. Affinché questa versione di MySQL funzioni correttamente, devi seguire questi passaggi aggiuntivi:

  1. Configura il database MySQL per l'utilizzo del plug-in mysql_native_password. Questa operazione può essere eseguita in diversi modi e dipende dal modo in cui viene eseguito il deployment del database MySQL 8 e dal tipo di accesso di cui disponi alla configurazione:

    • Avvia la procedura con il flag --default-auth=mysql_native_password

    • Imposta la proprietà nel file di configurazione my.cnf:

      [mysqld]
      default-authentication-plugin=mysql_native_password
      
    • Se l'istanza di database è ospitata tramite AWS RDS, imposta il parametro default_authentication_plugin tramite un gruppo di parametri RDS applicato a questa istanza di database.

  2. Emetti le seguenti istruzioni, sostituendo some_password_here con una password univoca e sicura:

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

Ottimizza MySQL

Modifica le seguenti impostazioni sull'istanza MySQL.

Aumenta la dimensione massima del pacchetto

Le dimensioni predefinite di MySQL (max_allowed_packet) sono troppo piccole per la migrazione del database e possono causare un errore di PACKET_TOO_LARGE che la migrazione non riesce. Imposta max_allowed_packet sul valore massimo consentito di 1073741824:

max_allowed_packet = 1073741824

Imposta algoritmo della tabella temporanea

MySQL 8 gestisce le tabelle temporanee interne in modo diverso rispetto alle versioni precedenti. Le impostazioni predefinite possono causare problemi durante l'esecuzione di alcune query necessarie a Looker, in particolare per le istanze di Looker con molti utenti e progetti. La best practice prevede la configurazione della seguente impostazione globale del server:

internal_tmp_mem_storage_engine = MEMORY

Configura set di caratteri

Imposta i seguenti parametri predefiniti per utilizzare UTF8mb4, che supporta i set di caratteri UTF8. Consulta l'articolo In MySQL, non utilizzare mai "utf8". Utilizza "utf8mb4" per informazioni sul motivo per cui consigliamo di utilizzare UTF8mb4, non 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

Nelle istanze Amazon RDS, per applicare questa impostazione devi creare o modificare un gruppo di parametri e modificare le impostazioni appropriate. Ti consigliamo di copiare il gruppo di parametri corrente e di apportare le modifiche alla copia, soprattutto se condividi gruppi di parametri tra più istanze RDS. Dopo aver salvato il gruppo di parametri, applicalo all'istanza RDS. Potrebbe essere necessario riavviare.

Imposta lo schema di replica

Looker si basa su funzionalità che richiedono un binlog mixed o row. Se ospiti la tua istanza MySQL, imposta binlog_format su mixed o row inviando uno dei seguenti comandi:

SET GLOBAL binlog_format = 'MIXED';

o

SET GLOBAL binlog_format = 'ROW';

Crea un database e un utente

Crea un utente e un database sull'istanza di database, sostituendo <DB_username>, <DB_name> e <DB_password> con i valori effettivi per l'utente e il database. Sostituisci anche <DB_charset> e <DB_collation> con il set di caratteri e le regole di confronto scelti che corrispondono alle impostazioni del gruppo di parametri dell'istanza RDS (per un vero supporto UTF8, consigliamo utf8mb4 e 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>'@'%';

Il database looker_tmp nell'ultima riga non deve esistere effettivamente, ma l'istruzione grant è necessaria per i report interni.

Crea un file delle credenziali del database

Looker deve sapere con quale database MySQL con cui comunicare e quali credenziali utilizzare. Nella directory Looker, crea un file denominato looker-db.yml con i seguenti contenuti, sostituendo <DB_hostname>, <DB_username>, <DB_password> e <DB_name> con i valori del tuo database:

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

Se il database MySQL richiede una connessione SSL, aggiungi la seguente riga a looker-db.yml:

ssl: true

Se vuoi attivare anche la verifica del certificato SSL, aggiungi la seguente riga a looker-db.yml:

verify_ssl: true

Facoltativamente, puoi anche specificare eventuali altri parametri JDBC aggiuntivi supportati dal Driver JDBC MariaDB aggiungendo jdbc_additional_params. Ad esempio, se devi utilizzare un file specifico di Trust Store, puoi aggiungere il seguente parametro alla stringa di connessione JDBC di MySQL:

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

Per le installazioni ospitate dal cliente, puoi specificare facoltativamente il numero massimo di connessioni che Looker può stabilire con il tuo database aggiungendo max_connections. Ad esempio, per limitare a 10 il numero di connessioni simultanee al tuo database, aggiungi quanto segue:

max_connections: 10

Nello schema di crittografia di Looker, tutti i dati sensibili del database sono criptati at-rest. Anche se qualcuno dovesse ottenere l'accesso a credenziali del database in testo non crittografato e accedere al database, Looker cripta o sottopone a hashing i dati sensibili prima dell'archiviazione. Questo vale per password, credenziali del database di analisi, cache delle query e così via. Tuttavia, se non vuoi memorizzare la password con testo in chiaro per questa configurazione nel file looker-db.yml su disco, puoi configurare la variabile di ambiente LOOKER_DB in modo che contenga un elenco di chiavi/valori per ogni riga del file looker-db.yml. Ad esempio:

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

Esegui il backup della directory .db

Esegui il backup della directory .db, che contiene i file necessari per creare il database HyperSQL in memoria, nel caso in cui sia necessario ripristinare HyperSQL:

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

Esegui la migrazione del database

La migrazione del database a MySQL può richiedere ore su un'istanza di medie o grandi dimensioni, soprattutto se il database HyperSQL ha una dimensione minima di 1 GB. Ti consigliamo di eseguire temporaneamente l'upgrade dell'istanza EC2 a m5.2xlarge (con 32 GB di RAM per consentire l'heap di 26 GB specificato nei passaggi) durante la migrazione, riducendo così il tempo necessario a circa 10 minuti.

  1. Nell'host Looker:

    cd looker
    ./looker stop
    vi looker
    
  2. Nello script di avvio di Looker, crea una nuova seconda riga nel file:

    exit
    
  3. Arresta l'istanza nella console AWS. Una volta interrotto, modifica la dimensione dell'istanza EC2 in m5.2xlarge. Quindi riavvia l'istanza.

  4. SSH all'host come utente Looker. Innanzitutto assicurati che Java non sia in esecuzione, quindi esegui:

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

    Durante l'esecuzione del passaggio migrate_internal_data, è possibile che non venga trovato libcrypt e venga visualizzata un'analisi dello stack, che inizia con questa:

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

    In questo caso, imposta manualmente LD_LIBRARY_PATH prima di eseguire il comando Java:

    export LD_LIBRARY_PATH=$HOME/looker/.tmp/:$LD_LIBRARY_PATH
    
  5. Al termine, arresta l'istanza dalla console AWS.

  6. Ora puoi ripristinare le dimensioni originali dell'istanza.

  7. Riavvia l'istanza.

Avvia Looker

  1. Modifica lo script di avvio di Looker ed elimina la riga exit aggiunta in precedenza.

  2. Assicurati che non siano stati definiti argomenti in LOOKERARGS nello script di avvio. Eventuali argomenti devono invece essere spostati nel file lookerstart.cfg in modo che non vengano sovrascritti da nuove versioni dello script di avvio. Salva ed esci dallo script di avvio.

  3. Modifica lookerstart.cfg. Il risultato dovrebbe essere simile al seguente:

    LOOKERARGS="-d looker-db.yml"
    

    Se nello script di avvio di Looker erano presenti altri argomenti, aggiungili al file lookerstart.cfg.

  4. Archivia la directory .db, se non è già archiviata.

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

    ./looker start
    

Verifica che Looker utilizzi il nuovo database

Se Looker utilizza correttamente il backend MySQL, dovresti vedere le connessioni di rete tra l'istanza di Looker e la nuova istanza del database. Per verificarlo, esegui questo comando sull'istanza di Looker:

netstat -na | grep 3306

Dovresti vedere alcune connessioni all'istanza di database. Di seguito è riportato un output di esempio che mostra un'istanza DB all'indirizzo 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

Backup di Looker in corso...

Dopo la migrazione al backend MySQL, i backup S3 automatici di Looker non funzioneranno più. Consigliamo almeno backup notturni del database MySQL e backup notturni del file system della directory di lavoro Looker. La directory looker/log/ potrebbe essere esclusa dai backup del file system. Per ulteriori informazioni, consulta la pagina della documentazione relativa alla creazione di backup.