將 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 的 SSD 儲存空間,因為系統會根據要求的儲存空間量來配置 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

設定字元集

將下列預設參數設為 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 會使用需要 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 參數。舉例來說,如果您需要使用特定信任存放區檔案,可以將下列參數新增至 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 (RAM 為 32 GB,可允許步驟中指定的 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/ 目錄可能會從檔案系統備份中排除。詳情請參閱「建立備份」說明文件頁面。