默认情况下,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 实例以用作后端。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 8.0.X - 更改默认身份验证插件
在 MySQL 8.0.X 中,默认的身份验证插件为 caching_sha2_password
。Looker 使用 mysql_native_password
插件尝试通过 JDBC 驱动程序向 MySQL 数据库进行身份验证。为了让此版本的 MySQL 正常工作,您必须采取以下额外步骤:
将 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
参数。
发出以下语句,并将
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 实例。最佳做法是使用旧版 MySQL 5.7 内部临时表算法,方法是设置以下全局服务器设置:
internal_tmp_mem_storage_engine = MEMORY
配置字符集
将以下默认参数设置为使用 UTF8mb4,该编码支持 UTF8 字符集。请参阅文章在 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 依赖于依赖 mixed
或 row
binlog 的功能。如果您要托管自己的 MySQL 实例,请发出以下命令之一,将 binlog_format
设置为 mixed
或 row
:
SET GLOBAL binlog_format = 'MIXED';
或
SET GLOBAL binlog_format = 'ROW';
创建数据库和用户
在数据库实例上创建用户和数据库,注意将 <DB_username>
、<DB_name>
和 <DB_password>
替换为用户和数据库的实际值。此外,还要将 <DB_charset>
和 <DB_collation>
替换为与 RDS 实例组参数设置匹配的所选字符集和排序规则(如需支持真正的 UTF8,建议使用 utf8mb4
和 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>'@'%';
最后一行上的 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
文件中包含每行的键/值列表。例如:
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 分钟所需的时间。
在 Looker 主机上:
cd looker ./looker stop vi looker
在 Looker 启动脚本中,在该文件中另起一行。
exit
在 AWS 控制台中停止实例。停止后,将 EC2 实例大小更改为
m5.2xlarge
。然后重新启动实例。以 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
成功完成上述操作后,从 AWS 控制台停止实例。
您现在可以将实例恢复到原始大小。
再次启动实例。
启动 Looker
修改 Looker 启动脚本,并删除之前添加的
exit
行。确保启动脚本中
LOOKERARGS
内没有定义任何参数。相反,任何参数都应移至lookerstart.cfg
文件,以免被新版启动脚本覆盖。保存并退出启动脚本。修改
lookerstart.cfg
。修改后应如下所示:LOOKERARGS="-d looker-db.yml"
如果 Looker 启动脚本中还有其他参数,请将其添加到
lookerstart.cfg
文件中。归档
.db
目录(如果尚未归档)。mv .db .db-backup tar -zcvf db-backup.tar.gz ./.db-backup rm -rf ./.db-backup/
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/
目录。如需了解详情,请参阅创建备份文档页面。