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

Cara Mengganti Master MySQL atau MariaDB Menengah dengan Server Binlog menggunakan MaxScale

Log biner (binlog) berisi catatan semua perubahan pada basis data. Mereka diperlukan untuk replikasi dan juga dapat digunakan untuk memulihkan data setelah pencadangan. Server binlog pada dasarnya adalah repositori log biner. Anda dapat menganggapnya seperti server dengan tujuan khusus untuk mengambil log biner dari master, sementara server budak dapat terhubung ke sana seperti mereka akan terhubung ke server master.

Beberapa keuntungan memiliki server binlog dibandingkan master perantara untuk mendistribusikan beban kerja replikasi adalah:

  • Anda dapat beralih ke server master baru tanpa para budak menyadari bahwa server master yang sebenarnya telah berubah. Ini memungkinkan penyiapan replikasi yang lebih tersedia dengan prioritas tinggi.
  • Kurangi beban pada master dengan hanya melayani server binlog Maxscale, bukan semua slave.
  • Data dalam log biner master perantara bukan salinan langsung dari data yang diterima dari log biner master sebenarnya. Dengan demikian, jika komit grup digunakan, ini dapat menyebabkan penurunan paralelisme komit dan penurunan kinerja server budak.
  • Budak perantara harus mengeksekusi ulang setiap pernyataan SQL yang berpotensi menambah latensi dan tertinggal dalam rantai replikasi.

Dalam posting blog ini, kita akan melihat cara mengganti master perantara (relai host budak ke budak lain dalam rantai replikasi) dengan server binlog yang berjalan di MaxScale untuk skalabilitas dan kinerja yang lebih baik .

Arsitektur

Pada dasarnya kami memiliki pengaturan replikasi 4-node MariaDB v10.4 dengan satu MaxScale v2.3 duduk di atas replikasi untuk mendistribusikan kueri yang masuk. Hanya satu slave yang terhubung ke master (master perantara) dan slave lainnya mereplikasi dari master perantara untuk melayani beban kerja baca, seperti yang diilustrasikan dalam diagram berikut.

Kita akan mengubah topologi di atas menjadi ini:

Pada dasarnya, kita akan menghapus peran master perantara dan menggantinya dengan server binlog yang berjalan di MaxScale. Master perantara akan diubah menjadi budak standar, sama seperti host budak lainnya. Layanan binlog akan mendengarkan pada port 5306 pada host MaxScale. Ini adalah port yang akan disambungkan oleh semua slave untuk replikasi nanti.

Mengonfigurasi MaxScale sebagai Server Binlog

Dalam contoh ini, kami telah memiliki MaxScale yang berada di atas cluster replikasi kami yang bertindak sebagai penyeimbang beban untuk aplikasi kami. Jika Anda tidak memiliki MaxScale, Anda dapat menggunakan ClusterControl untuk menerapkan, cukup buka Cluster Actions -> Add Load Balancer -> MaxScale dan isi informasi yang diperlukan sebagai berikut:

Sebelum memulai, mari ekspor konfigurasi MaxScale saat ini ke dalam file teks untuk cadangan. MaxScale memiliki flag yang disebut --export-config untuk tujuan ini tetapi harus dijalankan sebagai pengguna maxscale. Jadi, perintah untuk mengekspor adalah:

$ su -s /bin/bash -c '/bin/maxscale --export-config=/tmp/maxscale.cnf' maxscale

Pada master MariaDB, buat pengguna slave replikasi yang disebut 'maxscale_slave' untuk digunakan oleh MaxScale dan tetapkan dengan hak istimewa berikut:

$ mysql -uroot -p -h192.168.0.91 -P3306
MariaDB> CREATE USER 'maxscale_slave'@'%' IDENTIFIED BY 'BtF2d2Kc8H';
MariaDB> GRANT SELECT ON mysql.user TO 'maxscale_slave'@'%';
MariaDB> GRANT SELECT ON mysql.db TO 'maxscale_slave'@'%';
MariaDB> GRANT SELECT ON mysql.tables_priv TO 'maxscale_slave'@'%';
MariaDB> GRANT SELECT ON mysql.roles_mapping TO 'maxscale_slave'@'%';
MariaDB> GRANT SHOW DATABASES ON *.* TO 'maxscale_slave'@'%';
MariaDB> GRANT REPLICATION SLAVE ON *.* TO 'maxscale_slave'@'%';

Untuk pengguna ClusterControl, buka Kelola -> Skema dan Pengguna untuk membuat hak istimewa yang diperlukan.

Sebelum kita melangkah lebih jauh dengan konfigurasi, penting untuk meninjau status dan topologi server backend kami saat ini:

$ maxctrl list servers
┌────────┬──────────────┬──────┬─────────────┬──────────────────────────────┬───────────┐
│ Server │ Address      │ Port │ Connections │ State                        │ GTID      │
├────────┼──────────────┼──────┼─────────────┼──────────────────────────────┼───────────┤
│ DB_757 │ 192.168.0.90 │ 3306 │ 0           │ Master, Running              │ 0-38001-8 │
├────────┼──────────────┼──────┼─────────────┼──────────────────────────────┼───────────┤
│ DB_758 │ 192.168.0.91 │ 3306 │ 0           │ Relay Master, Slave, Running │ 0-38001-8 │
├────────┼──────────────┼──────┼─────────────┼──────────────────────────────┼───────────┤
│ DB_759 │ 192.168.0.92 │ 3306 │ 0           │ Slave, Running               │ 0-38001-8 │
├────────┼──────────────┼──────┼─────────────┼──────────────────────────────┼───────────┤
│ DB_760 │ 192.168.0.93 │ 3306 │ 0           │ Slave, Running               │ 0-38001-8 │
└────────┴──────────────┴──────┴─────────────┴──────────────────────────────┴───────────┘

Seperti yang kita lihat, master saat ini adalah DB_757 (192.168.0.90). Catat informasi ini karena kami akan menyiapkan server binlog untuk direplikasi dari master ini.

Buka file konfigurasi MaxScale di /etc/maxscale.cnf dan tambahkan baris berikut:

[replication-service]
type=service
router=binlogrouter
user=maxscale_slave
password=BtF2d2Kc8H
version_string=10.4.12-MariaDB-log
server_id=9999
master_id=9999
mariadb10_master_gtid=true
filestem=binlog
binlogdir=/var/lib/maxscale/binlogs
semisync=true # if semisync is enabled on the master

[binlog-server-listener]
type=listener
service=replication-service
protocol=MariaDBClient
port=5306
address=0.0.0.0

Sedikit penjelasan - Kami membuat dua komponen - layanan dan pendengar. Layanan adalah tempat kami menentukan karakteristik server binlog dan bagaimana menjalankannya. Detail tentang setiap opsi dapat ditemukan di sini. Dalam contoh ini, server replikasi kami berjalan dengan replikasi semi-sinkron, jadi kami harus menggunakan semisync=true sehingga akan terhubung ke master melalui metode replikasi semi-sinkron. Listener adalah tempat kami memetakan port mendengarkan dengan layanan binlogrouter di dalam MaxScale.

Mulai ulang MaxScale untuk memuat perubahan:

$ systemctl restart maxscale

Pastikan layanan binlog dimulai melalui maxctrl (lihat kolom Negara):

$ maxctrl show service replication-service

Pastikan bahwa MaxScale sekarang mendengarkan port baru untuk layanan binlog:

$ netstat -tulpn | grep maxscale
tcp        0 0 0.0.0.0:3306            0.0.0.0:* LISTEN   4850/maxscale
tcp        0 0 0.0.0.0:3307            0.0.0.0:* LISTEN   4850/maxscale
tcp        0 0 0.0.0.0:5306            0.0.0.0:* LISTEN   4850/maxscale
tcp        0 0 127.0.0.1:8989          0.0.0.0:* LISTEN   4850/maxscale

Kami sekarang siap untuk membuat link replikasi antara MaxScale dan master.

Mengaktifkan Server Binlog

Masuk ke server master MariaDB dan ambil file dan posisi binlog saat ini:

MariaDB> SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000005 |     4204 |              |                  |
+---------------+----------+--------------+------------------+

Gunakan fungsi BINLOG_GTID_POS untuk mendapatkan nilai GTID:

MariaDB> SELECT BINLOG_GTID_POS("binlog.000005", 4204);
+----------------------------------------+
| BINLOG_GTID_POS("binlog.000005", 4204) |
+----------------------------------------+
| 0-38001-31                             |
+----------------------------------------+

Kembali ke server MaxScale, instal paket klien MariaDB:

$ yum install -y mysql-client

Hubungkan ke pendengar server binlog pada port 5306 sebagai pengguna maxscale_slave dan buat tautan replikasi ke master yang ditunjuk. Gunakan nilai GTID yang diambil dari master:

(maxscale)$ mysql -u maxscale_slave -p'BtF2d2Kc8H' -h127.0.0.1 -P5306
MariaDB> SET @@global.gtid_slave_pos = '0-38001-31';
MariaDB> CHANGE MASTER TO MASTER_HOST = '192.168.0.90', MASTER_USER = 'maxscale_slave', MASTER_PASSWORD = 'BtF2d2Kc8H', MASTER_PORT=3306, MASTER_USE_GTID = slave_pos;
MariaDB> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
                 Slave_IO_State: Binlog Dump
                  Master_Host: 192.168.0.90
                  Master_User: maxscale_slave
                  Master_Port: 3306
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
             Master_Server_Id: 38001
             Master_Info_File: /var/lib/maxscale/binlogs/master.ini
      Slave_SQL_Running_State: Slave running
                  Gtid_IO_Pos: 0-38001-31

Catatan:Output di atas telah dipotong untuk menampilkan hanya baris penting.

Menunjuk Budak ke Server Binlog

Sekarang di mariadb2 dan mariadb3 (budak akhir), ubah master yang menunjuk ke server binlog MaxScale. Karena kita menjalankan dengan replikasi semi-sinkron yang diaktifkan, kita harus mematikannya terlebih dahulu:

(mariadb2 & mariadb3)$ mysql -uroot -p
MariaDB> STOP SLAVE;
MariaDB> SET global rpl_semi_sync_master_enabled = 0; -- if semisync is enabled
MariaDB> SET global rpl_semi_sync_slave_enabled = 0; -- if semisync is enabled
MariaDB> CHANGE MASTER TO MASTER_HOST = '192.168.0.95', MASTER_USER = 'maxscale_slave', MASTER_PASSWORD = 'BtF2d2Kc8H', MASTER_PORT=5306, MASTER_USE_GTID = slave_pos;
MariaDB> START SLAVE;
MariaDB> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.0.95
                   Master_User: maxscale_slave
                   Master_Port: 5306
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
              Master_Server_Id: 9999
                    Using_Gtid: Slave_Pos
                   Gtid_IO_Pos: 0-38001-32
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

Catatan:Output di atas telah dipotong untuk menampilkan hanya baris penting.

Di dalam my.cnf, kita harus mengomentari baris berikut untuk menonaktifkan semi-sinkronisasi di masa mendatang:

#loose_rpl_semi_sync_slave_enabled=ON
#loose_rpl_semi_sync_master_enabled=ON

Pada titik ini, master perantara (mariadb1) masih mereplikasi dari master (mariadb0) sementara budak lain telah mereplikasi dari server binlog. Topologi kita saat ini dapat diilustrasikan seperti diagram di bawah ini:

Bagian terakhir adalah mengubah penunjuk master dari master perantara (mariadb1 ) setelah semua budak yang digunakan untuk melampirkannya sudah tidak ada lagi. Langkah-langkahnya pada dasarnya sama dengan budak lainnya:

(mariadb1)$ mysql -uroot -p
MariaDB> STOP SLAVE;
MariaDB> SET global rpl_semi_sync_master_enabled = 0; -- if semisync is enabled
MariaDB> SET global rpl_semi_sync_slave_enabled = 0; -- if semisync is enabled
MariaDB> CHANGE MASTER TO MASTER_HOST = '192.168.0.95', MASTER_USER = 'maxscale_slave', MASTER_PASSWORD = 'BtF2d2Kc8H', MASTER_PORT=5306, MASTER_USE_GTID = slave_pos;
MariaDB> START SLAVE;
MariaDB> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.0.95
                   Master_User: maxscale_slave
                   Master_Port: 5306
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
              Master_Server_Id: 9999
                    Using_Gtid: Slave_Pos
                   Gtid_IO_Pos: 0-38001-32

Catatan:Output di atas telah dipotong untuk menampilkan hanya baris penting.

Jangan lupa juga untuk menonaktifkan replikasi semi-sinkronisasi di my.cnf:

#loose_rpl_semi_sync_slave_enabled=ON
#loose_rpl_semi_sync_master_enabled=ON

Kami dapat memverifikasi layanan router binlog memiliki lebih banyak koneksi sekarang melalui maxctrl CLI:

$ maxctrl list services
┌─────────────────────┬────────────────┬─────────────┬───────────────────┬───────────────────────────────────┐
│ Service             │ Router         │ Connections │ Total Connections │ Servers                           │
├─────────────────────┼────────────────┼─────────────┼───────────────────┼───────────────────────────────────┤
│ rw-service          │ readwritesplit │ 1           │ 1                 │ DB_757, DB_758, DB_759, DB_760    │
├─────────────────────┼────────────────┼─────────────┼───────────────────┼───────────────────────────────────┤
│ rr-service          │ readconnroute  │ 1           │ 1                 │ DB_757, DB_758, DB_759, DB_760    │
├─────────────────────┼────────────────┼─────────────┼───────────────────┼───────────────────────────────────┤
│ replication-service │ binlogrouter   │ 4           │ 51                │ binlog_router_master_host, DB_757 │
└─────────────────────┴────────────────┴─────────────┴───────────────────┴───────────────────────────────────┘

Juga, perintah administrasi replikasi umum dapat digunakan di dalam server binlog MaxScale, misalnya, kami dapat memverifikasi host budak yang terhubung dengan menggunakan perintah ini:

(maxscale)$ mysql -u maxscale_slave -p'BtF2d2Kc8H' -h127.0.0.1 -P5306
MariaDB> SHOW SLAVE HOSTS;
+-----------+--------------+------+-----------+------------+
| Server_id | Host         | Port | Master_id | Slave_UUID |
+-----------+--------------+------+-----------+------------+
| 38003     | 192.168.0.92 | 3306 | 9999      |            |
| 38002     | 192.168.0.91 | 3306 | 9999      |            |
| 38004     | 192.168.0.93 | 3306 | 9999      |            |
+-----------+--------------+------+-----------+------------+

Pada titik ini, topologi kami terlihat seperti yang kami antisipasi:

Migrasi kami dari penyiapan master perantara ke penyiapan server binlog sekarang telah selesai.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB SYSTEM_USER() Dijelaskan

  2. Bagaimana TO_SECONDS() Bekerja di MariaDB

  3. MariaDB JSON_TABLE() Dijelaskan

  4. Mengontrol Replication Failover untuk MySQL dan MariaDB Dengan Skrip Sebelum atau Setelah Failover

  5. Bagaimana DAYNAME() Bekerja di MariaDB