MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Cara Migrasi Database WHMCS ke MariaDB Galera Cluster

WHMCS adalah solusi manajemen klien, penagihan, dan dukungan all-in-one untuk perusahaan web hosting. Ini adalah salah satu pemimpin di dunia otomatisasi hosting yang digunakan bersama dengan panel kontrol hosting itu sendiri. WHMCS berjalan pada tumpukan LAMP, dengan MySQL/MariaDB sebagai penyedia database. Umumnya, WHMCS diinstal sebagai instans mandiri (aplikasi dan database) secara independen dengan mengikuti panduan instalasi WHMCS, atau melalui alat penginstal perangkat lunak seperti cPanel Site Software atau Softaculous. Basis data dapat dibuat sangat tersedia dengan bermigrasi ke Galera Cluster dari 3 node.

Dalam posting blog ini, kami akan menunjukkan cara memigrasi database WHMCS dari server MySQL mandiri (disediakan oleh server WHM/cPanel itu sendiri) ke MariaDB Galera Cluster tiga node eksternal untuk meningkatkan ketersediaan database. Aplikasi WHMCS sendiri akan tetap berjalan di server cPanel yang sama. Kami juga akan memberi Anda beberapa kiat penyetelan untuk mengoptimalkan kinerja.

Menerapkan Cluster Basis Data

  1. Instal ClusterControl:
    $ whoami
    root
    $ wget https://severalnines.com/downloads/cmon/install-cc
    $ chmod 755 install-cc
    $ ./install-cc
    Ikuti instruksi yang sesuai sampai instalasi selesai. Lalu, buka http://192.168.55.50/clustercontrol (192.168.55.50 menjadi alamat IP dari host ClusterControl) dan mendaftarkan pengguna admin super dengan sandi dan detail lain yang diperlukan.
  2. Setup passwordless SSH dari ClusterControl ke semua node database:
    $ whoami
    root
    $ ssh-keygen -t rsa # Press enter on all prompts
    $ ssh-copy-id 192.168.55.51
    $ ssh-copy-id 192.168.55.52
    $ ssh-copy-id 192.168.55.53
  3. Konfigurasikan penerapan database untuk MariaDB Galera Cluster 3-node kami. Kami akan menggunakan versi terbaru yang didukung MariaDB 10.3: Pastikan Anda mendapatkan semua centang hijau setelah menekan 'Enter' saat menambahkan detail simpul. Tunggu hingga tugas penerapan selesai dan Anda akan melihat cluster database terdaftar di ClusterControl.
  4. Menyebarkan node ProxySQL (kita akan menempatkannya bersama dengan node ClusterControl) dengan masuk ke Manage -> Load Balancer -> ProxySQL -> Deploy ProxySQL . Tentukan detail yang diperlukan berikut ini: Di bawah "Tambah Pengguna Basis Data", Anda dapat meminta ClusterControl untuk membuat pengguna ProxySQL dan MySQL baru saat disiapkan , jadi kami menempatkan pengguna sebagai "portal_whmcs", ditugaskan dengan SEMUA HAK ISTIMEWA pada database "portal_whmcs.*". Kemudian, centang semua kotak untuk "Sertakan" dan terakhir pilih "salah" untuk "Apakah Anda menggunakan transaksi implisit?".

Setelah penerapan selesai, Anda akan melihat sesuatu seperti ini di bawah tampilan Topologi:

Sumber daya terkait Penyedia Hosting Teratas Australia Memanfaatkan ClusterControl untuk Memberikan Pengalaman Kelas Dunia bagi Penggunanya Database Load Balancing untuk MySQL dan MariaDB dengan ProxySQL - Tutorial MySQL Ketersediaan Tinggi di cPanel dengan Galera Cluster

Penyebaran database kami sekarang selesai. Perlu diingat bahwa kami tidak membahas redundansi tingkat penyeimbang beban dalam posting blog ini. Anda dapat mencapainya dengan menambahkan penyeimbang beban sekunder dan menyatukannya dengan Keepalive. Untuk mempelajari lebih lanjut tentang ini, lihat Tutorial ProxySQL di bab "4.2. Ketersediaan tinggi untuk ProxySQL".

Instalasi WHMCS

Jika Anda sudah menginstal dan menjalankan WHMCS, Anda dapat melewati langkah ini.

Perhatikan bahwa WHMCS memerlukan lisensi yang valid yang harus Anda beli sebelumnya untuk menggunakan perangkat lunak. Mereka tidak memberikan lisensi uji coba gratis, tetapi mereka menawarkan jaminan uang kembali 30 hari tanpa pertanyaan, yang berarti Anda selalu dapat membatalkan langganan sebelum penawaran berakhir tanpa dikenakan biaya.

Untuk menyederhanakan proses instalasi, kami akan menggunakan Perangkat Lunak Situs cPanel (Anda dapat memilih instalasi manual WHMCS) ke salah satu sub-domain kami, selfportal.mytest.io. Setelah membuat akun di WHM, buka cPanel> Software> Site Software> WHMCS dan menginstal aplikasi web. Login sebagai pengguna admin dan aktifkan lisensi untuk mulai menggunakan aplikasi.

Pada titik ini, instans WHMCS kami berjalan sebagai penyiapan mandiri, terhubung ke server MySQL lokal.

ClusterControlSingle Console untuk Seluruh Infrastruktur Basis Data AndaCari tahu apa lagi yang baru di ClusterControlInstall ClusterControl GRATIS

Memigrasikan Database WHMCS ke MariaDB Galera Cluster

Menjalankan WHMCS pada server MySQL mandiri memaparkan aplikasi ke titik kegagalan tunggal (SPOF) dari sudut pandang basis data. MariaDB Galera Cluster menyediakan redundansi ke lapisan data dengan fitur pengelompokan bawaan dan dukungan untuk arsitektur multi-master. Gabungkan ini dengan penyeimbang beban basis data, misalnya ProxySQL, dan kami dapat meningkatkan ketersediaan basis data WHMCS dengan perubahan yang sangat minimal pada aplikasi itu sendiri.

Namun, ada beberapa praktik terbaik yang harus diikuti oleh WHMCS (atau aplikasi lain) agar dapat bekerja secara efisien di Galera Cluster, terutama:

  • Semua tabel harus dijalankan di mesin penyimpanan InnoDB/XtraDB.
  • Semua tabel harus memiliki kunci utama yang ditentukan (kunci utama multi-kolom didukung, kunci unik tidak dihitung).

Tergantung pada versi yang diinstal, dalam instalasi lingkungan pengujian kami (cPanel/WHM 11.78.0.23, WHMCS 7.6.0 melalui Perangkat Lunak Situs), dua poin di atas tidak memenuhi persyaratan. Konfigurasi default cPanel/WHM MySQL hadir dengan baris berikut di dalam /etc/my.cnf:

default-storage-engine=MyISAM

Di atas akan menyebabkan tabel tambahan yang dikelola oleh Modul Addon WHMCS dibuat dalam format mesin penyimpanan MyISAM jika modul tersebut diaktifkan. Berikut adalah output dari mesin penyimpanan setelah kami mengaktifkan 2 modul (TLD Baru dan Papan Pemberitahuan Staf):

MariaDB> SELECT tables.table_schema, tables.table_name, tables.engine FROM information_schema.tables WHERE tables.table_schema='whmcsdata_whmcs' and tables.engine <> 'InnoDB';
+-----------------+----------------------+--------+
| table_schema    | table_name           | engine |
+-----------------+----------------------+--------+
| whmcsdata_whmcs | mod_enomnewtlds      | MyISAM |
| whmcsdata_whmcs | mod_enomnewtlds_cron | MyISAM |
| whmcsdata_whmcs | mod_staffboard       | MyISAM |
+-----------------+----------------------+--------+

Dukungan MyISAM bersifat eksperimental di Galera, yang berarti Anda tidak boleh menjalankannya dalam produksi. Dalam beberapa kasus yang lebih buruk, ini dapat membahayakan konsistensi data dan menyebabkan kegagalan replikasi writeset karena sifatnya yang non-transaksional.

Poin penting lainnya adalah bahwa setiap tabel harus memiliki kunci utama yang ditentukan. Bergantung pada prosedur instalasi WHMCS yang Anda lakukan (seperti bagi kami, kami menggunakan Perangkat Lunak Situs cPanel untuk menginstal WHMCS), beberapa tabel yang dibuat oleh penginstal tidak disertai dengan kunci utama yang ditentukan, seperti yang ditunjukkan pada output berikut:

MariaDB [information_schema]> SELECT TABLES.table_schema, TABLES.table_name FROM TABLES LEFT JOIN KEY_COLUMN_USAGE AS c ON (TABLES.TABLE_NAME = c.TABLE_NAME AND c.CONSTRAINT_SCHEMA = TABLES.TABLE_SCHEMA AND c.constraint_name = 'PRIMARY' ) WHERE TABLES.table_schema <> 'information_schema' AND TABLES.table_schema <> 'performance_schema' AND TABLES.table_schema <> 'mysql' and TABLES.table_schema <> 'sys' AND c.constraint_name IS NULL;
+-----------------+------------------------------------+
| table_schema    | table_name                         |
+-----------------+------------------------------------+
| whmcsdata_whmcs | mod_invoicedata                    |
| whmcsdata_whmcs | tbladminperms                      |
| whmcsdata_whmcs | tblaffiliates                      |
| whmcsdata_whmcs | tblconfiguration                   |
| whmcsdata_whmcs | tblknowledgebaselinks              |
| whmcsdata_whmcs | tbloauthserver_access_token_scopes |
| whmcsdata_whmcs | tbloauthserver_authcode_scopes     |
| whmcsdata_whmcs | tbloauthserver_client_scopes       |
| whmcsdata_whmcs | tbloauthserver_user_authz_scopes   |
| whmcsdata_whmcs | tblpaymentgateways                 |
| whmcsdata_whmcs | tblproductconfiglinks              |
| whmcsdata_whmcs | tblservergroupsrel                 |
+-----------------+------------------------------------+

Sebagai catatan tambahan, Galera masih mengizinkan tabel tanpa kunci utama ada. Namun, operasi DELETE tidak didukung pada tabel-tabel tersebut dan akan membuat Anda menghadapi masalah yang jauh lebih besar seperti kerusakan node, penurunan kinerja sertifikasi writeset, atau baris mungkin muncul dalam urutan yang berbeda pada node yang berbeda.

Untuk mengatasinya, rencana migrasi kami harus menyertakan langkah tambahan untuk memperbaiki mesin penyimpanan dan struktur skema, seperti yang ditunjukkan di bagian berikutnya.

Rencana Migrasi

Karena batasan yang dijelaskan di bab sebelumnya, rencana migrasi kita harus seperti ini:

  1. Aktifkan mode pemeliharaan WHMCS
  2. Ambil cadangan basis data whmcs menggunakan pencadangan logis
  3. Ubah file dump untuk memenuhi persyaratan Galera (konversi mesin penyimpanan)
  4. Ambil salah satu node Galera dan biarkan node yang tersisa dimatikan
  5. Kembalikan ke simpul Galera yang dipilih
  6. Perbaiki struktur skema untuk memenuhi persyaratan Galera (kunci utama tidak ada)
  7. Bootstrap cluster dari node Galera yang dipilih
  8. Mulai node kedua dan biarkan sinkronisasi
  9. Mulai node ketiga dan biarkan sinkronisasi
  10. Ubah database yang menunjuk ke titik akhir yang sesuai
  11. Nonaktifkan mode pemeliharaan WHMCS

Arsitektur baru dapat diilustrasikan seperti di bawah ini:

Nama database WHMCS kami di server cPanel adalah "whmcsdata_whmcs" dan kami akan memigrasikan database ini ke MariaDB Galera Cluster tiga simpul eksternal yang digunakan oleh ClusterControl. Di atas server database, kami memiliki ProxySQL (berlokasi bersama dengan ClusterControl) yang berfungsi sebagai penyeimbang beban MariaDB, menyediakan titik akhir tunggal ke instans WHMCS kami. Nama database pada cluster akan diubah menjadi "portal_whmcs", sehingga kita dapat dengan mudah membedakannya.

Pertama, aktifkan Mode Pemeliharaan seluruh situs dengan masuk ke WHMCS> Setup> General Settings> General> Maintenance Mode> Centang untuk mengaktifkan - mencegah akses area klien saat diaktifkan . Ini akan memastikan tidak akan ada aktivitas dari pengguna akhir selama operasi pencadangan basis data.

Karena kita harus membuat sedikit modifikasi pada struktur skema agar sesuai dengan Galera, sebaiknya buat dua file dump terpisah. Satu dengan skema saja dan satu lagi untuk data saja. Di server WHM, jalankan perintah berikut sebagai root:

$ mysqldump --no-data -uroot whmcsdata_whmcs > whmcsdata_whmcs_schema.sql
$ mysqldump --no-create-info -uroot whmcsdata_whmcs > whmcsdata_whmcs_data.sql

Kemudian, kita harus mengganti semua kemunculan MyISAM di file dump skema dengan 'InnoDB':

$ sed -i 's/MyISAM/InnoDB/g' whmcsdata_whmcs_schema.sql

Verifikasi bahwa kami tidak memiliki baris MyISAM lagi di file dump (seharusnya tidak menghasilkan apa-apa):

$ grep -i 'myisam' whmcsdata_whmcs_schema.sql

Transfer file dump dari server WHM ke mariadb1 (192.168.55.51):

$ scp whmcsdata_whmcs_* 192.168.55.51:~

Buat database MySQLnya. Dari ClusterControl, buka Kelola -> Skema dan Pengguna -> Buat Basis Data dan tentukan nama databasenya. Di sini kita menggunakan nama database yang berbeda yang disebut "portal_whmcs". Jika tidak, Anda dapat membuat database secara manual dengan perintah berikut:

$ mysql -uroot -p 
MariaDB> CREATE DATABASE 'portal_whmcs';

Buat pengguna MySQL untuk database ini dengan hak istimewanya. Dari ClusterControl, buka Kelola -> Skema dan Pengguna -> Pengguna -> Buat Pengguna Baru dan tentukan berikut ini:

Jika Anda memilih untuk membuat pengguna MySQL secara manual, jalankan pernyataan berikut:

$ mysql -uroot -p 
MariaDB> CREATE USER 'portal_whmcs'@'%' IDENTIFIED BY 'ghU51CnPzI9z';
MariaDB> GRANT ALL PRIVILEGES ON portal_whmcs.* TO [email protected]'%';

Perhatikan bahwa pengguna database yang dibuat harus diimpor ke ProxySQL, untuk memungkinkan aplikasi WHMCS mengautentikasi terhadap penyeimbang beban. Buka Node -> pilih node ProxySQL -> Pengguna -> Impor Pengguna dan pilih "portal_whmcs"@"%", seperti yang ditunjukkan pada tangkapan layar berikut:

Di jendela berikutnya (Pengaturan Pengguna), tentukan Hostgroup 10 sebagai grup host default:

Sekarang tahap persiapan restorasi telah selesai.

Di Galera, memulihkan database besar melalui mysqldump pada cluster node tunggal lebih efisien, dan ini meningkatkan waktu pemulihan secara signifikan. Jika tidak, setiap node dalam cluster harus mengesahkan setiap pernyataan dari input mysqldump, yang akan membutuhkan waktu lebih lama untuk diselesaikan.

Karena kita sudah menjalankan MariaDB Galera Cluster tiga node, mari hentikan layanan MySQL pada mariadb2 dan mariadb3, satu node pada satu waktu untuk menurunkan skala dengan anggun. Untuk mematikan node database, dari ClusterControl, cukup buka Nodes -> Node Actions -> Stop Node -> Lanjutkan . Inilah yang akan Anda lihat dari dasbor ClusterControl, di mana ukuran cluster adalah 1 dan status db1 adalah Disinkronkan dan Utama:

Kemudian, pada mariadb1 (192.168.55.51), pulihkan skema dan data yang sesuai:

$ mysql -uportal_whmcs -p portal_whmcs < whmcsdata_whmcs_schema.sql
$ mysql -uportal_whmcs -p portal_whmcs < whmcsdata_whmcs_data.sql

Setelah diimpor, kita harus memperbaiki struktur tabel untuk menambahkan kolom "id" yang diperlukan (kecuali untuk tabel "tblaffiliates") serta menambahkan kunci utama pada semua tabel yang tidak ada:

$ mysql -uportal_whmcs -p
MariaDB> USE portal_whmcs;
MariaDB [portal_whmcs]> ALTER TABLE `tblaffiliates` ADD PRIMARY KEY (id);
MariaDB [portal_whmcs]> ALTER TABLE `mod_invoicedata` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbladminperms` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblconfiguration` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblknowledgebaselinks` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbloauthserver_access_token_scopes` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbloauthserver_authcode_scopes` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbloauthserver_client_scopes` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tbloauthserver_user_authz_scopes` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblpaymentgateways` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblproductconfiglinks` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
MariaDB [portal_whmcs]> ALTER TABLE `tblservergroupsrel` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

Atau, kita dapat menerjemahkan pernyataan berulang di atas menggunakan loop dalam skrip bash:

#!/bin/bash

db_user='portal_whmcs'
db_pass='ghU51CnPzI9z'
db_whmcs='portal_whmcs'
tables=$(mysql -u${db_user} "-p${db_pass}"  information_schema -A -Bse "SELECT TABLES.table_name FROM TABLES LEFT JOIN KEY_COLUMN_USAGE AS c ON (TABLES.TABLE_NAME = c.TABLE_NAME AND c.CONSTRAINT_SCHEMA = TABLES.TABLE_SCHEMA AND c.constraint_name = 'PRIMARY' ) WHERE TABLES.table_schema <> 'information_schema' AND TABLES.table_schema <> 'performance_schema' AND TABLES.table_schema <> 'mysql' and TABLES.table_schema <> 'sys' AND c.constraint_name IS NULL;")
mysql_exec="mysql -u${db_user} -p${db_pass} $db_whmcs -e"

for table in $tables
do
        if [ "${table}" = "tblaffiliates" ]
        then
                $mysql_exec "ALTER TABLE ${table} ADD PRIMARY KEY (id)";
        else
                $mysql_exec "ALTER TABLE ${table} ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST";
        fi
done

Pada titik ini, aman untuk memulai node yang tersisa untuk disinkronkan dengan mariadb1. Mulailah dengan mariadb2 dengan membuka Node -> pilih db2 -> Node Actions -> Start Node . Pantau kemajuan pekerjaan dan pastikan mariadb2 dalam status Tersinkronisasi dan Utama (pantau halaman Ikhtisar untuk detailnya) sebelum memulai mariadb3.

Terakhir, ubah database yang menunjuk ke host ProxySQL pada port 6033 di dalam file konfigurasi WHMCS, seperti dalam kasus kami yang terletak di /home/whmcsdata/public_html/configuration.php:

$ vim configuration.php
<?php
$license = 'WHMCS-XXXXXXXXXXXXXXXXXXXX';
$templates_compiledir = 'templates_c';
$mysql_charset = 'utf8';
$cc_encryption_hash = 'gLg4oxuOWsp4bMleNGJ--------30IGPnsCS49jzfrKjQpwaN';
$db_host = 192.168.55.50;
$db_port = '6033';
$db_username = 'portal_whmcs';
$db_password = 'ghU51CnPzI9z';
$db_name = 'portal_whmcs';

$customadminpath = 'admin2d27';

Jangan lupa untuk menonaktifkan mode pemeliharaan WHMCS dengan masuk ke WHMCS> Setup> General Settings> General> Maintenance Mode> hapus centang "Centang untuk mengaktifkan - mencegah akses area klien saat diaktifkan" . Latihan migrasi database kami sekarang selesai.

Pengujian dan Penyetelan

Anda dapat memverifikasi apakah dengan melihat entri kueri ProxySQL di bawah Node -> ProxySQL -> Top Queries :

Untuk kueri baca-saja yang paling sering diulang (Anda dapat mengurutkannya berdasarkan Count Star), Anda dapat menyimpannya dalam cache untuk meningkatkan waktu respons dan mengurangi jumlah klik ke server backend. Cukup gulir ke kueri apa pun dan klik Kueri Cache, dan pop-up berikut akan muncul:

Yang perlu Anda lakukan adalah hanya memilih grup host tujuan dan klik "Tambah Aturan". Anda kemudian dapat memverifikasi apakah kueri yang di-cache terkena di bawah tab "Aturan":

Dari aturan kueri itu sendiri, kita dapat mengetahui bahwa pembacaan (semua SELECT kecuali SELECT .. FOR UPDATE) diteruskan ke hostgroup 20 di mana koneksi didistribusikan ke semua node sementara penulisan (selain SELECT) diteruskan ke hostgroup 10, di mana koneksi diteruskan ke satu simpul Galera saja. Konfigurasi ini meminimalkan risiko kebuntuan yang mungkin disebabkan oleh penyiapan multi-master, yang meningkatkan kinerja replikasi secara keseluruhan.

Itu saja untuk saat ini. Selamat mengelompokkan!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mempersiapkan Server MySQL atau MariaDB untuk Produksi - Bagian Satu

  2. Menggunakan Plugin Log Audit Percona untuk Keamanan Basis Data

  3. Enkripsi Basis Data:Mengapa dan Di Mana Anda Perlu Memiliki Enkripsi Data

  4. Sepuluh Tips Cara Mencapai Keamanan MySQL dan MariaDB

  5. MariaDB LTRIM() vs LTRIM_ORACLE():Apa Bedanya?