Looker-Backend-Datenbank zu MySQL migrieren

Standardmäßig verwendet Looker eine speicherinterne HyperSQL-Datenbank, um die Konfiguration, Nutzer und andere Daten zu speichern. Bei einer aktiven Instanz kann diese Datenbank mehrere Gigabyte groß werden, was zu Leistungsproblemen, Java-Arbeitsspeicherdruck und langen Startzeiten führen kann.

Bei einer vom Kunden gehosteten Instanz empfehlen wir, die HyperSQL-Datenbank durch ein vollständiges MySQL-Datenbank-Backend zu ersetzen, wenn die Größe der internen HyperSQL-Datenbank 600 MB überschreitet. Um die Größe der HyperSQL-Datenbank zu prüfen, sehen Sie sich die Größe der Datei looker.script an:

cd looker
cd .db
ls -lah

Wenn die looker.script-Datei eine Größe von 600 MB überschreitet, folgen Sie der Anleitung unten, um zu einer externen MySQL-Datenbank zu migrieren.

MySQL-Instanz bereitstellen

Stellen Sie eine MySQL 8.0.x-Instanz als Backend bereit. MySQL-Versionen vor 8.0 werden nicht unterstützt.

In AWS RDS reicht wahrscheinlich eine Instanz der Klasse db.m5.large als Back-End für eine einzelne Looker-Instanz aus. Auch wenn die tatsächliche Nutzung der Datenbank wahrscheinlich zwischen 5 und 10 GB liegen wird, sollten Sie 100 bis 150 GB SSD-Speicher bereitstellen, da die bereitgestellten IOPS auf der angeforderten Speichermenge basieren.

MySQL 8.0.X – Standard-Authentifizierungs-Plug-in ändern

In MySQL 8.0.X ist caching_sha2_password das standardmäßige Authentifizierungs-Plug-in. Looker verwendet das mysql_native_password-Plug-in, um über den JDBC-Treiber eine Authentifizierung in MySQL-Datenbanken zu versuchen. Damit diese Version von MySQL ordnungsgemäß funktioniert, müssen Sie die folgenden zusätzlichen Schritte ausführen:

  1. Konfigurieren Sie die MySQL-Datenbank so, dass das mysql_native_password-Plug-in verwendet wird. Dafür gibt es verschiedene Vorgehensweisen, die je nach Bereitstellungsvariante der MySQL 8-Datenbank und Art der Zugriffsberechtigung variieren:

    • Starten Sie den Vorgang mit dem Flag --default-auth=mysql_native_password.

    • Legen Sie das Attribut in der Konfigurationsdatei my.cnf fest:

      [mysqld]
      default-authentication-plugin=mysql_native_password
      
    • Wenn die Datenbankinstanz durch AWS RDS gehostet wird, können Sie den default_authentication_plugin-Parameter durch die Anwendung einer RDS-Parametergruppe auf die Datenbankinstanz bestimmen.

  2. Erstellen Sie die folgenden Anweisungen und ersetzen Sie dabei some_password_here durch ein eindeutiges, sicheres Passwort:

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

MySQL optimieren

Passen Sie die folgenden Einstellungen in Ihrer MySQL-Instanz an.

Maximale Paketgröße erhöhen

Die Standardgröße von max_allowed_packet in MySQL ist zu klein für die Datenbankmigration und kann dazu führen, dass die Migration mit dem Fehler PACKET_TOO_LARGE fehlschlägt. Legen Sie max_allowed_packet auf den maximal zulässigen Wert 1073741824 fest:

max_allowed_packet = 1073741824

Algorithmus für temporäre Tabellen festlegen

In MySQL 8 werden interne temporäre Tabellen anders als in früheren Versionen behandelt. Die Standardeinstellungen können zu Problemen beim Ausführen einiger Abfragen führen, die für die Ausführung von Looker erforderlich sind, insbesondere bei Looker-Instanzen mit vielen Nutzern und Projekten. Wir empfehlen, die folgende globale Servereinstellung festzulegen:

internal_tmp_mem_storage_engine = MEMORY

Zeichensätze konfigurieren

Legen Sie die folgenden Standardparameter fest, um UTF8mb4 zu verwenden, der UTF8-Zeichensätze unterstützt. Weitere Informationen finden Sie im Artikel Verwenden Sie in MySQL niemals „utf8“. Verwenden Sie „utf8mb4“. Weitere Informationen dazu, warum wir die Verwendung von UTF8mb4 und nicht UTF8 mit MySQL empfehlen, finden Sie hier.

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

Bei Amazon RDS-Instanzen wenden Sie diese Einstellung an, indem Sie eine Parametergruppe erstellen oder ändern und die entsprechenden Einstellungen bearbeiten. Wir empfehlen, die aktuelle Parametergruppe zu kopieren und die Änderungen an der Kopie vorzunehmen, insbesondere wenn Sie Parametergruppen für mehrere RDS-Instanzen freigeben. Nachdem Sie die Parametergruppe gespeichert haben, wenden Sie sie auf die RDS-Instanz an. Möglicherweise ist ein Neustart erforderlich.

Replikationsschema festlegen

Looker benötigt Funktionen, für die ein mixed- oder row-Binlog erforderlich ist. Wenn Sie Ihre eigene MySQL-Instanz hosten, setzen Sie binlog_format auf mixed oder row. Verwenden Sie dazu einen der folgenden Befehle:

SET GLOBAL binlog_format = 'MIXED';

oder

SET GLOBAL binlog_format = 'ROW';

Datenbank und Nutzer erstellen

Erstellen Sie einen Nutzer und eine Datenbank in der Datenbankinstanz. Ersetzen Sie dabei <DB_username>, <DB_name> und <DB_password> durch die tatsächlichen Werte für den Nutzer und die Datenbank. Ersetzen Sie außerdem <DB_charset> und <DB_collation> durch den ausgewählten Zeichensatz und die ausgewählte Sortierung, die den Parametergruppeneinstellungen der RDS-Instanz entsprechen. Für die vollständige UTF-8-Unterstützung empfehlen wir utf8mb4 und 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>'@'%';

Die looker_tmp-Datenbank in der letzten Zeile muss nicht vorhanden sein, aber die grant-Anweisung ist für interne Berichte erforderlich.

Datei mit Datenbankanmeldedaten erstellen

Looker muss wissen, mit welcher MySQL-Datenbank es kommunizieren und welche Anmeldedaten verwendet werden sollen. Erstellen Sie im Looker-Verzeichnis eine Datei namens looker-db.yml mit dem folgenden Inhalt. Ersetzen Sie dabei <DB_hostname>, <DB_username>, <DB_password> und <DB_name> durch Werte für Ihre Datenbank:

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

Wenn für Ihre MySQL-Datenbank eine SSL-Verbindung erforderlich ist, fügen Sie looker-db.yml die folgende Zeile hinzu:

ssl: true

Wenn Sie auch die Überprüfung des SSL-Zertifikats aktivieren möchten, fügen Sie looker-db.yml die folgende Zeile hinzu:

verify_ssl: true

Optional können Sie auch andere zusätzliche JDBC-Parameter angeben, die vom MariaDB JDBC-Treiber unterstützt werden. Fügen Sie dazu jdbc_additional_params hinzu. Wenn Sie beispielsweise eine bestimmte Truststore-Datei verwenden müssen, können Sie dem MySQL-JDBC-Verbindungsstring den folgenden Parameter hinzufügen:

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

Bei von Kunden gehosteten Installationen können Sie optional die maximale Anzahl von Verbindungen angeben, die Looker mit Ihrer Datenbank herstellen kann. Fügen Sie dazu max_connections hinzu. Wenn Sie beispielsweise die Anzahl der gleichzeitigen Verbindungen zu Ihrer Datenbank auf 10 begrenzen möchten, fügen Sie Folgendes hinzu:

max_connections: 10

Gemäß dem Verschlüsselungsschema von Looker werden alle sensiblen Daten in der Datenbank im Ruhezustand verschlüsselt. Selbst wenn jemand Zugriff auf Klartext-Datenbankanmeldedaten und auf die Datenbank erhält, verschlüsselt oder hasht Looker vertrauliche Daten vor dem Speichern. Das gilt für Passwörter, Anmeldedaten für Analysedatenbanken, Abfragecache usw. Wenn Sie das Klartextpasswort für diese Konfiguration jedoch nicht in der Datei looker-db.yml auf dem Laufwerk speichern möchten, können Sie die Umgebungsvariable LOOKER_DB so konfigurieren, dass sie eine Liste von Schlüsseln/Werten für jede Zeile in der Datei looker-db.yml enthält. Beispiel:

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

Verzeichnis .db sichern

Sichern Sie das Verzeichnis .db, das die Dateien zum Erstellen der HyperSQL-Datenbank im Arbeitsspeicher enthält, für den Fall, dass Sie HyperSQL wiederherstellen müssen:

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

Datenbank migrieren

Die Migration der Datenbank zu MySQL kann bei einer mittleren oder großen Instanz mehrere Stunden dauern, insbesondere wenn die HyperSQL-Datenbank mindestens 1 GB groß ist. Wir empfehlen, die EC2-Instanz während der Migration vorübergehend auf eine m5.2xlarge mit 32 GB RAM zu aktualisieren, um den in den Schritten angegebenen Heap von 26 GB zu ermöglichen. Dadurch verkürzt sich die Zeit auf etwa 10 Minuten.

  1. Auf dem Looker-Host:

    cd looker
    ./looker stop
    vi looker
    
  2. Fügen Sie im Looker-Startskript eine zweite Zeile hinzu:

    exit
    
  3. Stoppen Sie die Instanz in der AWS-Konsole. Ändern Sie die Größe der EC2-Instanz dann in m5.2xlarge. Starten Sie die Instanz dann wieder.

  4. Stellen Sie eine SSH-Verbindung zum Host als Looker-Nutzer her. Prüfen Sie zuerst, ob Java nicht ausgeführt wird. Führen Sie dann Folgendes aus:

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

    Wenn Sie den Schritt migrate_internal_data ausführen, wird libcrypt möglicherweise nicht gefunden und ein Stack-Trace wird angezeigt, der mit folgendem Text beginnt:

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

    Legen Sie in diesem Fall LD_LIBRARY_PATH manuell fest, bevor Sie den Java-Befehl ausführen:

    export LD_LIBRARY_PATH=$HOME/looker/.tmp/:$LD_LIBRARY_PATH
    
  5. Beenden Sie die Instanz dann über die AWS-Konsole.

  6. Sie können die Instanz jetzt auf die ursprüngliche Größe wiederherstellen.

  7. Starten Sie die Instanz neu.

Looker starten

  1. Bearbeiten Sie das Looker-Startscript und löschen Sie die Zeile exit, die Sie zuvor hinzugefügt haben.

  2. Achten Sie darauf, dass im Startskript keine Argumente in LOOKERARGS definiert sind. Stattdessen sollten alle Argumente in die Datei lookerstart.cfg verschoben werden, damit sie nicht von neuen Versionen des Startscripts überschrieben werden. Speichern Sie das Startskript und beenden Sie es.

  3. lookerstart.cfg bearbeiten Dies sollte in etwa wie folgt aussehen:

    LOOKERARGS="-d looker-db.yml"
    

    Wenn das Looker-Startskript weitere Argumente enthält, fügen Sie sie der Datei lookerstart.cfg hinzu.

  4. Archivieren Sie das Verzeichnis .db, falls es noch nicht archiviert wurde.

    mv .db .db-backup
    tar -zcvf db-backup.tar.gz ./.db-backup
    rm -rf ./.db-backup/
    
  5. So starten Sie Looker:

    ./looker start
    

Prüfen, ob Looker die neue Datenbank verwendet

Wenn Looker das MySQL-Backend erfolgreich verwendet, sollten Sie Netzwerkverbindungen zwischen der Looker-Instanz und der neuen Datenbankinstanz sehen. Führen Sie dazu den folgenden Befehl auf der Looker-Instanz aus:

netstat -na | grep 3306

Es sollten einige Verbindungen zur Datenbankinstanz angezeigt werden. Im Folgenden finden Sie ein Beispiel für eine Ausgabe, die eine Datenbankinstanz mit der IP-Adresse 10.0.3.155 enthält:

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

Looker sichern

Nach der Migration zu einem MySQL-Backend funktionieren die automatischen S3-Sicherungen von Looker nicht mehr. Wir empfehlen mindestens nächtliche Sicherungen der MySQL-Datenbank sowie nächtliche Dateisystemsicherungen des Looker-Arbeitsverzeichnisses. Das Verzeichnis looker/log/ kann von den Dateisystemsicherungen ausgeschlossen werden. Weitere Informationen finden Sie auf der Seite Sicherungen erstellen.