Suatu saat nanti, mungkin diantara pembaca tulisan ini akan membutuhkan yang namanya Replikasi database MySQL. Fungsi dari replikasi ini salah satunya untuk high availability karena database akan ter-replikasi ke dua server database yang berbeda.
Misal, kita asumsikan terdapat dua buah server MySQL dan pastikan MySQL sudah terinstall pada masing-masing server, jika belum coba baca tulisan ini Cara Install Nginx, Php7, MySQL 5.6, PhpMyAdmin Di Centos 7 :
DB-server1 : 192.168.84.100
DB-server2 : 192.168.81.100
jadi, jika kedua database yang berada pada server yang berbeda tersebut direplikasi, maka apapun yang terjadi pada table di DB-server1
, misal kita melakukan insert data ke DB-server1
maka secara otomatis data tersebut akan ada di server DB-server2
, syncronize dan tercopy secara otomatis. Begitupun sebaliknya, jika ada perubahan data pada table database di server DB-server2
maka akan terupdate juga di server DB-server1
.
Namun, berbeda dengan replikasi MySQL Master/Slave, setiap perubahan di server master maka akan tercopy ke server slave, namun apapun yang terjadi pada table di server slave tidak akan tercopy ke server master. Jadi slave server hanya menerima data saja.
Perbedaan antara replikasi master/master dan master/slave sebenarnya adalah jika replikasi master/master maka kedua service slave pada masing-masing server berjalan, jadi keduanya bertindak sebagai master dan slave. Jika fungsi slave adalah menerima data dari master, maka jika keduanya bertindak sebagai master dan slave maka secara otomatis keduanya akan saling kirim/terima data, logis tidak? namun jika master/slave hanya pada server slave saja service slave berjalan, jadi yang slave hanya menerima data dari master. Lebih jelasnya bisa lihat contoh slave status dibawah ini:
$ [root@DB server1 ~]# mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.84.100
Master_User: dbuser_replica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 771248
Relay_Log_File: mysql-relay-log.000005
Relay_Log_Pos: 771411
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: dbny4
$ [root@DB server2 ~]# mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.81.100
Master_User: dbuser_replica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 120
Relay_Log_File: mysql-relay-log.000005
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: dbny4
Ok, sepertinya cukup mengenai penjelasan Master/Master dan Master/Slave. Pada tulisan ini yang akan dipraktekan adalah konfigurasi replikasi mysql master to master atau master/master.
Konfigurasi pada DB-server1
Masuk ke server DB-server1 lalu edit file /etc/my.cnf
$ vi /etc/my.cnf
kemudian tambahkan seperti dibawah ini:
server-id=1
log-bin="mysql-bin"
binlog-do-db=dbny4
replicate-do-db=dbny4
relay-log="mysql-relay-log"
jika sudah, simpan dan restart service mysql.
$ systemctl restart mysql
Penjelasan
server-id=1
: kita asumsikan bawah server DB-server1 server id nya adalah 1 atau bisa diubah sesuai keinginan, asalkan tidak sama dengan server satunya lagi.
log-bin="mysql-bin"
: ini untuk mysql log bin, biarkan seperti ini saja.
binlog-do-db=dbny4
: diubah sesuai dengan nama database.
replicate-do-db=dbny4
: ganti dengan nama database yang akan di replikasi.
relay-log="mysql-relay-log"
: biarkan seperti ini pada relay log.
selanjutnya masuk ke console MySQL (masih di server DB-server1) dengan cara ketik mysql
lalu enter, seperti dibawah ini:
$ mysql
mysql>
lalu cek master status nya yang mana informasi dari master status ini yang akan digunakan untuk proses replikasi:
mysql> show master status;
+------------------+----------+----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+----------------+------------------+-------------------+
| mysql-bin.000008 | 886372 | m4n4g3r3_dbny4 | | |
+------------------+----------+----------------+------------------+-------------------+
1 row in set (0,00 sec)
Ok, konfigurasi pada server DB-server 1 kita tahan dulu sampai disini. Lanjut ke konfigurasi server DB-server2.
Konfigurasi server DB-server2
Untuk konfigurasi server DB-server2 ini sama seperti server DB-server1, yang perlu diubah adalah server-id
pada file /etc/my.cnf
menjadi seperti ini:
server-id=2
log-bin="mysql-bin"
binlog-do-db=dbny4
replicate-do-db=dbny4
relay-log="mysql-relay-log"
kita bisa lihat, server-id
disini kita ubah menjadi angka 2. Jika sudah simpan perubahan pada file /etc/my.cnf
tersebut dan restart service mysql nya.
Selanjutnya masuk ke console mysql server DB-server2, lalu jalankan show master status;
.
mysql> show master status;
+------------------+----------+----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+----------------+------------------+-------------------+
| mysql-bin.000003 | 120 | dbny4 | | |
+------------------+----------+----------------+------------------+-------------------+
1 row in set (0,00 sec)
Sekarang, balik lagi ke server DB-server1
dan masuk ke mysql console nya. Lalu jalan perintah mysql seperti dibawah ini:
mysql> create user 'dbuser_replica'@'%' identified by 'passwordnya'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'dbuser_replica'@'%';
ubah dbuser_replica
sesuai keiginan. User ini nantinya yang akan digunakan sebagai user untuk replikasi. Sesuaikan juga passwordnya
sesuai dengan password yang di inginkan.
Jika sudah, lakukan hal yang sama di server DB-server2
. Pastikan sama baik user dan passwordnya.
Selanjutnya, kembali ke server DB-server1
, lalu jalankan perintah dibawah ini:
CHANGE MASTER TO MASTER_HOST = '192.168.81.100',MASTER_USER = 'dbuser_replica', MASTER_PASSWORD = 'passwordnya', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 120;
Isi MASTER_HOST
dengan alamat IP DB-server2
. Ubah MASTER_LOG_FILE = 'mysql-bin.000003'
dan MASTER_LOG_POS = 120
sesuai dengan informasi yang tampil pada show master status;
pada server DB-server2
Lakukan hal yang sama pada server DB-server2
namun ubah pada MASTER_HOST
dengan IP DB-server1
, dan ubah MASTER_LOG_FILE
, MASTER_LOG_POS
sesuai dengan show master status;
pada server DB-server1
.
Jika semua hal diatas sudah selesai dilakukan. Jalankan perintah ini di kedua server:
mysql> start slave;
Selesai.
Jika konfigurasi berjalan lancar dan berhasil, maka jika dicek dengan perintah SHOW SLAVE STATUS\G;
pada masing-masing server akan tampil kira-kira seperti ini:
DB-server1
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.81.100
Master_User: dbuser_replica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 896649
Relay_Log_File: mysql-relay-log.000005
Relay_Log_Pos: 896812
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: dbny4
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: 896649
Relay_Log_Space: 906181
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: 1
Master_UUID: 1099217b-cb2b-11ea-9504-0025907133a4
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 the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0,00 sec)
ERROR:
No query specified
DB-server2
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.84.100
Master_User: dbuser_replica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 896649
Relay_Log_File: mysql-relay-log.000005
Relay_Log_Pos: 896812
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: dbny4
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: 896649
Relay_Log_Space: 906181
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: 1
Master_UUID: 1099217b-cb2b-11ea-9504-0025907133a4
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 the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0,00 sec)
ERROR:
No query specified
Bagaimana mengujicoba bahwa replikasi nya benar-benar berhasil? cara mudahnya misal dengan melakukan insert data ke table di database server DB-server1
lalu cek apakah ada di table yang sama di server DB-server2
, lakukan juga hal sebaliknya.
Mughi adalah seorang Content Writer di Pasarhosting. Dia memulai karirnya sebagai pengembara demi mendapat kitab suci dengan dukungan dari gurunya temukan jati diri, tak pernah berhenti bertindak sesuka hati, kera sakti, menjadi pengawal mencari kitab suci, kera sakti, liar, nakal, brutal, membuat semua orang menjadi gempar, kera sakti, hanya hukuman yang dapat menghentikannya.