将 Looker 后端数据库迁移到 MySQL

默认情况下,Looker 使用 HyperSQL 内存数据库来存储其配置、用户和其他数据。在繁忙的实例上,此数据库的大小可以增长到 GB,这可能会导致性能问题、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 实例以用作后端。不支持 8.0 之前的 MySQL 版本。

在 AWS RDS 中,db.m5.large 类的实例可能足以作为单个 Looker 实例的后端。尽管数据库的实际用量可能在 5 到 10 GB 的范围内,但还是建议预配 100 到 150 GB 的固态硬盘存储空间,因为预配的 IOPS 是基于所请求的存储量。

MySQL 8.0.X - 更改默认身份验证插件

在 MySQL 8.0.X 中,默认身份验证插件为 caching_sha2_password。Looker 使用 mysql_native_password 插件尝试通过 JDBC 驱动程序向 MySQL 数据库进行身份验证。为使此版本的 MySQL 正常运行,您必须执行以下额外步骤:

  1. 配置 MySQL 数据库以使用 mysql_native_password 插件。这可以通过多种方式完成,具体取决于 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_packet 设置为 1073741824 允许的最大值:

max_allowed_packet = 1073741824

设置临时表算法

MySQL 8 处理内部临时表的方式与以前的版本不同。默认设置可能会导致系统无法运行 Looker 运行所需的某些查询,对于包含许多用户和项目的 Looker 实例尤其如此。最佳做法是设定以下全局服务器设置:

internal_tmp_mem_storage_engine = MEMORY

配置字符集

请将以下默认参数设置为使用支持 UTF8 字符集的 UTF8mb4。请参阅文章在 MySQL 中,切勿使用“utf8”请使用“utf8mb4”。了解我们建议在 MySQL 中使用 UTF8mb4(而非 UTF8)的原因。

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 binlog。如果您要托管自己的 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 的加密方案,数据库中的所有敏感数据都会进行静态加密。即使有人获得了明文数据库凭据的访问权限并访问了该数据库,Looker 也会在存储敏感数据之前对其进行加密或哈希处理。这适用于密码、分析数据库凭据、查询缓存等。但是,如果您不希望将此配置的明文密码存储在磁盘上的 looker-db.yml 文件中,则可以将环境变量 LOOKER_DB 配置为包含 looker-db.yml 文件中每行的键/值列表。例如:

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

备份 .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
    
  2. 在 Looker 启动脚本中,在文件中另起第二行:

    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 的数据库实例:

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/ 目录。如需了解详情,请参阅创建备份文档页面。