Looker-Back-End-Datenbank zu MySQL migrieren

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

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

cd looker
cd .db
ls -lah

Wenn die Datei looker.script 600 MB überschreitet, gehen Sie so vor, um zu einer externen MySQL-Datenbank zu migrieren.

MySQL-Instanz bereitstellen

Stellen Sie eine MySQL 8.0.x-Instanz bereit, die als Back-End verwendet werden soll. MySQL-Versionen vor 8.0 werden nicht unterstützt.

In AWS RDS reicht eine Instanz der Klasse db.m5.large wahrscheinlich als Back-End für eine einzelne Looker-Instanz aus. Auch wenn die tatsächliche Nutzung der Datenbank wahrscheinlich im Bereich von 5–10 GB liegt, empfiehlt es sich, 100–150 GB SSD-Speicher bereitzustellen, 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 Standard-Authentifizierungs-Plug-in. Looker verwendet das Plug-in mysql_native_password, um sich über den JDBC-Treiber bei MySQL-Datenbanken zu authentifizieren. Damit diese MySQL-Version ordnungsgemäß funktioniert, müssen Sie die folgenden zusätzlichen Schritte ausführen:

  1. Konfigurieren Sie die MySQL-Datenbank für die Verwendung des Plug-ins mysql_native_password. Dafür gibt es verschiedene Vorgehensweisen, die je nach Bereitstellungsvariante der MySQL 8-Datenbank und Art der Zugriffsberechtigung variieren:

    • Prozess mit dem Flag --default-auth=mysql_native_password starten

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

      [mysqld]
      default-authentication-plugin=mysql_native_password
      
    • Wenn Ihre Datenbankinstanz über AWS RDS gehostet wird, legen Sie den Parameter default_authentication_plugin über eine RDS-Parametergruppe fest, die auf diese Datenbankinstanz angewendet wird.

  2. Geben Sie die folgenden Anweisungen aus 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 abstimmen

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

Maximale Paketgröße erhöhen

Die MySQL-Standardgröße max_allowed_packet ist für die Datenbankmigration zu klein 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 von 1073741824 fest:

max_allowed_packet = 1073741824

Temporären Tabellenalgorithmus festlegen

MySQL 8 behandelt interne temporäre Tabellen anders als frühere Versionen. Die Standardeinstellungen können Probleme beim Ausführen einiger der für die Ausführung von Looker erforderlichen Abfragen verursachen, insbesondere bei Looker-Instanzen mit vielen Benutzern und Projekten. Es empfiehlt sich, die folgende globale Servereinstellung festzulegen:

internal_tmp_mem_storage_engine = MEMORY

Zeichensätze konfigurieren

Legen Sie für die folgenden Standardparameter fest, dass UTF8mb4 verwendet wird, das UTF8-Zeichensätze unterstützt. Weitere Informationen finden Sie im Artikel In MySQL niemals "utf8" verwenden. Verwenden Sie "utf8mb4"., um zu erfahren, warum wir für MySQL die Verwendung von UTF8mb4 und nicht UTF8 empfehlen.

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

Auf 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 über mehrere RDS-Instanzen hinweg verwenden. Nachdem Sie die Parametergruppe gespeichert haben, wenden Sie sie auf die RDS-Instanz an. Möglicherweise ist ein Neustart erforderlich.

Replikatschema festlegen

Looker basiert auf Funktionen, für die ein mixed- oder row-binlog erforderlich ist. Wenn Sie Ihre eigene MySQL-Instanz hosten, legen Sie binlog_format auf mixed oder row fest. Führen Sie dazu einen der folgenden Befehle aus:

SET GLOBAL binlog_format = 'MIXED';

oder

SET GLOBAL binlog_format = 'ROW';

Datenbank und Nutzer erstellen

Erstellen Sie auf der Datenbankinstanz einen Nutzer und eine Datenbank. 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 Einstellungen der RDS-Instanzparametergruppe entsprechen. Für eine echte UTF8-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 wirklich vorhanden sein, aber die grant-Anweisung wird für interne Berichte benötigt.

Datei mit Anmeldedaten für die Datenbank erstellen

Looker muss wissen, mit welcher MySQL-Datenbank kommunizieren und welche Anmeldedaten verwendet werden sollen. Erstellen Sie im Looker-Verzeichnis eine Datei namens looker-db.yml mit folgendem 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 die folgende Zeile zu looker-db.yml hinzu:

verify_ssl: true

Optional können Sie auch weitere 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 Trust Store-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 vom 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. Beispiel: Um die Anzahl gleichzeitiger Verbindungen zu Ihrer Datenbank auf 10 zu begrenzen, fügen Sie Folgendes hinzu:

max_connections: 10

Unter dem Verschlüsselungsschema von Looker werden alle sensiblen Daten in der Datenbank im Ruhezustand verschlüsselt. Selbst wenn jemand Zugang zu Klartext-Datenbankanmeldedaten erhält und auf die Datenbank zugreift, verschlüsselt oder hasht Looker sensible Daten vor dem Speichern. Dies gilt für Passwörter, Anmeldedaten für Analytics-Datenbanken, Abfrage-Cache 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 für jede Zeile in der Datei looker-db.yml eine Liste von Schlüssel/Wert-Paaren 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 enthält, die zum Erstellen der speicherinternen HyperSQL-Datenbank erforderlich sind, falls 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 Stunden dauern, insbesondere wenn die HyperSQL-Datenbank 1 GB oder mehr umfasst. Wir empfehlen, während der Migration ein vorübergehendes Upgrade der EC2-Instanz auf eine m5.2xlarge-Instanz mit 32 GB RAM durchzuführen, um den in den Schritten angegebenen Heap von 26 GB zuzulassen. Dadurch verkürzt sich die Dauer auf etwa 10 Minuten.

  1. Auf dem Looker-Host:

    cd looker
    ./looker stop
    vi looker
    
  2. Erstellen Sie im Looker-Startup-Skript eine neue zweite Zeile in der Datei:

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

  4. Stellen Sie eine SSH-Verbindung zum Host als Looker-Nutzer her. Vergewissern Sie sich zunächst, dass Java nicht ausgeführt wird, und führen Sie dann folgenden Befehl aus:

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

    Beim Ausführen des Schritts migrate_internal_data wird libcrypt möglicherweise nicht gefunden und ein Stacktrace wird angezeigt, der mit Folgendem 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. Sobald dieser Vorgang erfolgreich abgeschlossen ist, beenden Sie die Instanz über die AWS-Konsole.

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

  7. Starten Sie die Instanz noch einmal.

Looker starten

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

  2. Achten Sie darauf, dass im Startup-Skript in LOOKERARGS keine Argumente definiert sind. Stattdessen sollten alle Argumente in die Datei lookerstart.cfg verschoben werden, damit sie nicht durch neue Versionen des Startup-Skripts überschrieben werden. Speichern und beenden Sie das Startup-Skript.

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

    LOOKERARGS="-d looker-db.yml"
    

    Wenn im Looker-Startup-Skript weitere Argumente vorhanden sind, 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. Starten Sie Looker:

    ./looker start
    

Prüfen, ob Looker die neue Datenbank verwendet

Wenn Looker das Back-End-MySQL erfolgreich verwendet, sollten Sie Netzwerkverbindungen zwischen der Looker-Instanz und der neuen Datenbankinstanz sehen. Um dies zu überprüfen, führen Sie den folgenden Befehl auf der Looker-Instanz aus:

netstat -na | grep 3306

Sie sollten einige Verbindungen zur Datenbankinstanz sehen. Das folgende Ausgabebeispiel zeigt eine DB-Instanz unter der IP-Adresse 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

Looker sichern

Nach der Migration zu einem MySQL-Back-End funktionieren die automatisierten S3-Sicherungen von Looker nicht mehr. Wir empfehlen mindestens jede Nacht Sicherungen der MySQL-Datenbank und nächtliche Sicherungen des Dateisystems des Looker-Arbeitsverzeichnisses. Das Verzeichnis looker/log/ ist möglicherweise aus den Dateisystemsicherungen ausgeschlossen. Weitere Informationen finden Sie auf der Dokumentationsseite Sicherungen erstellen.