Looker バックエンド データベースから MySQL への移行

デフォルトでは、Looker は HyperSQL のインメモリ データベースを使用し、構成やユーザーなどのデータを保存しています。ビジー状態のインスタンスでは、このデータベースのサイズがギガバイトに達することがあり、パフォーマンスの問題、Java メモリの負荷、起動時間が長くなる可能性があります。

セルフホスト型インスタンスでは、内部 HyperSQL データベースのサイズが 600 MB を超える場合は、HyperSQL データベースを完全な MySQL データベース バックエンドに置き換えることをおすすめします。HyperSQL データベースのサイズを確認するには、looker.script ファイルのサイズを表示します。

cd looker
cd .db
ls -lah

looker.script ファイルのサイズが 600 MB を超える場合は、次の手順に従って外部 MySQL データベースに移行します。

MySQL インスタンスをプロビジョニングする

バックエンドとして使用する MySQL 8.0.x インスタンスをプロビジョニングします。MySQL バージョン 8.0 以前はサポートされていません。

AWS RDS では、単一 Looker インスタンスのバックエンドとしてクラス db.m5.large のインスタンスで十分と思われます。データベースの実際の使用量は 5 ~ 10 GB の範囲になる模様ですが、プロビジョニングされる IOPS は要求されたストレージの量に基づいているため、100 ~ 150 GB の SSD ストレージをプロビジョニングすることをおすすめします。

MySQL 8.0.X - デフォルトの認証プラグインの変更

MySQL 8.0.X では、デフォルトの認証プラグインは caching_sha2_password です。Looker は、mysql_native_password プラグインを使用して、JDBC ドライバを介して MySQL データベースに対する認証を試みます。このバージョンの MySQL を正しく機能させるには、追加の手順を行う必要があります。

  1. mysql_native_password プラグインを使用するように MySQL データベースを構成します。これは複数の方法で実行できます。どの方法を使用するかは、MySQL 8データべースのデプロイ方法と、構成へのアクセスのタイプによって決まります。

    • --default-auth=mysql_native_password フラグでプロセスを開始する

    • my.cnf 構成ファイルのプロパティを設定します。

      [mysqld]
      default-authentication-plugin=mysql_native_password
      
    • データベース インスタンスが AWS RDS を介してホストされている場合、このデータベース インスタンスに適用される RDS パラメータ グループを介して default_authentication_plugin パラメータを設定します。

  2. 次のステートメントを発行します。some_password_here を独自のセキュアなパスワードに変更して発行します。

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

MySQL を調整する

MySQL インスタンスで次の設定を調整します。

最大パケットサイズを増やす

MySQL のデフォルトの max_allowed_packet サイズは、データベース移行には小さすぎるため、移行が PACKET_TOO_LARGE エラーで失敗する可能性があります。max_allowed_packet1073741824 の最大値に設定します。

max_allowed_packet = 1073741824

一時テーブル アルゴリズムを設定する

MySQL 8 は、以前のバージョンとは異なる方法で内部一時テーブルを処理します。デフォルト設定では、Looker の実行に必要な一部のクエリ(特に多数のユーザーとプロジェクトが存在する Looker インスタンス)の実行で問題が発生する可能性があります。次のグローバル サーバー設定をおすすめします。

internal_tmp_mem_storage_engine = MEMORY

文字セットを構成する

UTF8 文字セットをサポートする UTF8mb4 を使用するように、次のデフォルト パラメータを設定します。記事を見るMySQL で「utf8」を使用しないでください。MySQL では UTF8 ではなく UTF8mb4 の使用を推奨される理由については、「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

Amazon RDS インスタンスでは、パラメータ グループを作成または変更し、適切な設定を編集することで、この設定を適用します。特に複数の RDS インスタンスでパラメータ グループを共有する場合は、現在のパラメータ グループをコピーしてそのコピーに変更を加えることをおすすめします。パラメータ グループを保存したら、RDS インスタンスに適用します。再起動が必要になる場合があります。

レプリカ スキームを設定する

Looker は mixed または row バイナリログを必要とする機能に依存しています。独自の MySQL インスタンスをホストする場合は、次のいずれかのコマンドを実行して binlog_formatmixed または row に設定します。

SET GLOBAL binlog_format = 'MIXED';

または

SET GLOBAL binlog_format = 'ROW';

データベースとユーザーを作成する

データベース インスタンスにユーザーとデータベースを作成します。<DB_username><DB_name><DB_password> は、ユーザーとデータベースの実際の値に置き換えます。また、<DB_charset><DB_collation> を、RDS インスタンス パラメータ グループ設定と一致する選択した文字セットと照合に置き換えます(真の UTF8 サポートには、utf8mb4utf8mb4_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>'@'%';

最後の行の looker_tmp データベースは実際に存在する必要はありませんが、内部レポートには grant ステートメントが必要です。

データベース認証情報ファイルを作成する

Looker は、接続する MySQL データベースと使用する認証情報を把握する必要があります。Looker ディレクトリに、次の内容を含む looker-db.yml という名前のファイルを作成します。<DB_hostname><DB_username><DB_password><DB_name> は、データベースの値に置き換えます。

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

MySQL データベースに SSL 接続が必要な場合は、looker-db.yml に次の行を追加します。

ssl: true

SSL 証明書の検証を有効にする場合は、次の行を looker-db.yml に追加します。

verify_ssl: true

必要に応じて、jdbc_additional_params を追加することで、MariaDB JDBC ドライバでサポートされている他の JDBC パラメータを指定することもできます。たとえば、特定のトラストストア ファイルを使用する必要がある場合は、MySQL JDBC 接続文字列に次のパラメータを追加できます。

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

セルフホスト型インストールの場合は、必要に応じて max_connections を追加することで、Looker がデータベースと確立できる最大接続数を指定できます。たとえば、データベースへの同時接続数を 10 に制限するには、次のコードを追加します。

max_connections: 10

Looker の暗号化スキームでは、データベース内の機密データはすべて保存時に暗号化されます。誰かが平文データベースの認証情報にアクセスしてデータベースにアクセスした場合でも、Looker はセンシティブ データを保存する前に暗号化またはハッシュします。これは、パスワード、アナリティクス データベースの認証情報、クエリ キャッシュなどに適用されます。ただし、この構成のクリアテキスト パスワードをlooker-db.ymlディスクにファイルを作成する場合は、環境変数LOOKER_DBを構成します。looker-db.yml ファイルの各行の Key-Value のリストが含まれます。例:

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

.db ディレクトリをバックアップする

HyperSQL を復元する必要がある場合に備えて、メモリ内 HyperSQL データベースの構築に必要なファイルが含まれている .db ディレクトリをバックアップします。

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

データベースを移行する

中規模または大規模のインスタンスで、特に HyperSQL データベースが 1 GB 以上の場合は、MySQL へのデータベース移行に数時間かかることがあります。移行中に、EC2 インスタンスを m5.2xlarge に一時的にアップグレードし(32 GB の RAM を使用して、ステップで指定した 26 GB のヒープを使用できるようにします)、これにより約 10 分短縮されます。

  1. Looker のホストで:

    cd looker
    ./looker stop
    vi looker
    
  2. Looker の起動スクリプトで、ファイルに新しい 2 行目を作成します。

    exit
    
  3. AWS コンソールでインスタンスを停止します。停止したら、EC2 インスタンスのサイズを m5.2xlarge に変更します。その後、インスタンスを再度起動します。

  4. Looker ユーザーとしてホストに SSH 接続します。まず、Java が実行されていないことを確認します。そして次のコマンドを実行します。

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

    migrate_internal_data ステップを実行すると、libcrypt が見つからないため、以下からスタック トレースが表示されることがあります。

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

    その場合は、Java コマンドを実行する前に LD_LIBRARY_PATH を手動で設定します。

    export LD_LIBRARY_PATH=$HOME/looker/.tmp/:$LD_LIBRARY_PATH
    
  5. 正常に完了したら、AWS コンソールからインスタンスを停止します。

  6. インスタンスを元のサイズに復元できるようになりました。

  7. その後、インスタンスを再起動する。

Looker を起動する

  1. Looker 起動スクリプトを編集し、前に追加した exit 行を削除します。

  2. 起動スクリプトの LOOKERARGS に引数が定義されていないことを確認します。代わりに、すべての引数を lookerstart.cfg ファイルに移動して、起動スクリプトの新しいバージョンによって上書きされないようにする必要があります。起動スクリプトを保存して終了します。

  3. lookerstart.cfgの編集次のようになります。

    LOOKERARGS="-d looker-db.yml"
    

    Looker の起動スクリプトに他の引数がある場合は、それらを lookerstart.cfg ファイルに追加します。

  4. .db ディレクトリがまだアーカイブされていない場合はアーカイブします。

    mv .db .db-backup
    tar -zcvf db-backup.tar.gz ./.db-backup
    rm -rf ./.db-backup/
    
  5. Looker を起動します:

    ./looker start
    

Looker が新しいデータベースを使用していることを確認する

Looker がバックエンド MySQL を正常に使用している場合は、Looker インスタンスと新しいデータベース インスタンス間のネットワーク接続が表示されます。これを確認するには、Looker インスタンスで次のコマンドを実行します。

netstat -na | grep 3306

データベース インスタンスへの接続がいくつか表示されます。次のサンプル出力は、IP アドレス 10.0.3.155 の DB インスタンスを示しています。

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 のバックアップ

MySQL バックエンドに移行すると、Looker の自動 S3 バックアップは機能しなくなります。MySQL データベースの少なくとも夜間のバックアップと、Looker 作業ディレクトリの夜間ファイル システム バックアップをおすすめします。looker/log/ ディレクトリは、ファイル システムのバックアップから除外される場合があります。詳細については、バックアップの作成のドキュメント ページをご覧ください。