Memigrasikan database backend Looker ke MySQL

Secara default, Looker menggunakan database dalam memori HyperSQL untuk menyimpan konfigurasi, pengguna, dan data lainnya. Pada instance yang sibuk, database ini dapat tumbuh hingga berukuran gigabyte, yang dapat menyebabkan masalah performa, tekanan memori Java, dan waktu startup yang lama.

Pada instance yang dihosting pelanggan, sebaiknya ganti database HyperSQL dengan backend database MySQL lengkap jika ukuran database HyperSQL internal melebihi 600 MB. Untuk memeriksa ukuran database HyperSQL, lihat ukuran file looker.script:

cd looker
cd .db
ls -lah

Jika ukuran file looker.script melebihi 600 MB, ikuti prosedur berikut untuk bermigrasi ke database MySQL eksternal.

Menyediakan instance MySQL

Sediakan instance MySQL 8.0.x untuk digunakan sebagai backend. Versi MySQL sebelum 8.0 tidak didukung.

Di AWS RDS, instance class db.m5.large mungkin sudah cukup sebagai backend untuk satu instance Looker. Meskipun penggunaan database yang sebenarnya kemungkinan akan berada dalam rentang 5-10 GB, sebaiknya sediakan penyimpanan SSD sebesar 100-150 GB karena IOPS yang disediakan didasarkan pada jumlah penyimpanan yang diminta.

MySQL 8.0.X — mengubah plugin autentikasi default

Di MySQL 8.0.X, plugin autentikasi default adalah caching_sha2_password. Looker menggunakan plugin mysql_native_password untuk mencoba mengautentikasi ke database MySQL melalui driver JDBC. Agar versi MySQL ini berfungsi dengan benar, Anda harus melakukan langkah-langkah tambahan berikut:

  1. Konfigurasikan database MySQL untuk menggunakan plugin mysql_native_password. Hal ini dapat dilakukan dengan beberapa cara, dan akan bergantung pada cara database MySQL 8 Anda di-deploy dan jenis akses yang Anda miliki ke konfigurasi:

    • Mulai proses dengan flag --default-auth=mysql_native_password

    • Tetapkan properti di file konfigurasi my.cnf:

      [mysqld]
      default-authentication-plugin=mysql_native_password
      
    • Jika instance database Anda dihosting melalui AWS RDS, tetapkan parameter default_authentication_plugin melalui Grup Parameter RDS yang diterapkan ke instance database ini.

  2. Buat pernyataan berikut, dengan mengganti some_password_here dengan sandi unik dan aman:

    CREATE USER looker IDENTIFIED WITH mysql_native_password BY 'some_password_here';
    GRANT SELECT ON database_name.* TO 'looker'@'%';
    

Menyesuaikan MySQL

Sesuaikan setelan berikut di instance MySQL Anda.

Meningkatkan ukuran paket maksimum

Ukuran max_allowed_packet default MySQL terlalu kecil untuk migrasi database dan dapat menyebabkan migrasi gagal dengan error PACKET_TOO_LARGE. Tetapkan max_allowed_packet ke nilai maksimum yang diizinkan, yaitu 1073741824:

max_allowed_packet = 1073741824

Menetapkan algoritma tabel sementara

MySQL 8 menangani tabel sementara internal secara berbeda dari versi sebelumnya. Setelan default dapat menyebabkan masalah saat menjalankan beberapa kueri yang diperlukan agar Looker dapat berjalan, terutama untuk instance Looker dengan banyak pengguna dan project. Praktik terbaiknya adalah menetapkan setelan server global berikut:

internal_tmp_mem_storage_engine = MEMORY

Mengonfigurasi himpunan karakter

Tetapkan parameter default berikut untuk menggunakan UTF8mb4, yang mendukung himpunan karakter UTF8. Lihat artikel Di MySQL, jangan pernah gunakan "utf8". Gunakan "utf8mb4". untuk mengetahui informasi tentang alasan kami merekomendasikan penggunaan UTF8mb4 — bukan UTF8 — dengan MySQL.

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

Pada instance Amazon RDS, Anda menerapkan setelan ini dengan membuat atau mengubah grup parameter dan mengedit setelan yang sesuai. Sebaiknya salin grup parameter saat ini dan buat perubahan pada salinan, terutama jika Anda membagikan grup parameter di beberapa instance RDS. Setelah menyimpan grup parameter, terapkan ke instance RDS. Anda mungkin perlu memulai ulang.

Menetapkan skema replika

Looker mengandalkan fungsi yang memerlukan binlog mixed atau row. Jika Anda menghosting instance MySQL sendiri, tetapkan binlog_format ke mixed atau row dengan mengeluarkan salah satu perintah berikut:

SET GLOBAL binlog_format = 'MIXED';

atau

SET GLOBAL binlog_format = 'ROW';

Membuat database dan pengguna

Buat pengguna dan database di instance database, dengan mengganti <DB_username>, <DB_name>, dan <DB_password> dengan nilai sebenarnya untuk pengguna dan database. Ganti juga <DB_charset> dan <DB_collation> dengan kumpulan karakter dan pemeriksaan yang dipilih yang cocok dengan setelan grup parameter instance RDS (untuk dukungan UTF8 yang sebenarnya, sebaiknya gunakan utf8mb4 dan 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>'@'%';

Database looker_tmp di baris terakhir tidak harus benar-benar ada, tetapi pernyataan grant diperlukan untuk pelaporan internal.

Membuat file kredensial database

Looker perlu mengetahui database MySQL mana yang akan dihubungkan dan kredensial mana yang akan digunakan. Di direktori Looker, buat file bernama looker-db.yml dengan konten berikut, dengan mengganti <DB_hostname>, <DB_username>, <DB_password>, dan <DB_name> dengan nilai untuk database Anda:

dialect: mysql
host: <DB_hostname>
username: <DB_username>
password: <DB_password>
database: <DB_name>
port: 3306

Jika database MySQL Anda memerlukan koneksi SSL, tambahkan baris berikut ke looker-db.yml:

ssl: true

Jika Anda juga ingin mengaktifkan verifikasi sertifikat SSL, tambahkan baris berikut ke looker-db.yml:

verify_ssl: true

Secara opsional, Anda juga dapat menentukan parameter JDBC tambahan lainnya yang didukung oleh Driver JDBC MariaDB dengan menambahkan jdbc_additional_params. Misalnya, jika perlu menggunakan file Trust Store tertentu, Anda dapat menambahkan parameter berikut ke string koneksi JDBC MySQL:

jdbc_additional_params: trustStore=/path/to/my/truststore.jks&keyStore=/path/to/my/keystore.jks

Untuk penginstalan yang dihosting pelanggan, Anda dapat menentukan jumlah maksimum koneksi yang dapat dibuat Looker dengan database Anda secara opsional dengan menambahkan max_connections. Misalnya, untuk membatasi jumlah koneksi serentak ke database Anda menjadi 10, tambahkan hal berikut:

max_connections: 10

Berdasarkan skema enkripsi Looker, semua data sensitif dalam database dienkripsi saat dalam penyimpanan. Meskipun seseorang mendapatkan akses ke kredensial database teks biasa dan mengakses database, Looker mengenkripsi atau melakukan hashing pada data sensitif sebelum menyimpannya. Hal ini berlaku untuk sandi, kredensial database analisis, cache kueri, dan sebagainya. Namun, jika tidak ingin menyimpan sandi cleartext untuk konfigurasi ini dalam file looker-db.yml di disk, Anda dapat mengonfigurasi variabel lingkungan LOOKER_DB agar berisi daftar kunci/nilai untuk setiap baris dalam file looker-db.yml. Contoh:

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

Mencadangkan direktori .db

Cadangkan direktori .db, yang berisi file yang diperlukan untuk mem-build database HyperSQL dalam memori, jika Anda perlu memulihkan HyperSQL:

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

Memigrasikan database

Memigrasikan database ke MySQL dapat memerlukan waktu berjam-jam pada instance berukuran sedang atau besar, terutama jika database HyperSQL berukuran 1 GB atau lebih. Sebaiknya upgrade instance EC2 ke m5.2xlarge untuk sementara (dengan RAM 32 GB untuk mengizinkan heap 26 GB yang ditentukan dalam langkah-langkah) selama migrasi, yang akan mengurangi waktu yang diperlukan menjadi ~10 menit.

  1. Di host Looker:

    cd looker
    ./looker stop
    vi looker
    
  2. Dalam skrip startup Looker, buat baris kedua baru dalam file:

    exit
    
  3. Hentikan instance di konsol AWS. Setelah berhenti, ubah ukuran instance EC2 menjadi m5.2xlarge. Kemudian, mulai ulang instance lagi.

  4. Lakukan SSH ke host sebagai pengguna Looker. Pertama, pastikan Java tidak berjalan; lalu jalankan:

    cd looker
    java -Xms26000m -Xmx26000m -jar looker.jar migrate_internal_data  looker-db.yml
    

    Saat menjalankan langkah migrate_internal_data, libcrypt mungkin tidak ditemukan dan pelacakan tumpukan akan muncul, dimulai dengan ini:

    NotImplementedError: getppid unsupported or native support failed to load
    ppid at org/jruby/RubyProcess.java:752
    ppid at org/jruby/RubyProcess.java:749
    

    Jika hal ini terjadi, tetapkan LD_LIBRARY_PATH secara manual sebelum menjalankan perintah Java:

    export LD_LIBRARY_PATH=$HOME/looker/.tmp/:$LD_LIBRARY_PATH
    
  5. Setelah berhasil selesai, hentikan instance dari konsol AWS.

  6. Sekarang Anda dapat memulihkan instance ke ukuran aslinya.

  7. Mulai instance lagi.

Memulai Looker

  1. Edit skrip startup Looker dan hapus baris exit yang Anda tambahkan sebelumnya.

  2. Pastikan tidak ada argumen yang ditentukan di LOOKERARGS dalam skrip startup. Sebagai gantinya, argumen apa pun harus dipindahkan ke file lookerstart.cfg agar tidak ditimpa oleh skrip startup versi baru. Simpan dan keluar dari skrip startup.

  3. Edit lookerstart.cfg. Tampilannya akan terlihat seperti berikut:

    LOOKERARGS="-d looker-db.yml"
    

    Jika ada argumen lain dalam skrip startup Looker, tambahkan argumen tersebut ke file lookerstart.cfg.

  4. Arsipkan direktori .db, jika belum diarsipkan.

    mv .db .db-backup
    tar -zcvf db-backup.tar.gz ./.db-backup
    rm -rf ./.db-backup/
    
  5. Mulai Looker:

    ./looker start
    

Memverifikasi bahwa Looker menggunakan database baru

Jika Looker berhasil menggunakan MySQL backend, Anda akan melihat koneksi jaringan antara instance Looker dan instance database baru. Untuk memeriksanya, jalankan perintah berikut di instance Looker:

netstat -na | grep 3306

Anda akan melihat beberapa koneksi ke instance database. Berikut adalah contoh output, yang menampilkan instance DB di alamat 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

Mencadangkan Looker

Setelah Anda bermigrasi ke backend MySQL, pencadangan S3 otomatis Looker tidak akan berfungsi lagi. Sebaiknya lakukan pencadangan database MySQL minimal setiap malam bersama dengan pencadangan sistem file setiap malam dari direktori kerja Looker. Direktori looker/log/ dapat dikecualikan dari pencadangan sistem file. Lihat halaman dokumentasi Membuat cadangan untuk mengetahui informasi selengkapnya.