将 Looker 后端数据库迁移到 MySQL

默认情况下,Looker 使用 HyperSQL 内存数据库来存储其配置、用户和其他数据。在繁忙的实例上,此数据库的大小可能会达到 GB,这可能会导致性能问题、Java 内存压力和启动时间过长。

当内部 HyperSQL 数据库大小超过 600 MB 时,我们建议您用完整的 MySQL 数据库后端替换 HyperSQL 数据库。如需检查 HyperSQL 数据库的大小,请查看 looker.script 文件的大小:

cd looker
cd .db
ls -lah

如果 looker.script 文件超过 600 MB,请按照以下步骤迁移到外部 MySQL 数据库。

此过程假定您在 AWS EC2 中进行了部署。对于本地部署,系统大小应与等效的 AWS 实例相当。

如果客户从 Looker 6.6 之前的版本升级到 Looker 6.6 或更高版本,则无法同时执行 Looker 更新并同时迁移到 MySQL 后端数据库。如果您要更新 Looker 并迁移到 MySQL,我们建议您先完成 Looker 更新,然后再执行迁移到 MySQL 的操作。

预配 MySQL 实例

预配一个 MySQL 8.0.x 实例以用作后端。Looker 还支持 MySQL 5.7.x 版本。

5.7.x 之前的 MySQL 版本不受支持,因为它们不支持 UTF8mb4 编码。

在 AWS RDS 中,db.m5.large 类的实例可能足以作为单个 Looker 实例的后端。即使数据库的实际使用量可能在 5-10 GB 范围内,但预配 100-150 GB 的 SSD 也不失为一个好办法,因为预配的 IOPS 基于请求的存储空间大小。

调整 MySQL

MySQL 的默认 max_allowed_packet 大小对于数据库迁移而言过小,可能会导致迁移失败,并显示 PACKET_TOO_LARGE 错误。将 max_allowed_packet 设置为 1073741824 的最大值:

max_allowed_packet = 1073741824

此外,请将以下默认参数设置为使用 UTF8mb4(支持 UTF8 字符集)。请参阅文章 在 MySQL 中,切勿使用“utf8”。使用“utf8mb4”可了解为何我们建议将 UTF8mb4(而不是 UTF8)与 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

在 Amazon RDS 实例上,您可以通过创建或修改参数组并修改相应设置来应用此设置。我们建议您复制当前参数组并在副本中进行更改,尤其是在多个 RDS 实例之间共享参数组时。保存参数组后,将其应用到 RDS 实例。可能需要重新启动。

设置副本方案

Looker 依赖于需要 mixedrow 二进制日志的功能。如果您要托管自己的 MySQL 实例,请通过发出以下某个命令将 binlog_format 设置为 mixedrow

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 参数。例如,如果您需要使用特定的 Trust Store 文件,可以将以下参数添加到 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-db.yml 文件权限设置为 600,该权限归执行 Looker 应用的 Linux“用户”帐号所有。切勿将此文件签入 Git 代码库。

根据 Looker 的加密方案,数据库中的所有敏感数据都会经过静态加密。即使有人获得了对明文数据库凭据的访问权限并访问数据库,Looker 也会在存储之前对敏感数据进行加密或哈希处理。这适用于密码、分析数据库凭据、查询缓存等。但是,如果您不想将此配置的明文密码存储在磁盘的 looker-db.yml 文件中,则可以配置环境变量 LOOKER_DB,使其包含 looker-db.yml 文件中每一行的键值对。例如:

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

安全建议:仅限您的 Looker 服务器使用的 IP 地址使用 MySQL 用户帐号。

备份 .db 目录

备份 .db 目录,其中包含构建内存中的 HyperSQL 数据库所需的文件,以备在需要恢复 HyperSQL 时使用:

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

迁移数据库

将数据库迁移到 MySQL 时,中型或大型实例可能需要几个小时,特别是在 HyperSQL 数据库至少为 1 GB 时。我们建议您在迁移过程中将 EC2 实例暂时升级为 m5.2xlarge(32 GB RAM 以支持步骤中指定的 26 GB 堆),从而将所需时间缩减到大约 10 分钟。

  1. 在 Looker 主机上:
    cd looker
    ./looker stop
    vi looker
  1. 在 Looker 启动脚本中,在文件中另起一行代码:
    exit
  1. 在 AWS 控制台中停止实例。停止后,将 EC2 实例大小更改为 m5.2xlarge。然后再次启动实例。

  2. 以 Looker 用户身份通过 SSH 连接到主机。首先确保 Java 未运行,然后运行以下命令:

    cd looker
    java -Xms26000m -Xmx26000m -jar looker.jar migrate_internal_data  looker-db.yml
When running the `migrate_internal_data` step, `libcrypt` may not be found and a stack trace will appear, starting with this:
    NotImplementedError: getppid unsupported or native support failed to load
    ppid at org/jruby/RubyProcess.java:752
    ppid at org/jruby/RubyProcess.java:749
If this happens, set the `LD_LIBRARY_PATH` manually before executing the Java command:
    export LD_LIBRARY_PATH=$HOME/looker/.tmp/:$LD_LIBRARY_PATH
  1. 成功完成后,请从 AWS 控制台停止该实例。

  2. 您现在可以将实例恢复为原始大小。

  3. 再次启动实例。

启动 Looker

  1. 修改 Looker 启动脚本,并删除您之前添加的 exit 行。

  2. 确保启动脚本中 LOOKERARGS 中没有定义任何参数。相反,所有参数都应移至 lookerstart.cfg 文件,以免被新版本的启动脚本覆盖。保存并退出启动脚本。

  3. 修改“lookerstart.cfg”。修改后应如下所示:

    LOOKERARGS="-d looker-db.yml"
If there were any other arguments in the Looker startup script, add them to the `lookerstart.cfg` file.
  1. 归档 .db 目录(如果尚未归档)。
    mv .db .db-backup
    tar -zcvf db-backup.tar.gz ./.db-backup
    rm -rf ./.db-backup/
  1. Start Looker:
    ./looker start

验证 Looker 是否在使用新数据库

如果 Looker 成功使用后端 MySQL,您应该会看到 Looker 实例和新的数据库实例之间的网络连接。如需检查这一点,请在 Looker 实例上运行以下命令:

netstat -na | grep 3306

您应该会看到与数据库实例的一些连接。以下是一个示例输出,显示了 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

正在备份 Looker

迁移到 MySQL 后端后,Looker 的自动 S3 备份将失效。我们建议至少每晚备份 MySQL 数据库一次和备份 Looker 工作目录的文件系统。looker/log/ 目录可能会从文件系统备份中排除。如需了解详情,请参阅创建备份文档页面。