Looker 백엔드 데이터베이스를 MySQL로 마이그레이션

기본적으로 Looker는 HyperSQL 메모리 내 데이터베이스를 사용하여 구성, 사용자, 기타 데이터를 저장합니다. 사용 중인 인스턴스에서 이 데이터베이스는 크기가 GB가 될 수 있으며, 이로 인해 성능 문제, 자바 메모리 압력 및 긴 시작 시간이 발생할 수 있습니다.

내부 HyperSQL 데이터베이스의 크기가 600MB를 초과하면 HyperSQL 데이터베이스를 전체 MySQL 데이터베이스 백엔드로 대체하는 것이 좋습니다. HyperSQL 데이터베이스의 크기를 확인하려면 looker.script 파일의 크기를 확인하세요.

cd looker
cd .db
ls -lah

looker.script 파일의 크기가 600MB를 초과하면 다음 절차에 따라 외부 MySQL 데이터베이스로 마이그레이션하세요.

이 절차에서는 AWS EC2의 배포를 가정합니다. 로컬 배포의 경우 시스템의 크기는 상응하는 AWS 인스턴스와 비슷한 수준이어야 합니다.

Looker 6.6 이전 버전에서 Looker 6.6 이상으로 업데이트하는 고객은 Looker 업데이트를 수행하고 MySQL 백엔드 DB로 동시에 이전할 수 없습니다. Looker를 업데이트하고 MySQL로 마이그레이션하는 경우 MySQL로 마이그레이션하기 전에 Looker 업데이트를 완료하는 것이 좋습니다.

MySQL 인스턴스 프로비저닝

백엔드로 사용할 MySQL 8.0.x 인스턴스를 프로비저닝합니다. Looker는 MySQL 버전 5.7.x도 지원합니다.

5.7.x 이전 버전의 MySQL은 UTF8mb4 인코딩을 지원하지 않으므로 지원되지 않습니다.

AWS RDS에서는 db.m5.large 클래스의 인스턴스가 단일 Looker 인스턴스의 백엔드로 충분할 수 있습니다. 데이터베이스의 실제 사용량은 5~10GB 범위에 해당할 수 있지만, 프로비저닝된 IOPS는 요청된 스토리지를 기준으로 100~150GB의 SSD 스토리지를 프로비저닝하는 것이 좋습니다.

MySQL 조정

MySQL의 기본 max_allowed_packet 크기는 데이터베이스 이전에 비해 너무 작아 PACKET_TOO_LARGE 오류로 인해 이전이 실패할 수 있습니다. max_allowed_packet을 최대 허용 값 1073741824로 설정합니다.

max_allowed_packet = 1073741824

또한 UTF8 문자 집합을 지원하는 UTF8mb4를 사용하도록 다음 기본 매개변수를 설정합니다. 자세한 내용은 MySQL의 경우 'utf8'을 참조하세요. MySQL에서 UTF8mb4(UTF8 아님) 사용을 권장하는 이유에 대한 자세한 내용은 'quot;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 매개변수를 지정할 수도 있습니다. 예를 들어 특정 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 애플리케이션이 실행되는 Linux '사용자' 계정이 소유한 looker-db.yml 파일 권한을 600으로 설정하는 것이 가장 좋습니다. 이 파일은 Git 저장소에 체크인하면 안 됩니다.

Looker의 암호화 스키마에 따라 데이터베이스의 모든 민감한 정보는 저장 상태에서 암호화됩니다. 누군가 일반 텍스트 데이터베이스 사용자 인증 정보에 액세스하고 데이터베이스에 액세스하더라도 Looker는 저장하기 전에 민감한 정보를 암호화하거나 해싱합니다. 비밀번호, 분석 데이터베이스 사용자 인증 정보, 쿼리 캐시 등에 적용됩니다. 그러나 이 구성의 일반 텍스트 비밀번호를 디스크의 looker-db.yml 파일에 저장하지 않으려면 looker-db.yml 파일의 각 줄에 대한 키/값 목록을 포함하도록 환경 변수 LOOKER_DB를 구성하면 됩니다. 예를 들면 다음과 같습니다.

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

보안 권장사항: MySQL 사용자 계정 사용을 Looker 서버에서 사용하는 IP 주소로 제한하세요.

.db 디렉터리 백업

HyperSQL을 복원해야 할 경우에 대비하여 메모리 내 HyperSQL 데이터베이스를 빌드하는 데 필요한 파일이 포함된 .db 디렉터리를 백업합니다.

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

데이터베이스 마이그레이션

중간 규모 또는 대형 인스턴스에서 데이터베이스를 MySQL로 마이그레이션하는 데 몇 시간이 걸릴 수 있으며 특히 HyperSQL 데이터베이스가 1GB 이상인 경우 시간이 더 걸릴 수 있습니다. EC2 인스턴스를 일시적으로 m5.2xlarge(단계에 지정된 26GB 힙을 허용하도록 32GB RAM 사용)로 업그레이드하는 것이 좋습니다. 이렇게 하면 필요한 시간을 최대 10분으로 단축할 수 있습니다.

  1. Looker 호스트에서 다음을 수행합니다.
    cd looker
    ./looker stop
    vi looker
  1. Looker 시작 스크립트에서 파일에 두 번째 새 줄을 만듭니다.
    exit
  1. AWS 콘솔에서 인스턴스를 중지합니다. 중지가 완료되면 EC2 인스턴스 크기를 m5.2xlarge로 변경합니다. 그런 다음 인스턴스를 다시 시작합니다.

  2. SSH를 통해 Looker 사용자로 호스트에 연결합니다. 먼저 자바가 실행되고 있지 않은지 확인한 후 다음을 실행합니다.

    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. 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 백업이 더 이상 작동하지 않습니다. 최소한 Looker 작업 디렉터리의 야간 파일 시스템 백업과 함께 MySQL 데이터베이스의 야간 백업을 수행하는 것이 좋습니다. looker/log/ 디렉터리는 파일 시스템 백업에서 제외될 수 있습니다. 자세한 내용은 백업 만들기 문서 페이지를 참조하세요.