Percona Server untuk MySQL 8.0 menawarkan sejumlah solusi pengelompokan untuk ketersediaan tinggi yang siap pakai:
- Single-master:
- Replikasi asinkron
- Replikasi semi sinkron
- Multi-master:
- Replikasi grup
- InnoDB Cluster (kombinasi dari MySQL Router, MySQL Shell dan Server Percona dengan Group Replication)
Solusi yang paling populer, teruji pertempuran, dan sangat skalabel, tentu saja, adalah replikasi asinkron. Dalam posting blog ini, kami akan menerapkan pengaturan replikasi Server Percona khusus untuk ketersediaan tinggi. Instruksi yang dijelaskan di sini didasarkan pada CentOS 7.
Menginstal Server Percona
Untuk ketersediaan tinggi, kami memerlukan setidaknya dua node dalam pengaturan replikasi master-slave sederhana:
- db1 - master (192.168.0.61)
- db2 - budak (192.168.0.62)
Langkah-langkah yang dijelaskan di bagian ini harus dilakukan pada semua node database (db1 dan db2). Kita akan mulai dengan menginstal paket repositori Percona:
$ yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
Versi stabil terbaru saat ini adalah Server Percona untuk MySQL 8.0, tetapi secara default, paket repositori hanya dikonfigurasi hingga versi 5.7. Paket percona-release berisi skrip yang dapat mengaktifkan repositori tambahan untuk produk yang lebih baru. Mari jalankan skrip itu dan aktifkan repositori 8.0:
$ percona-release setup ps80
Kemudian instal Percona Server dan Percona Xtrabackup terbaru:
$ yum -y install percona-server-server percona-xtrabackup-80
Saat ini, Anda harus menginstal Server Percona untuk MySQL 8.0.21. Semua paket dependensi akan diinstal seperti paket shared-compat, shared, dan klien. Kami kemudian dapat mengaktifkan layanan MySQL saat startup dan memulai layanan:
$ systemctl enable mysql
$ systemctl start mysql
Kata sandi root baru akan dibuat selama startup pertama. Kita perlu mengambil informasi kata sandi root terlebih dahulu dari log kesalahan MySQL (defaultnya adalah /var/log/mysqld.log di sistem berbasis RHEL):
$ cat /var/log/mysqld.log | grep temporary
2020-11-06T04:53:07.402040Z 6 [Note] [MY-010454] [Server] A temporary password is generated for [email protected]: o%(_M>t1)R-P
Seperti yang Anda lihat, kata sandi yang dihasilkan adalah "o%(_M>t1)R-P". Selanjutnya, kita perlu melakukan tugas pasca-instalasi untuk mengamankan instalasi server MySQL. Jalankan perintah berikut:
$ mysql_secure_installation
Securing the MySQL server deployment.
Enter password for user root:
The existing password for the user account root has expired. Please set a new password.
New password:
Re-enter new password:
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y
New password:
Re-enter new password:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
Kata sandi root yang dihasilkan akan segera kedaluwarsa setelah login root pertama. Skrip pembantu di atas membantu kita untuk mengonfigurasi kata sandi root MySQL baru, menonaktifkan login jarak jauh untuk root, menghapus database pengujian dan pengguna anonim dan juga memuat ulang tabel hak istimewa.
Kami sekarang siap untuk mengonfigurasi fitur ketersediaan tinggi untuk Percona Server 8.0.
Replikasi semi sinkron
Replikasi semi sinkron berada di antara replikasi asinkron dan sepenuhnya sinkron. Sumber menunggu hingga setidaknya satu replika telah menerima dan mencatat peristiwa, lalu melakukan transaksi. Sumber tidak menunggu semua replika untuk mengakui penerimaan, dan hanya membutuhkan pengakuan dari replika, bukan bahwa peristiwa telah sepenuhnya dijalankan dan dilakukan di sisi replika. Replikasi semi sinkron, oleh karena itu, menjamin bahwa jika sumber crash, semua transaksi yang telah dilakukan telah ditransmisikan ke setidaknya satu replika.
Untuk integritas replikasi terbaik, pilih replikasi semi-sinkron. Untuk mengkonfigurasinya, pada node pertama, db1 (192.168.0.61), tambahkan baris berikut di dalam /etc/my.cnf (harus di bawah bagian [mysqld]):
# Compatibility
default-authentication-plugin = mysql_native_password
# Replication
server_id = 61 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.61 # IP address of this host
read_only = OFF # Set ON on slave
super_read_only = OFF # Set ON on slave
# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
# Semi-sync
plugin_load_add = rpl_semi_sync_master=semisync_master.so
plugin_load_add = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = ON
Pada node kedua, db2 (192.168.0.62), tambahkan baris berikut di dalam /etc/my.cnf (harus di bawah bagian [mysqld]):
# Compatibility
default-authentication-plugin = mysql_native_password
# Replication
server_id = 62 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.62 # IP address of this host
read_only = ON # Set ON on slave
super_read_only = ON # Set ON on slave
# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
# Semi-sync
plugin_load_add = rpl_semi_sync_master=semisync_master.so
plugin_load_add = rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled = ON
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = ON
Kemudian, kita dapat melanjutkan untuk menyiapkan tautan replikasi seperti yang dijelaskan dalam "Menyiapkan Tautan Replikasi" di bagian bawah.
Replikasi Asinkron
Untuk replikasi asinkron, cukup hapus semua opsi terkait replikasi semi-sinkron dan kita harus baik-baik saja. Pada node pertama, db1 (192.168.0.61), tambahkan baris berikut di dalam /etc/my.cnf (harus di bawah bagian [mysqld]):
# Compatibility
default-authentication-plugin = mysql_native_password
# Replication
server_id = 61 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.61 # IP address of this host
read_only = OFF # Set ON on slave
super_read_only = OFF # Set ON on slave
# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
Pada node kedua, db2 (192.168.0.62), tambahkan baris berikut di dalam /etc/my.cnf (harus di bawah bagian [mysqld]):
# Compatibility
default-authentication-plugin = mysql_native_password
# Replication
server_id = 62 # must be distinct on all nodes in the cluster
binlog_format = ROW
log_bin = binlog
log_slave_updates = 1
gtid_mode = ON
enforce_gtid_consistency = 1
binlog_expire_logs_seconds = 604800 # 7 days
sync_binlog = 1
report_host = 192.168.0.62 # IP address of this host
read_only = ON # Set ON on slave
super_read_only = ON # Set ON on slave
# Replication safety
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
Kemudian, kita dapat melanjutkan untuk menyiapkan tautan replikasi seperti yang dijelaskan dalam "Menyiapkan Tautan Replikasi" di bawah.
Menyiapkan Tautan Replikasi
Pada master (db1), buat pengguna budak dan izinkan pengguna untuk terhubung dari semua host di bawah jaringan ini (menggunakan % wildcard):
mysql> CREATE USER 'slave'@'192.168.0.%' IDENTIFIED WITH mysql_native_password BY '[email protected]&9';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.0.%';
Pada slave (db2), setel ulang log biner, konfigurasikan kredensial replikasi, dan mulai proses replikasi:
mysql> RESET MASTER;
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.61', MASTER_USER = 'slave', MASTER_PASSWORD = '[email protected]&9', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
Periksa status replikasi:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.61
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000008
Read_Master_Log_Pos: 912
Relay_Log_File: db2-relay-bin.000007
Relay_Log_Pos: 1081
Relay_Master_Log_File: binlog.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 912
Relay_Log_Space: 1500
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 66
Master_UUID: f60cf793-1feb-11eb-af72-5254008afee6
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: f60cf793-1feb-11eb-af72-5254008afee6:5-7
Executed_Gtid_Set: f60cf793-1feb-11eb-af72-5254008afee6:1-7
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
Perhatikan status penting berikut untuk menentukan apakah replikasi dikonfigurasi dengan benar dan slave telah menyusul master:
- Slave_IO_Running:Ya
- Slave_SQL_Running:Ya
- Seconds_Behind_Master:0
Jika replikasi semi-sinkron diaktifkan, Anda akan mendapatkan output berikut di master:
mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_slave_status | OFF |
+-----------------------------+-------+
Sementara pada slave, statusnya seperti di bawah ini:
mysql> SHOW STATUS LIKE '%semi%status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_slave_status | ON |
+-----------------------------+-------+
Untuk replikasi asinkron, kueri di atas tidak akan menghasilkan apa-apa (kumpulan kosong), karena plugin replikasi semi-sinkron tidak diaktifkan. Dalam satu set replikasi, dimungkinkan untuk memiliki campuran replikasi host slave dengan replikasi asinkron dan semi-sinkron.
Menyebarkan Server Percona untuk MySQL menggunakan ClusterControl
Secara praktis mudah untuk menerapkan replikasi Server Percona master-slave dengan ClusterControl, dan secara default, ClusterControl akan mengonfigurasi penerapan replikasi dengan replikasi asinkron. Cukup siapkan node yang ingin Anda terapkan, dan dalam contoh ini, kita akan menerapkan Server Percona tiga node untuk MySQL 8.0 dengan replikasi master-slave. Dengan ClusterControl muncul, kita diharuskan memiliki node tambahan untuk ClusterControl. Oleh karena itu, pengaturan kami terlihat seperti ini:
- ClusterControl - cc (192.168.0.19)
- Master - db1 (192.168.0.61)
- Budak - db2 (192.168.0.62)
- Budak - db3 (192.168.0.63)
Di server ClusterControl, instal ClusterControl menggunakan skrip penginstal. Sebagai root, jalankan perintah berikut:
$ wget http://severalnines.com/downloads/cmon/install-cc
$ chmod 755 install-cc
$ ./install-cc
Ikuti petunjuk instalasi sampai selesai. Kemudian, buka browser web dan buka http://{ClusterControl_IP_address}/clustercontrol dan buat pengguna dan sandi admin default. Selanjutnya, kita perlu mengatur SSH tanpa kata sandi dari server ClusterControl ke semua node database. Sebagai pengguna root, pertama-tama kita harus membuat kunci SSH:
$ whoami
root
$ ssh-keygen -t rsa # press Enter on all prompts
Kemudian, salin kunci publik SSH yang dibuat ke semua node database:
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db1
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db2
$ ssh-copy-id -i ~/.ssh/id_rsa [email protected] # db3
Kami sekarang siap untuk memulai penerapan cluster. Buka ClusterControl -> Deploy -> MySQL Replication dan tentukan detail yang diperlukan seperti di bawah ini:
Kemudian, klik "Lanjutkan" untuk melanjutkan ke langkah berikutnya di mana kita mengkonfigurasi spesifikasi instalasi MySQL:
Pilih "Percona" untuk Vendor dan 8.0 sebagai Versi. Simpan sisanya sebagai default dan masukkan kata sandi root MySQL. Klik "Lanjutkan" untuk melanjutkan ke konfigurasi host dan topologi:
Tentukan alamat IP atau nama host dari database host satu per satu dan buat pastikan Anda mendapatkan ikon centang hijau setelah setiap penyisipan. Ini menunjukkan bahwa ClusterControl dapat menjangkau host yang sesuai melalui SSH tanpa kata sandi dengan pengguna dan kunci SSH yang disediakan seperti yang didefinisikan pada langkah 1. Klik tombol "Deploy" untuk memulai penerapan.
ClusterControl kemudian memicu tugas penerapan di mana Anda dapat memantau kemajuan penerapan dengan membuka ClusterControl -> Aktivitas -> Pekerjaan -> Buat Cluster -> Detail Pekerjaan Lengkap, seperti yang ditunjukkan pada tangkapan layar berikut:
Setelah proses selesai, Anda akan melihat cluster terdaftar di Dasbor :
Itu dia. Penyebaran sekarang selesai.