Replikasi (Replication dalam bahasa Inggris) adalah salah satu cara untuk mencegah terjadinya SPOF (Single Point Of Failure) yaitu dengan membuat sebuah node/server sebagai tempat backup. Proses replikasi itu sendiri adalah dengan menyalin seluruh atau sebagian data yang ada pada Master node /server ke dalam Slave node/server. SQL Database berisi data-data yang sangat riskan bila terjadi sedikit masalah saja karena akan sangat berpengaruh terhadap aplikasi server. Maka dari itu kali ini kita akan mencoba membuat sebuah replikasi database dengan menggunakan MySQL Replication.

MySQL replication adalah sebuah proses yang memperbolehkan kita dengan mudah untuk membuat suatu salinan/copy dari sebuah database dengan membuat penyalinan secara otomatis dari databse Master ke database Slave. Selain itu kita juga dapat dengan mudah menganalisa database tanpa menggunakan main database yang sedang live alias kita bisa bereksplorasi dengan database slave tanpa takut bila terjadi kesalahan.

Persiapan

Disini kita akan menggunakan 2 VM Ubuntu server 16.04.

Server A – MySQL Master
Hostname: mysql-master
IP: 172.19.0.1

Server B – MySQL Slave
Hostname: mysql-slave
IP: 172.19.0.2

Install MySQL Server

Pada kedua server install paket mysql-server:

sudo apt-get install mysql-server mysql-client

Step 1 — Konfigurasi database Master

Edit file konfigurasi pada server master.

[email protected]:~$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Di bawah [mysqld] tambahkan/ubah beberapa baris konfigurasi.

Pertama adalah ke IP mana server akan di binding, ganti 127.0.0.1 (localhost) dengan IP server karena kita akan binding server agar bisa diakses dari manapun (kecuali jika hanya lokal saja).

bind-address    = 127.0.0.1

Ganti dengan IP:

bind-address    = 172.19.0.1

Kemudian ubah/uncomment (hilangkan tag ‘#’) pada bagian server-id. Ini adalah untuk menandakan ID dari server tersebut. Kita bisa ganti dengan angka berapun tapi lebih baik dimulai dari angka yang paling kecil. Yang perlu di ingat adalah harus menggunakan id number yang tidak boleh sama dengan id server lainnya.

server-id       = 1

Pada baris log_bin, adalah dimana semua log proses replikasi disimpan. Slave server nantinya kana menyalin semua perubahan yang ada di log tersebut. Cukup dengan uncomment (#) pada bagian:

log_bin         = /var/log/mysql/mysql-bin.log

Baris yang paling penting adalah binlog_do_db. Kita tentukan database mana yang nanti akan kita replikasi dengan server slave. Jika ingin mereplikasi beberapa database cukup dipisahkan dengan menyalin barisnya.

binlog_do_db    = db_tekmagz

Restart service mysql:

systemctl restart mysql.service

Langkah selanjutnya buka mysql shell untuk melanjutkan konfigurasi.

mysql -u root -p

Buat user yang nantinya akan digunakan untuk autentikasi pada server slave. Kemudian beri grant akses untuk dapat melakukan replikasi.

mysql> GRANT REPLICATION SLAVE ON *.* TO 'userbelajar'@'%' IDENTIFIED BY 'b3lajar'; FLUSH PRIVILEGES;

Buat juga database yang akan di replikasi.

mysql> create database db_tekmagz;

Kemudian berikan permission ke user agar bisa mereplikasi database:

mysql> grant replication slave on *.* to 'userbelajar'@'%';

Kemudian cek status dari server master:

mysql> SHOW MASTER STATUS;
+------------------+----------+---------------+------------------+
| File             | Position | Binlog_Do_DB  | Binlog_Ignore_DB |
+------------------+----------+---------------+------------------+
| mysql-bin.000001 |      748 | db_tekmagz    |                  |
+------------------+----------+---------------+------------------+
1 row in set (0.00 sec)

Bagian yang perlu dicatat adalah File dan Position karena nanti akan digunakan pada konfigurasi server slave.

Step 2 — Konfigurasi database Slave

Setelah selesai mengkonfigurasi database master, sekarang kita perlu mengkonfigurasi server slave. Di bawah [mysqld] tambahkan/ubah beberapa baris pada file konfigurasi sama seperti pada server master namun ada sedikit perbedaan:

[email protected]:~$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Ingat! server-id tidak boleh memiliki value yang sama, jadi kita harus menggunakan angka yang berbeda dari server master. Kita harus mengganti value default 1.

server-id       = 2

Konfigurasinya hampir sama seperti pada server master, hanya saja kita akan menambahkan baris relay-log.

bind-address    = 172.19.0.2
relay-log       = /var/log/mysql/mysql-relay-bin.log
log_bin         = /var/log/mysql/mysql-bin.log
binlog_do_db    = db_tekmagz

Restart service mysql:

systemctl restart mysql.service

Setelah itu kita harus masuk ke mysql shell untuk melanjutkan konfigurasi:

mysql -u root -p

Jalankan command berikut dan ganti value dengan informasi yang ada pada server master:

mysql> CHANGE MASTER TO MASTER_HOST='172.19.0.1',MASTER_USER='userbelajar', MASTER_PASSWORD='b3lajar', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=748;

Ganti MASTER_USER, MASTER_PASSWORD, MASTER_LOG_FILE, dan MASTER_LOG_POS sesuaikan dengan informasi yang ada pada server master.

Buat juga database yang sama dengan yang akan di replikasi.

mysql> create database db_tekmagz;

Kemudian aktifkan slave server:

mysql> START SLAVE;

Untuk melihat status replikasi dari server slave bisa menggunakan command berikut:

mysql> SHOW SLAVE STATUS\G

Tambahan \G adalah agar hasil output yang keluar menjadi mudah dibaca.

Hasil output akan seperti ini:

mysql> show slave status\G;
*************************** 1. row ***************************
 Slave_IO_State: Waiting for master to send event
 Master_Host: 172.19.0.1
 Master_User: userbelajar
 Master_Port: 3306
 Connect_Retry: 60
 Master_Log_File: mysql-bin.000001
 Read_Master_Log_Pos: 1641
 Relay_Log_File: mysql-relay-bin.000003
 Relay_Log_Pos: 1213
 Relay_Master_Log_File: mysql-bin.000001
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 --------- Output terlalu panjang ----------
 Last_Errno: 0
 Last_Error: 
 Skip_Counter: 0
 Exec_Master_Log_Pos: 1641
 Relay_Log_Space: 1420
 Last_IO_Errno: 0
 Last_IO_Error: 
 Last_SQL_Errno: 0
 Last_SQL_Error: 
 Replicate_Ignore_Server_Ids: 
 Master_Server_Id: 1
 Master_UUID: 9ece3aa9-bf2e-11e7-aafe-080027368dd4
 Master_Info_File: /var/lib/mysql/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
 --------- Output terlalu panjang ----------
 Master_TLS_Version: 
1 row in set (0.00 sec)

Jika masih ada isu saat ingin mengaktifkan slave server, cukup dengan menjalankan command:

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;

Step 3 – Testing Replikasi

Membuat Table

Kita akan mencoba untuk membuat sebuah table pada database db_tekmagz.

mysql> create table db_tekmagz.table_kosong (`id` varchar(10)); 

Menampilkan Table

Kemudian cek pada server slave:

mysql> show tables in db_tekmagz; 

Jika proses replikasi berhasil outputnya akan seperti ini:

+----------------------+
| Tables_in_db_tekmagz |
+----------------------+
| table_kosong         |
+----------------------+
1 row in set (0.00 sec)

Menghapus Table

Kemudian kita akan mencoba untuk menghapus table pada server master.

Kita akan menghapus table_kosong yang ada pada database db_tekmagz

mysql> DROP TABLE db_tekmagz.table_kosong;

Kemudian coba cek pada server slave, jika table juga terhapus berarti proses replikasi sudah berhasil.