Looker-Back-End-Datenbank zu MySQL migrieren

Standardmäßig verwendet Looker eine HyperSQL-In-Memory-Datenbank, um seine Konfiguration, Nutzer und andere Daten zu speichern. Auf einer stark ausgelasteten Instanz kann diese Datenbank in Gigabyte ausgebaut werden. Dies kann zu Leistungsproblemen, Java-Speicherdruck und langen Startzeiten führen.

Wir empfehlen, die HyperSQL-Datenbank durch ein vollständiges MySQL-Datenbank-Back-End zu ersetzen, wenn die interne HyperSQL-Datenbank 600 MB überschreitet. Prüfen Sie die Größe der looker.script-Datei, um die Größe der HyperSQL-Datenbank zu prüfen:

cd looker
cd .db
ls -lah

Wenn die Datei looker.script größer als 600 MB ist, führen Sie die folgenden Schritte aus, 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. Looker unterstützt auch die MySQL-Version 5.7.x.

MySQL-Versionen vor 5.7.x werden nicht unterstützt, da sie die UTF8mb4-Codierung nicht unterstützen.

In AWS RDS reicht eine Instanz der Klasse db.m5.large als Back-End für eine einzelne Looker-Instanz aus. Obwohl die tatsächliche Nutzung der Datenbank wahrscheinlich im Bereich von 5 bis 10 GB liegt, empfiehlt es sich, 100 bis 150 GB SSD-Speicher bereitzustellen, da der bereitgestellte IOPS-Wert auf dem angeforderten Speicherplatz basiert.

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

In MySQL 8.0.X ist das Standard-Authentifizierungs-Plug-in caching_sha2_password. Looker verwendet das Plug-in mysql_native_password, um sich über den JDBC-Treiber bei MySQL-Datenbanken zu authentifizieren. Damit diese Version von MySQL 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:

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

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

      [mysqld]
      default-authentication-plugin=mysql_native_password
      
    • Wenn die 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 auf Ihrer MySQL-Instanz an.

Maximale Paketgröße erhöhen

Die Standardgröße von max_allowed_packet für 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 für max_allowed_packet den maximal zulässigen Wert von 1073741824 fest:

max_allowed_packet = 1073741824

Algorithmus für temporäre Tabelle festlegen

Interne temporäre Tabellen werden in MySQL 8 anders behandelt als in früheren Versionen. Die Standardeinstellungen können Probleme beim Ausführen einiger Abfragen verursachen, die für die Ausführung von Looker erforderlich sind, insbesondere für Looker-Instanzen mit vielen Nutzern und Projekten. Als Best Practice sollten Sie den Legacy-internen temporären Tabellenalgorithmus von MySQL 5.7 verwenden, indem Sie die folgende globale Servereinstellung festlegen:

internal_tmp_mem_storage_engine = MEMORY

Zeichensätze konfigurieren

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

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 können Sie diese Einstellung anwenden, indem Sie eine Parametergruppe erstellen oder ändern und die entsprechenden Einstellungen bearbeiten. Wir empfehlen Ihnen, die aktuelle Parametergruppe zu kopieren und die Änderungen daran 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.

Replikatschema festlegen

Looker stützt sich auf Funktionen, die einen mixed- oder row-binlog erfordern. Wenn Sie eine eigene MySQL-Instanz hosten, legen Sie binlog_format mit dem folgenden Befehl auf mixed oder row fest:

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 des Nutzers und der Datenbank. Ersetzen Sie außerdem <DB_charset> und <DB_collation> durch den ausgewählten Zeichensatz und die Sortierung, die den Einstellungen der Gruppenparameter für RDS-Instanzparameter entsprechen. Für die 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 unbedingt vorhanden sein, aber die grant-Anweisung ist für interne Berichte erforderlich.

Datei mit Anmeldedaten für die Datenbank erstellen

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

ssl: true

Wenn Sie auch die Bestätigung des SSL-Zertifikats aktivieren möchten, fügen Sie in looker-db.yml die folgende Zeile hinzu:

verify_ssl: true

Optional können Sie 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

Für vom Kunden gehostete 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 beschränken möchten, fügen Sie Folgendes hinzu:

max_connections: 10

Unter dem Verschlüsselungsschema von Looker werden alle sensiblen Daten in der Datenbank verschlüsselt. Auch wenn jemand Zugriff auf Nur-Text-Datenbankanmeldedaten erhält und auf die Datenbank zugreift, verschlüsselt Looker vertrauliche Daten vor dem Speichern und hasht diese. Dies gilt für Passwörter, Anmeldedaten für die Datenbank, den Abfragecache usw. Wenn Sie das Klartextpasswort für diese Konfiguration 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 mit Schlüsseln und 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 mit den Dateien, die zum Erstellen der In-Memory-SQL-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 Stunden auf einem Medium oder einer großen Instanz dauern, insbesondere wenn die HyperSQL-Datenbank 1 GB oder mehr umfasst. Wir empfehlen, die EC2-Instanz während der Migration vorübergehend auf ein m5.2xlarge mit 32 GB RAM zu aktualisieren, um den in den Schritten angegebenen 26-GB-Heap zu ermöglichen. Dadurch wird die Zeit auf ca. 10 Minuten reduziert.

  1. Auf dem Looker-Host:

    cd looker
    ./looker stop
    vi looker
    
  2. Erstellen Sie im Looker-Startskript eine zweite 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 dann die Instanz wieder neu.

  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 diesen Befehl 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 Stacktrace wird angezeigt. Beginnen Sie so:

    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 die 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 dann die Instanz in der AWS-Konsole.

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

  7. Starten Sie die Instanz noch einmal.

Looker starten

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

  2. Achten Sie darauf, dass in LOOKERARGS im Startskript keine Argumente definiert sind. Alle Argumente sollten stattdessen in die Datei lookerstart.cfg verschoben werden, damit sie nicht durch neue Versionen des Startskripts überschrieben werden. Speichern und beenden Sie das Startskript.

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

    LOOKERARGS="-d looker-db.yml"
    

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

  4. Archivieren Sie das Verzeichnis .db, wenn es noch nicht archiviert ist.

    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 MySQL-Back-End 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

Sie sollten einige Verbindungen zur Datenbankinstanz sehen. Im Folgenden sehen Sie ein Beispiel für eine Ausgabe einer DB-Instanz mit 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 nächtliche Sicherungen der MySQL-Datenbank sowie nächtliche Dateisystemsicherungen des Looker-Arbeitsverzeichnisses. Das Verzeichnis looker/log/ kann aus den Dateisystemsicherungen ausgeschlossen werden. Weitere Informationen finden Sie auf der Dokumentationsseite zum Erstellen von Sicherungen.