Konfigurasi Replikasi Database MySQL

MySQL Group Replication adalah plugin untuk membuat arsitektur database yang sangat toleran terhadap kesalahan. Replikasi grup menghilangkan kemungkinan satu titik kegagalan / single point of failure (SPOF). Dalam modul ini, Anda akan menginstal dan mengonfigurasi plugin MySQL Group Replication untuk membuat cluster database yang sangat tersedia.

1. Persiapan

Pastikan memiliki minimal 3 server (boleh lebih) baik fisik, vps atau dalam bentuk virtual machine. Pastikan sistem operasi yang digunakan merupakan sistem operasi Ubuntuk versi 18.04 keatas, versi 20.04 yang direkomendasikan.

Catat IP dari masing-masing server yang digunakan, pada kasus ini, missal IP yang digunakan:

  1. 192.0.2.1 sebagai Master Server (VM-1)
  2. 192.0.2.2 sebagai Node Server 1 (VM-2)
  3. 192.0.2.3 sebagai Node Server 2 (VM-3)

* IP anda bisa saja berbeda, silahkan disesuaikan

2. Install MySQL Server pada Tiap Server

2.1 Lakukan SSH ke semua VM

2.2 Install MySQL server di semua VM:

$ sudo apt install mysql-server

2.3 Login pada MySQL sebagai root

$ sudo mysql

2.4 Ganti password root

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'Qwerty123456@';

Ganti: Qwerty123456@ dengan password yang dikehendaki, syarat: harus ada huruf besar, huruf kecil, angka dan karakter.

2.5 Keluar dari mysql

mysql > exit

2.6 Buat Root password untuk MySQL pada tiap VM (samakan passwordnya untuk tiap server):

$ sudo mysql_secure_installation
  • Jika ada permintaan password, masukkan password yang sama dengan langkah 4.
  • Masukkan no, untuk semua pilihan yang diminta

* Lakukan proses diatas pada ketiga server

3. Membuat Nama Group Replication

3.1 Lakukan SSH ke Master Server (VM-1)

3.2 Login ke MySQL

$ sudo mysql -u root -p

3.3 Generate UUID

mysql> SELECT UUID();

Contoh hasilnya akan berbentuk:

+--------------------------------------+
| UUID()                               |
+--------------------------------------+
| 00000000-1111-2222-3333-444444444444 |
+--------------------------------------+

3.4 Catat UUID yang muncul (Contoh: 00000000-1111-2222-3333-444444444444), akan digunakan sebagai nama replikasi di konfigurasi slave server pada tahap berikutnya.

3.5 Keluar dari MySQL

mysql> QUIT;

4. Konfigurasi Replikasi Master Server (VM-1)

4.1 SSH ke Server Master (VM-1)

4.2 Edit /etc/mysql/my.cnf

$ sudo nano /etc/mysql/my.cnf

4.3 Masukkan konfigurasi berikut pada bagian akhir file my.cnf

[mysqld]

server_id=1 
bind-address=0.0.0.0
gtid_mode=ON 
enforce_gtid_consistency=ON
binlog_checksum=NONE

plugin_load_add='group_replication.so'
group_replication_single_primary_mode=OFF
loose-group_replication_group_name="00000000-11112222-3333-444444444444"

loose-group_replication_start_on_boot=ON
loose-group_replication_local_address="192.0.2.1:33061"
loose-group_replication_group_seeds="192.0.2.1:33061,192.0.2.2:33061,192.0.2.3:33061"
loose-group_replication_bootstrap_group=OFF
report_host=192.0.2.1

Ganti:

  • 00000000-1111-2222-3333-444444444444 dengan UUID dari langkah 4.3.
  • 192.0.2.1 dengan IP VM-1
  • 192.0.2.2 dengan IP VM-2
  • 192.0.2.3 dengan IP VM-3

Keterangan:

  • server_id=1 (Server ke-1)
  • bind-address=0.0.0.0 (Listen semua IP yang ada pada lingkungan replikasi)
  • gtid_mode=ON (Jalankan replikasi dengan pengidentifikasi transaksi global)
  • enforce_gtid_consistency=ON (MySQL hanya akan mengeksekusi query yang dapat dicatat dengan aman pada replikasi)
  • plugin_load_add=’group_replication.so’ (jalankan plugin replikasi)
  • group_replication_single_primary_mode=OFF (semua server punya akses untuk write dan read)
  • loose-group_replication_group_name (nama UUID group replikasi)
  • loose-group_replication_start_on_boot (jalankan / tidak replikasi jika server terestart)
  • loose-group_replication_local_address (IP server yang sedang di konfigurasi)
  • loose-group_replication_group_seeds (IP semua server yang terlibat replikasi)
  • loose-group_replication_bootstrap_group=OFF (mencegah bootstrap group agar tidak ada konflik)
  • report_host (IP server yang sedang di konfigurasi)

4.4 Restart MySQL

$ sudo service mysql restart

5. Membuat Replication User dan Database Replikasi

5.1 Login pada MySQL di VM-1

$ sudo mysql -u root -p

5.2 Buat Replication User

mysql> SET SQL_LOG_BIN=0;

mysql> SET GLOBAL read_only = OFF;

mysql> CREATE USER 'replication_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Qwerty123456@';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='replication_user', MASTER_PASSWORD='Qwerty123456@' FOR CHANNEL 'group_replication_recovery';

Ganti: Qwerty123456@ dengan password MySQL, syarat: harus ada huruf besar, huruf kecil, angka dan karakter

5.3 Cek tidak ada nama group yang sama, kemudian jalankan Group replikasi

mysql> SET GLOBAL group_replication_bootstrap_group=ON;

mysql> START GROUP_REPLICATION;

5.4 Matikan group_replication_bootstrap_group untuk menghindari pembuatan banyak grup

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

5.5 Verifikasi status grup replication_group_members

mysql> SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE FROM performance_schema.replication_group_members;

* Contoh hasil verifikasi output mirip dengan ini:

+--------------------------------------+-------------+--------------+
| MEMBER_ID                            | MEMBER_HOST | MEMBER_STATE |
+--------------------------------------+-------------+--------------+
| 11111111-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.1   | ONLINE       |
+--------------------------------------+-------------+--------------+

5.6 Buat database dengan nama simak

mysql> CREATE DATABASE simak;

5.7 Use ke database simak

mysql> USE simak;

5.8 Buat test table dengan nama mahasiswa

mysql> CREATE TABLE mahasiswa (id INT PRIMARY KEY, nama_mhs VARCHAR(30) NOT NULL) Engine = InnoDB;

5.9 Cek hasil table

mysql> SHOW TABLES;

+----------------------------+
| Tables_in_test_replication |
+----------------------------+
| mahasiswa                  |
+----------------------------+

6. Konfigurasi Node Server (VM-2 dan VM-3)

* Lakukan langkah-langkah berikut pada kedua server node

6.1 SSH ke VM-2/VM-3

6.2 Edit /etc/mysql/my.cnf

$ sudo nano /etc/mysql/my.cnf

6.3 Masukkan konfigurasi berikut pada bagian bawah dan save:

[mysqld]

server_id=2
bind-address=0.0.0.0
gtid_mode=ON 
enforce_gtid_consistency=ON
binlog_checksum=NONE

plugin_load_add='group_replication.so'
group_replication_single_primary_mode=OFF
loose-group_replication_group_name="00000000-1111-2222-3333-444444444444"

loose-group_replication_start_on_boot=ON
loose-group_replication_local_address= "192.0.2.2:33061"
loose-group_replication_group_seeds="192.0.2.1:33061,192.0.2.2:33061, 192.0.2.3:33061"
loose-group_replication_bootstrap_group=OFF
report_host=192.0.2.2

Ganti:

  • server_id=2 dengan 2 (untuk VM-2) dan 3 (untuk VM-3)
  • 00000000-1111-2222-3333-444444444444 dengan UUID dari langkah 4.3
  • loose-group_replication_local_address= “192.0.2.2:33061” dengan IP node server VM-2 / VM-3 (yang sedang di konfigurasi)
  • 192.0.2.1 dengan IP VM-1
  • 192.0.2.2 dengan IP VM-2
  • 192.0.2.3 dengan IP VM-3
  • report_host=192.0.2.2 dengan IP node server VM-2 / VM-3 (yang sedang di konfigurasi)

6.4 Restart MySQL

$ sudo service mysql restart

6.5 Login ke MySQL

$ sudo mysql -u root -p

6.6 Buat replication user untuk server node (VM-2 dan VM-3):

mysql> SET SQL_LOG_BIN=0;

mysql> SET GLOBAL read_only = OFF;

mysql> CREATE USER 'replication_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Qwerty123456@';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER='replication_user', MASTER_PASSWORD='Qwerty123456@' FOR CHANNEL 'group_replication_recovery';

Ganti Qwerty123456@ dengan password MySQL, syarat: harus ada huruf besar, huruf kecil, angka dan karakter

6.7 Jalankan replication pluggin

mysql> START GROUP_REPLICATION;

6.8 Verifikasi Server 2 / 3 sudah menjadi anggota grup replikasi

mysql> SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE FROM performance_schema.replication_group_members;

* Hasil kurang lebih (tergantung sudah berapa server yang dihubungkan):

+--------------------------------------+-------------+--------------+
| MEMBER_ID                            | MEMBER_HOST | MEMBER_STATE |
+--------------------------------------+-------------+--------------+
| 11111111-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.1  | ONLINE        |
| 22222222-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.2  | ONLINE        |
+--------------------------------------+-------------+--------------+

* Ulangi tahap diatas untuk Server 3 dan seterusnya

7. Uji Coba Replikasi

7.1 Masuk ke MySQL tiap server

$ sudo mysql –u root -p

7.2 Verifikasi server 2 & 3 sudah dapat mengakses replikasi database yang dibuat server 1

mysql> SHOW databases;

+--------------------+
| Database           |
+--------------------+
| simak              |
+--------------------+

7.3 Verifikasi server 2 / 3 sudah dapat mengakses replikasi table yang dibuat server 1

mysql> USE simak;
mysql> SHOW TABLES;

+----------------------------+
| Tables_in_test_replication |
+----------------------------+
| mahasiswa                  |
+----------------------------+

7.4 Masukkan data pada table mahasiswa (dari server manapun)

mysql> insert into mahasiswa VALUES(1, 'yasir');

7.5 Cek hasilnya di semua server

mysql> select * from mahasiswa;

Referensi: https://www.vultr.com/docs/configure-mysql-group-replication-on-ubuntu-20-04