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

Replikasi MySQL dengan ProxySQL di Server WHM/cPanel:Bagian Satu

WHM dan cPanel tidak diragukan lagi merupakan panel kontrol hosting paling populer untuk lingkungan berbasis Linux. Ini mendukung sejumlah backend database - MySQL, MariaDB dan PostgreSQL sebagai penyimpanan data aplikasi. WHM hanya mendukung pengaturan database mandiri dan Anda dapat menerapkannya secara lokal (konfigurasi default) atau jarak jauh, dengan mengintegrasikan dengan server database eksternal. Yang terakhir akan lebih baik jika Anda ingin memiliki distribusi beban yang lebih baik, karena WHM/cPanel menangani sejumlah proses dan aplikasi seperti HTTP(S), FTP, DNS, MySQL, dan semacamnya.

Dalam posting blog ini, kami akan menunjukkan kepada Anda bagaimana mengintegrasikan pengaturan replikasi MySQL eksternal ke WHM dengan mulus, untuk meningkatkan ketersediaan database dan membongkar server hosting WHM/cPanel. Penyedia hosting yang menjalankan MySQL secara lokal di server WHM akan mengetahui betapa menuntut MySQL dalam hal pemanfaatan sumber daya (bergantung pada jumlah akun yang dihosting dan spesifikasi server).

Replikasi MySQL di WHM/cPanel

Secara default, WHM secara native mendukung MariaDB dan MySQL sebagai setup mandiri. Anda dapat melampirkan server MySQL eksternal ke WHM, tetapi itu akan bertindak sebagai host mandiri. Selain itu, pengguna cPanel harus mengetahui alamat IP server MySQL dan secara manual menentukan host eksternal di aplikasi web mereka jika fitur ini diaktifkan.

Dalam posting blog ini, kita akan menggunakan file soket UNIX ProxySQL untuk mengelabui WHM/cPanel dalam menghubungkan ke server MySQL eksternal melalui file soket UNIX. Dengan cara ini, Anda dapat merasakan menjalankan MySQL secara lokal sehingga pengguna dapat menggunakan "localhost" dengan port 3306 sebagai host database MySQL mereka.

Diagram berikut mengilustrasikan arsitektur akhir:

Kami memiliki server WHM baru, diinstal dengan WHM/cPanel 80.0 (build 18). Kemudian kami memiliki tiga server lain - satu untuk ClusterControl dan dua untuk replikasi master-slave. ProxySQL akan diinstal pada server WHM itu sendiri.

Menyebarkan Replikasi MySQL

Pada saat penulisan ini, kami menggunakan WHM 80.0 (build 18) yang hanya mendukung hingga MySQL 5.7 dan MariaDB 10.3. Dalam hal ini, kita akan menggunakan MySQL 5.7 dari Oracle. Kami menganggap Anda telah menginstal ClusterControl di server ClusterControl.

Pertama, atur SSH tanpa kata sandi dari server ClusterControl ke server replikasi MySQL. Di server ClusterControl, lakukan:

$ ssh-copy-id 192.168.0.31
$ ssh-copy-id 192.168.0.32

Pastikan Anda dapat menjalankan perintah berikut di ClusterControl tanpa prompt kata sandi di antaranya:

$ ssh 192.168.0.31 "sudo ls -al /root"
$ ssh 192.168.0.32 "sudo ls -al /root"

Lalu pergi ke ClusterControl -> Deploy -> MySQL Replication dan masukkan informasi yang diperlukan. Pada langkah kedua, pilih Oracle sebagai vendor dan 5.7 sebagai versi database:

Kemudian, tentukan alamat IP master dan slave:

Perhatikan tanda centang hijau tepat sebelum alamat IP. Artinya ClusterControl dapat terhubung ke server dan siap untuk langkah selanjutnya. Klik Terapkan untuk memulai penerapan. Proses penerapan akan memakan waktu 15 hingga 20 menit.

Menyebarkan ProxySQL di WHM/cPanel

Karena kami ingin ProxySQL mengambil alih port default MySQL 3306, kami harus terlebih dahulu memodifikasi server MySQL yang ada yang diinstal oleh WHM untuk mendengarkan port lain dan file soket lainnya. Di /etc/my.cnf, ubah baris berikut (tambahkan jika tidak ada):

socket=/var/lib/mysql/mysql2.sock
port=3307
bind-address=127.0.0.1

Kemudian, restart server MySQL di server cPanel:

$ systemctl restart mysqld

Pada titik ini, server MySQL lokal harus mendengarkan pada port 3307, hanya mengikat ke localhost (kami menutupnya dari akses eksternal agar lebih aman). Sekarang kita dapat melanjutkan untuk menerapkan ProxySQL pada host WHM, 192.168.0.16 melalui ClusterControl.

Pertama, siapkan SSH tanpa kata sandi dari node ClusterControl ke server WHM yang ingin kita instal ProxySQL:

(clustercontrol)$ ssh-copy-id [email protected]

Pastikan Anda dapat menjalankan perintah berikut di ClusterControl tanpa prompt kata sandi di antaranya:

(clustercontrol)$ ssh 192.168.0.16 "sudo ls -al /root"

Lalu, buka ClusterControl -> Manage -> Load Balancers -> ProxySQL -> Deploy ProxySQL dan tentukan informasi yang diperlukan:

Isi semua detail yang diperlukan seperti yang disorot oleh panah di atas dalam diagram. Alamat server adalah server WHM, 192.168.0.16. Port mendengarkan adalah 3306 di server WHM, mengambil alih MySQL lokal yang sudah berjalan di port 3307. Lebih jauh ke bawah, kami menentukan admin ProxySQL dan memantau kata sandi pengguna. Kemudian sertakan kedua server MySQL ke dalam set penyeimbangan beban dan kemudian pilih "Tidak" di bagian Transaksi Implisit. Klik Deploy ProxySQL untuk memulai penerapan.

ProxySQL kami sekarang diinstal dan dikonfigurasi dengan dua grup host untuk Replikasi MySQL. Satu untuk grup penulis (hostgroup 10), di mana semua koneksi akan diteruskan ke master dan grup pembaca (hostgroup 20) untuk semua beban kerja hanya-baca yang akan diseimbangkan ke kedua server MySQL.

Langkah selanjutnya adalah memberikan pengguna root MySQL dan mengimpornya ke ProxySQL. Kadang-kadang, WHM entah bagaimana terhubung ke database melalui koneksi TCP, melewati file soket UNIX. Dalam hal ini, kami harus mengizinkan akses root MySQL dari [email protected] dan [email protected] (alamat IP server WHM) di cluster replikasi kami.

Jadi, menjalankan pernyataan berikut di server master (192.168.0.31) diperlukan:

(master)$ mysql -uroot -p
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.16' IDENTIFIED BY '[email protected]' WITH GRANT OPTION;

Kemudian, impor pengguna 'root'@'localhost' dari server MySQL kami ke pengguna ProxySQL dengan masuk ke ClusterControl -> Nodes -> pilih node ProxySQL -> Users -> Import Users . Anda akan disajikan dengan dialog berikut:

Centang kotak [email protected] dan klik Next. Di Setelan Pengguna halaman, pilih hostgroup 10 sebagai hostgroup default untuk pengguna:

Kami kemudian dapat memverifikasi apakah ProxySQL berjalan dengan benar di server WHM/cPanel dengan menggunakan perintah berikut:

$ netstat -tulpn | grep -i proxysql
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      17306/proxysql
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      17306/proxysql

Port 3306 adalah yang harus didengarkan oleh ProxySQL untuk menerima semua koneksi MySQL. Port 6032 adalah port admin ProxySQL, tempat kita akan terhubung untuk mengonfigurasi dan memantau komponen ProxySQL seperti pengguna, grup host, server, dan variabel.

Pada titik ini, jika Anda pergi ke ClusterControl -> Topology , Anda akan melihat topologi berikut:

Mengonfigurasi Soket UNIX MySQL

Di lingkungan Linux, jika Anda mendefinisikan host MySQL sebagai "localhost", klien/aplikasi akan mencoba terhubung melalui file soket UNIX, yang secara default terletak di /var/lib/mysql/mysql.sock di server cPanel. Menggunakan file soket adalah cara yang paling direkomendasikan untuk mengakses server MySQL, karena memiliki overhead yang lebih sedikit dibandingkan dengan koneksi TCP. File soket sebenarnya tidak berisi data, melainkan mengangkutnya. Ini seperti pipa lokal yang dapat digunakan server dan klien pada mesin yang sama untuk menghubungkan dan bertukar permintaan dan data.

Karena itu, jika aplikasi Anda terhubung melalui "localhost" dan port 3306 sebagai host dan port database, itu akan terhubung melalui file soket. Jika Anda menggunakan "127.0.0.1" dan port 3306, kemungkinan besar aplikasi akan terhubung ke database melalui TCP. Perilaku ini dijelaskan dengan baik dalam dokumentasi MySQL. Dengan kata sederhana, gunakan file soket (atau "localhost") untuk komunikasi lokal dan gunakan TCP jika aplikasi terhubung dari jarak jauh.

Di cPanel, file soket MySQL dipantau oleh proses cpservd dan akan ditautkan ke file soket lain jika kami mengonfigurasi jalur yang berbeda dari jalur default. Misalnya, kita mengonfigurasi file soket MySQL non-default seperti yang kita konfigurasikan di bagian sebelumnya:

$ cat /etc/my.cnf | grep socket
socket=/var/lib/mysql/mysql2.sock

cPanel melalui proses cpservd akan memperbaikinya dengan membuat symlink ke jalur soket default:

(whm)$ ls -al /var/lib/mysql/mysql.sock
lrwxrwxrwx. 1 root root 34 Jul  4 12:25 /var/lib/mysql/mysql.sock -> ../../../var/lib/mysql/mysql2.sock

Untuk menghindari cpservd mengoreksi ulang ini secara otomatis (cPanel memiliki istilah untuk perilaku ini yang disebut "secara otomatis"), kita harus menonaktifkan pemantauan MySQL dengan membuka WHM -> Manajer Layanan (kami tidak akan menggunakan MySQL lokal) dan hapus centang "Monitor" kotak centang untuk MySQL seperti yang ditunjukkan pada gambar di bawah:

Simpan perubahan di WHM. Sekarang aman untuk menghapus file soket default dan membuat symlink ke file soket ProxySQL dengan perintah berikut:

(whm)$ ln -s /tmp/proxysql.sock /var/lib/mysql/mysql.sock

Verifikasi soket file soket MySQL sekarang dialihkan ke file soket ProxySQL:

(whm)$ ls -al /var/lib/mysql/mysql.sock
lrwxrwxrwx. 1 root root 18 Jul  3 12:47 /var/lib/mysql/mysql.sock -> /tmp/proxysql.sock

Kita juga perlu mengubah kredensial login default di dalam /root/.my.cnf sebagai berikut:

(whm)$ cat ~/.my.cnf
[client]
#password="T<y4ar&cgjIu"
user=root
password='[email protected]'
socket=/var/lib/mysql/mysql.sock

Sedikit penjelasan - Baris pertama yang kami komentari adalah kata sandi root MySQL yang dibuat oleh cPanel untuk server MySQL lokal. Kami tidak akan menggunakannya, oleh karena itu '#' ada di awal baris. Kemudian, kami menambahkan kata sandi root MySQL untuk pengaturan replikasi MySQL dan jalur soket UNIX kami, yang sekarang symlink ke file soket ProxySQL.

Pada titik ini, di server WHM Anda seharusnya dapat mengakses cluster replikasi MySQL kami sebagai pengguna root hanya dengan mengetik "mysql", misalnya:

(whm)$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 239
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Perhatikan versi servernya adalah 5.5.30 (ProxySQL). Jika Anda dapat terhubung seperti di atas, kami dapat mengonfigurasi bagian integrasi seperti yang dijelaskan di bagian berikutnya.

Integrasi WHM/cPanel

WHM mendukung beberapa database server yaitu MySQL 5.7, MariaDB 10.2 dan MariaDB 10.3. Karena WHM sekarang hanya melihat ProxySQL dan terdeteksi sebagai versi 5.5.30 (seperti yang dinyatakan di atas), WHM akan mengeluh tentang versi MySQL yang tidak didukung. Anda dapat pergi ke WHM -> SQL Services -> Kelola Profil MySQL dan klik tombol Validasi. Anda akan mendapatkan notifikasi pemanggang roti berwarna merah di pojok kanan atas yang memberitahukan tentang kesalahan ini.

Oleh karena itu, kita harus mengubah versi MySQL di ProxySQL ke versi yang sama dengan cluster replikasi MySQL kita. Anda bisa mendapatkan informasi ini dengan menjalankan pernyataan berikut di server master:

mysql> SELECT @@version;
+------------+
| @@version  |
+------------+
| 5.7.26-log |
+------------+

Kemudian, login ke konsol admin ProxySQL untuk mengubah mysql-server_version variabel:

(whm)$ mysql -uproxysql-admin -p -h192.168.0.16 -P6032

Gunakan pernyataan SET seperti di bawah ini:

mysql> SET mysql-server_version = '5.7.26';

Kemudian muat variabel ke runtime dan simpan ke dalam disk untuk membuatnya persisten:

mysql> LOAD MYSQL VARIABLES TO RUNTIME;
mysql> SAVE MYSQL VARIABLES TO DISK;

Terakhir, verifikasi versi yang akan diwakili oleh ProxySQL:

mysql> SHOW VARIABLES LIKE 'mysql-server_version';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| mysql-server_version | 5.7.26 |
+----------------------+--------+

Jika Anda mencoba lagi untuk menyambung ke MySQL dengan menjalankan perintah "mysql", Anda sekarang akan mendapatkan "Versi server:5.7.26 (ProxySQL)" di terminal.

Sekarang kita dapat memperbarui kata sandi root MySQL di bawah WHM -> Layanan SQL -> Kelola Profil MySQL . Edit profil localhost dengan mengubah bidang Kata Sandi di bagian bawah dengan kata sandi root MySQL dari cluster replikasi kami. Klik tombol Simpan setelah selesai. Kami kemudian dapat mengklik "Validasi" untuk memverifikasi apakah WHM dapat mengakses cluster replikasi MySQL kami melalui layanan ProxySQL dengan benar. Anda harus mendapatkan pemanggang roti hijau berikut di sudut kanan atas:

Jika Anda mendapatkan notifikasi green toaster, kami dapat melanjutkan untuk mengintegrasikan ProxySQL melalui cPanel hook.

Integrasi ProxySQL melalui cPanel Hook

ProxySQL sebagai perantara antara replikasi WHM dan MySQL perlu memiliki username dan password untuk setiap pengguna MySQL yang akan melewatinya. Dengan arsitektur saat ini, jika seseorang membuat pengguna melalui panel kontrol (WHM melalui pembuatan akun atau cPanel melalui wizard Database MySQL), WHM akan secara otomatis membuat pengguna langsung di cluster replikasi MySQL kami menggunakan [email protected] (yang telah diimpor ke ProxySQL sebelumnya). Namun, pengguna database yang sama tidak akan ditambahkan ke tabel mysql_users ProxySQL secara otomatis.

Dari perspektif pengguna akhir, ini tidak akan berhasil karena semua koneksi localhost pada titik ini harus melewati ProxySQL. Kami membutuhkan cara untuk mengintegrasikan cPanel dengan ProxySQL, dimana untuk setiap operasi terkait pengguna MySQL yang dilakukan oleh WHM dan cPanel, ProxySQL harus diberi tahu dan melakukan tindakan yang diperlukan untuk menambah/menghapus/memperbarui tabel mysql_users internalnya.

Cara terbaik untuk mengotomatisasi dan mengintegrasikan komponen ini adalah dengan menggunakan sistem kait standar cPanel. Kait standar memicu aplikasi saat cPanel &WHM melakukan suatu tindakan. Gunakan sistem ini untuk mengeksekusi kode khusus (kode tindakan kait) untuk menyesuaikan cara cPanel &WHM berfungsi dalam skenario tertentu (peristiwa yang dapat dikaitkan).

Pertama, buat file modul Perl bernama ProxysqlHook.pm di bawah direktori /usr/local/cpanel:

$ touch /usr/local/cpanel/ProxysqlHook.pm

Kemudian, salin dan tempel baris dari sini. Untuk info lebih lanjut, lihat repositori Github di ProxySQL cPanel Hook.

Konfigurasikan antarmuka admin ProxySQL dari baris 16 hingga 19:

my $proxysql_admin_host = '192.168.0.16';
my $proxysql_admin_port = '6032';
my $proxysql_admin_user = 'proxysql-admin';
my $proxysql_admin_pass = 'mys3cr3t';

Sekarang hook sudah terpasang, kita perlu mendaftarkannya dengan sistem hook cPanel:

(whm)$ /usr/local/cpanel/bin/manage_hooks add module ProxysqlHook
info [manage_hooks] **** Reading ProxySQL information: Host: 192.168.0.16, Port: 6032, User: proxysql-admin *****
Added hook for Whostmgr::Accounts::Create to hooks registry
Added hook for Whostmgr::Accounts::Remove to hooks registry
Added hook for Cpanel::UAPI::Mysql::create_user to hooks registry
Added hook for Cpanel::Api2::MySQLFE::createdbuser to hooks registry
Added hook for Cpanel::UAPI::Mysql::delete_user to hooks registry
Added hook for Cpanel::Api2::MySQLFE::deletedbuser to hooks registry
Added hook for Cpanel::UAPI::Mysql::set_privileges_on_database to hooks registry
Added hook for Cpanel::Api2::MySQLFE::setdbuserprivileges to hooks registry
Added hook for Cpanel::UAPI::Mysql::rename_user to hooks registry
Added hook for Cpanel::UAPI::Mysql::set_password to hooks registry

Dari output di atas, modul ini terhubung ke sejumlah event cPanel dan WHM:

  • Whostmgr::Accounts::Create - WHM -> Fungsi Akun -> Buat Akun Baru
  • Whostmgr::Accounts::Remove - WHM -> Fungsi Akun -> Hentikan Akun
  • Cpanel::UAPI::Mysql::create_user - cPanel -> Database -> Database MySQL -> Tambahkan Pengguna Baru 
  • Cpanel::Api2::MySQLFE::createdbuser - cPanel -> Basis Data -> Basis Data MySQL -> Tambah Pengguna Baru (memerlukan integrasi Softaculous).
  • Cpanel::UAPI::Mysql::delete_user - cPanel -> Database -> Database MySQL -> Hapus Pengguna
  • Cpanel::Api2::MySQLFE::deletedbuser - cPanel -> Basis Data -> Basis Data MySQL -> Tambah Pengguna Baru (memerlukan integrasi Softaculous).
  • Cpanel::UAPI::Mysql::set_privileges_on_database - cPanel -> Database -> Database MySQL -> Tambahkan Pengguna Ke Database
  • Cpanel::Api2::MySQLFE::setdbuserprivileges - cPanel -> Database -> Database MySQL -> Tambahkan Pengguna Ke Database (memerlukan integrasi Softaculous).
  • Cpanel::UAPI::Mysql::rename_user - cPanel -> Database -> Database MySQL -> Ganti Nama Pengguna
  • Cpanel::UAPI::Mysql::set_password - cPanel -> Basis Data -> Basis Data MySQL -> Ubah Kata Sandi

Jika peristiwa di atas dipicu, modul akan menjalankan tindakan yang diperlukan untuk menyinkronkan tabel mysql_users di ProxySQL. Ia melakukan operasi melalui antarmuka admin ProxySQL yang berjalan pada port 6032 di server WHM. Oleh karena itu, sangat penting untuk menentukan kredensial pengguna yang benar untuk pengguna admin ProxySQL guna memastikan semua pengguna akan disinkronkan dengan ProxySQL dengan benar.

Perhatikan bahwa modul ini, ProxysqlHook.pm belum pernah diuji di lingkungan hosting nyata (dengan banyak akun dan banyak plugin pihak ketiga) dan jelas tidak mencakup semua kejadian terkait MySQL dalam cPanel. Kami telah mengujinya dengan Softaculous edisi gratis dan bekerja sangat baik melalui kait cPanel API2. Beberapa modifikasi lebih lanjut mungkin diperlukan untuk menerapkan otomatisasi penuh.

Itu saja untuk saat ini. Di bagian selanjutnya, kita akan melihat operasi pasca penerapan dan apa yang dapat kita peroleh dengan solusi server MySQL yang sangat tersedia untuk server hosting kita jika dibandingkan dengan penyiapan MySQL mandiri standar.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memformat Angka dengan Koma di MariaDB

  2. Berurusan dengan MySQL Long Running Query

  3. Menjelajahi Opsi Mesin Penyimpanan untuk MariaDB

  4. 5 Langkah Sederhana untuk Memulai dengan MariaDB dan Tableau

  5. WEEKDAY() vs DAYOFWEEK() di MariaDB:Apa Bedanya?