MariaDB Replikasi Master dan Slave

dev.mysql.com 
 Use case kali ini menggunakan : 
  • OS Ubuntu 20.04 
  • Database Mariadb 10.5.12 | sudah terinstall
  • IP Master: 192.168.57.72
  • IP Slave: 192.168.80.222

#Setting Database Master

Buka konfirgurasi Mariadb
#sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
1. Mengganti bind-address pada konfig mariadb dari 127.0.0.1 ke 0.0.0.0 (setting dengan angka nol jika anda menginzinkan database bisa di akses lewat ip manapun)
#bind-address                   = 0.0.0.0
2. Mengganti server-id, dapat menggunakan angka berapa saja pada konfigurasi ini, yang terpenting angka yang digunakan harus unik dan tidak boleh sama antara master lain dan slave yang terhubung. untuk kali ini bisa gunakan angka 1. Pastikan baris berikut tidak diberi komentar (tanda # pada awal baris).
server-id                      = 1
3. Menkonfigurasi log_bin. Semua informasi proses replikasi akan tersimpan di sini. Database slave akan menyimpan semua informasi perubahan dalam log ini. pada step ini, cukup hapus tanda # di depan log_bin.
log_bin                        = /var/log/mysql/mysql-bin.log
4. Mengkonfigurasi binlog_do_db. Mendefinisikan database yang akan direplikasi pada server slave. Anda dapat menyertakan lebih dari satu database dengan mengulangi baris ini untuk setiap database yang diperlukan. 
binlog_do_db                   = namadatabase
5. Simpan konfigurasi yang sudah di setting.
6. Kemudian restart service mariadb 
$ sudo systemctl restart mysql
7. Login ke dalam mariadb menggunakan user root
8. Membuat akun slave
MariaDB [(none)]> CREATE USER 'akun_slave'@'192.168.80.222' identified by 'passwordakun_slave';
9. Memberikan akses pada akun slave
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'akun_slave'@'%' IDENTIFIED BY 'passwordakun_slave';
10. Flush database
MariaDB [(none)]> FLUSH PRIVILEGES;
11. Mencegah perubahan pada database tersebut (kondisi jika database terkunci atau sedang melakukan pekerjaan)
MariaDB [(none)]> USE namadatabase;
MariaDB [namadatabase]> FLUSH TABLES WITH READ LOCK;
12. Melihat status database yang akan replikasi
MariaDB [puskoapp]> SHOW MASTER STATUS;                            
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      312 | namadatabase |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
lihat pada Position di mana database slave akan mulai mengalamatkan pada posisi tersebut. Catat nomor Position ini, karena akan digunakan pada langkah selanjutnya. Jika Anda melakukan perubahan pada jendela yang sama, database tersebut akan secara otomatis terbuka kuncinya. 

Untuk alasan inilah, Anda perlu membuka tab/jendela baru untuk melanjutkan ke langkah berikutnya.
Saat database sedang terkunci, ekspor database menggunakan mysqldump pada jendela baru. (pastikan perintah ini dijalankan pada shell bash, bukan MariaDB).
$ mysqldump -u root -p --opt namadatabase > namadatabase.sql
login kembali ke Mariadb, kemudian buka kunci database.
MariaDB [namadatabase]> UNLOCK TABLES;
Kemudian keluar dari Mariadb

Untuk saat ini, konfigurasi pada Database Master sudah selesai, kita akan lanjut konfigurasi untuk database slave


# Setting Database Slave
Masuk ke server slave, login ke MariaDB dan buatlah database baru dengan nama yang sama dengan database master
MariaDB [(none)]> CREATE DATABASE namadatabase;
Import database master yang sebelumnya di ekspor.
# mysql -u root -p namadatabase < /lokasi/file/namadatabase.sql
Kemudian lakukan konfigurasi pada database slave seperti yang dilakukan pada database master.
$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Pastikan beberapa konfigurasi berikut disetting dengan tepat. Untuk yang pertama adalah server-id. nomor pada server-id harus unik. Tidak boleh ada yang sama antara dengan kelompok master-slave. default nomor adalah 1, pastikan di ubah dengan angka yang berbeda.
server-id                      = 2
Selanjutnya konfigurasi log berikut terisi dengan tepat dan pada binlog_do_db di sesuaikan dengan database yang akan di replikasi:
relay-log                      = /var/log/mysql/mysql-relay-bin.log
log_bin                        = /var/log/mysql/mysql-bin.log
binlog_do_db                   = namadatabase
Tambahkan baris pada relay-log secara manual. Setelah perubahan pada konfigurasi dibuat, simpan dan keluar, kemudian restart Mariadb
$ sudo systemctl restart mysql
Langkah berikutnya, aktifkan replikasi pada Mariadb melalui shell MariaDB. Login pada MariaDB dan ketikkan perintah berikut, setting sesuaikan dengan konfigurasi anda:
MariaDB [(none)]> CHANGE MASTER TO
 -> MASTER_HOST='192.168.57.72',
 -> MASTER_USER='akun_slave',
-> MASTER_PASSWORD='passwordakun_slave',
-> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_USE_GTID = current_pos, -> MASTER_LOG_POS= 312;
Info
MASTER_HOST : IP yang ada pada Database Master
MASTER_USER & MASTER_PASSWORD : akun slave yang di buat pada database master
MASTER_LOG_FILE : log file yang ada pada database master ( perintah SQL SHOW MASTER STATUS; )
MASTER_LOG_POS : posisi log yang memungkina replikasi akan dilakukan 

Dengan begini, Anda telah selesai melakukan konfigurasi replikasi database pada master dan slave. Kemudian aktifkan server slave:
MariaDB [(none)]> START SLAVE;
Untuk melihat detil informasi pada replikasi slave anda bisa menggunakan perintah dibawah ini:
MariaDB [(none)]> SHOW SLAVE STATUS\G;
note: opsi \G ditambahkan di akhir query untuk merapihkan output

Output:
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.57.72
                  Master_User: akun_slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 312
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 535
        Relay_Master_Log_File: mysql-bin.000001
             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: 312
              Relay_Log_Space: 832
              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_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: 1
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
                   Using_Gtid: Current_Pos
                  Gtid_IO_Pos: 
Jika terjadi masalah koneksi, Anda bisa menggunakan  perintah slave dengan skip:
MariaDB [(none)]> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;
Selesai.

CATATAN:
Mulai MariDB 10.0 dikenalkan fitur baru berupa global transaction ID (GTID) untuk replikasi. Umumnya direkomendasikan untuk menggunakan GTID dari MariaDB 10.0, karena memiliki berbagai kelebihan. Yang diperlukan hanyalah menambahkan pilihan MASTER_USE_GTID ke statement CHANGE MASTER, misalnya :
CHANGE MASTER TO MASTER_USE_GTID = current_pos

Summary:
Konfigurasi ini memungkinkan anda melakukan replikasi Active dan Passive, kondisi slave disini hanya mereplikasi database yang ada pada master, untuk pengujian konfig, anda bisa melakukan dengan cara membuat table baru / memasukan data pada table yang sudah dibuat sebelumnya.

Disclaimer:
Pengujian ini bersifat pribadi jika terjadi kesalahan anda bisa meninggalkan komentar dibawah untuk revisi selanjutnya, konfig sudah saya lakukan pribadi.

referensi:
  • https://www.puskomedia.id/blog/cara-membuat-replikasi-database-mariadbmysql/
  • https://www.digitalocean.com/community/tutorials/how-to-set-up-replication-in-mysql
  • https://mariadb.com/kb/en/setting-up-replication/

Prohibited from using harsh words and the words of the SARA, the words that indicate the Flame against someone that I would quarrel delete and block from this website