Cara Replikasi MySQL Master To Master Di Centos7

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_FILEMASTER_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.