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

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

고객 호스팅 인스턴스에서 내부 HyperSQL 데이터베이스 크기가 600MB를 초과하면 HyperSQL 데이터베이스를 전체 MySQL 데이터베이스 백엔드로 바꾸는 것이 좋습니다. HyperSQL 데이터베이스의 크기를 확인하려면 looker.script 파일의 크기를 확인합니다.

cd looker
cd .db
ls -lah

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

MySQL 인스턴스 프로비저닝

백엔드로 사용할 MySQL 8.0.x 인스턴스를 프로비저닝합니다. MySQL 8.0 이전 버전은 지원되지 않습니다.

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

MySQL 8.0.X — 기본 인증 플러그인 변경

MySQL 8.0.X에서 기본 인증 플러그인은 caching_sha2_password입니다. Looker는 mysql_native_password 플러그인을 사용하여 JDBC 드라이버를 통해 MySQL 데이터베이스에 인증을 시도합니다. 이 버전의 MySQL이 제대로 작동하려면 다음과 같은 추가 단계를 수행해야 합니다.

  1. mysql_native_password 플러그인을 사용하도록 MySQL 데이터베이스를 구성합니다. 이 작업은 여러 방법으로 수행할 수 있으며, 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_packet1073741824의 최댓값으로 설정합니다.

max_allowed_packet = 1073741824

임시 테이블 알고리즘 설정

MySQL 8은 내부 임시 테이블을 이전 버전과 다르게 처리합니다. 기본 설정으로 인해 Looker가 실행되는 데 필요한 일부 쿼리, 특히 여러 사용자 및 프로젝트가 있는 Looker 인스턴스의 실행에 문제가 발생할 수 있습니다. 권장사항은 다음과 같은 전역 서버 설정을 지정하는 것입니다.

internal_tmp_mem_storage_engine = MEMORY

문자 집합 구성

UTF8 문자 집합을 지원하는 UTF8mb4를 사용하도록 다음 기본 매개변수를 설정합니다. 다음 문서를 참조하세요. MySQL에서는 'utf8'을 사용하지 마세요. 'utf8mb4'를 사용합니다. MySQL에서 UTF8이 아닌 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 인스턴스 매개변수 그룹 설정과 일치하는 선택한 문자 집합 및 콜레이션으로 바꿉니다(true 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 디렉터리에서 <DB_hostname>, <DB_username>, <DB_password>, <DB_name>를 데이터베이스 값으로 바꿔 다음 콘텐츠로 looker-db.yml이라는 파일을 만듭니다.

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.yml 파일의 각 줄에 대한 키/값 목록을 포함하도록 환경 변수 LOOKER_DB를 구성할 수 있습니다. 예를 들면 다음과 같습니다.

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

.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
    
  2. Looker 시작 스크립트에서 파일에 새 두 번째 줄을 만듭니다.

    exit
    
  3. AWS 콘솔에서 인스턴스를 중지합니다. 중지되면 EC2 인스턴스 크기를 m5.2xlarge로 변경합니다. 그런 다음 인스턴스를 다시 백업합니다.

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

    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
    

    이 경우 자바 명령어를 실행하기 전에 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의 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/ 디렉터리는 파일 시스템 백업에서 제외될 수 있습니다. 자세한 내용은 백업 만들기 문서 페이지를 참조하세요.