Replikasi Database MySQL


Contoh IP yang digunakan : 

  • 10.12.12.21 – sebagai Database Master
  • 10.12.12.71 – sebagai Database Slave

Berikut adalah cara replikasi database mysql

1. Konfirugasi Database Master

1.1. Buka konfigurasi MariaDB pada server master:

$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf


1.2. Ubah beberapa parameter berikut :

bind-address   = 127.0.0.1     menjadi    bind-address   = 10.12.12.21


1.3. Selanjutnya konfigurasikan server-id. Konfigurasi ini terletak pada bagian [mysqld].  Disini dapat memilih angka berapa saja untuk konfigurasi , tapi angkanya harus unik dan tidak boleh ada yang sama antara kelompok replikasi. 

server-id   = 1


1.4. Selanjutnya baris log_bin. Database slave akan menyalin semua perubahan yang terdaftar dalam log.  hapus tanda # di depan log_bin.

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


1.5. Kemudian definisikan database apa yang akan direplikasi di server slave.  dapat menyertakan lebih dari satu database dengan mengulangi baris ini untuk setiap database yang diperlukan.

binlog_to_db   = dbapp


1.6. Simpan berkas konfigurasi tersebut dengan menekan Ctrl+X, lalu Y, dan Enter. Restart MariaDB.

$ sudo systemctl restart mysql


1.7.  Langkah berikutnya, masuk ke shell MariaDB.

$ sudo -i

# mysql -u root -p


1.8. Buat database yang akan direplikasi ( lewati langkah ini jika sudah ada databasenya ).

MariaDB [(none)]> CREATE DATABASE dbapp;


1.9. Beri akses slave dengan mengetikkan perintah berikut pada shell MariaDB.

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave123';

MariaDB [(none)]> FLUSH PRIVILEGES;

Catatan :

Nama pengguna yang digunakan adalah slave_user dan passwordnya adalah slave123. Nama pengguna dan sandi tersebut akan digunakan oleh slave untuk mengakses dan mereplikasi database dari master. 


1.10. Buka tab/jendela baru untuk melakukan langkah berikutnya. Pada tab baru tersebut, masuk kembali ke MariaDB dan gunakan database yang akan direplikasi.

MariaDB [(none)]> USE dbapp;

1.11. Jalankan perintah berikut untuk mencegah (baca: mengunci) perubahan pada database tersebut.

MariaDB [puskoapp]> FLUSH TABLES WITH READ LOCK;

Lalu ketikkan :

MariaDB [puskoapp]> SHOW MASTER STATUS;

Output :

MariaDB [puskoapp]> SHOW MASTER STATUS;                            

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |      312 | puskoapp     |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

Catatan :

Ini posisi di mana database slave akan mulai mereplikasi. Catat nomor ini, karena akan digunakan pada langkah berikutnya. Jika melakukan perubahan pada jendela yang sama, database tersebut akan secara otomatis terbuka kuncinya. Untuk alasan inilah, perlu membuka tab/jendela baru untuk melanjutkan ke langkah berikutnya.


1.12. 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 puskoapp > puskoapp.sql


1.1.3. Kembali ke jendela sebelumnya, buka kunci database (buat agar dapat diubah kontennya).

MariaDB [puskoapp]> UNLOCK TABLES;


1.1.4. Keluar dari shell MariaDB dengan mengetikkan exit; atau \q

MariaDB [puskoapp]> \q

Bye


2. Konfigurasikan database slave.

2.1. Masuk ke server slave, buka shell MariaDB dan buat database baru dengan nama yang sama, lalu keluar.

MariaDB [(none)]> CREATE DATABASE dbapp;

Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> \q

Bye


2.2. Import database yang sebelumnya diekspor dari database master.

# mysql -u root -p dbapp < /lokasi/file/dbapp.sql


2.3. Selanjutnya konfigurasikan seperti yang dilakukan pada master.

$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf


2.4. Pastikan beberapa konfigurasi berikut diatur dengan tepat. Pertama adalah server-id. Seperti yang disebutkan sebelumnya, nomor server-id di sini harus unik. Tidak boleh ada yang sama antara satu kelompok master-slave. Karena bawaannya adalah 1, pastikan ubah dengan angka yang berbeda.

server-id  = 2


2.5. Pastikan setidaknya kriteria konfigurasi berikut terisi dengan tepat:

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

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

binlog_do_db              = fbapp

Catatan :

disini perlu menambahkan baris relay-log secara manual. Baris tersebut tidak ada sebelumnya. Setelah perubahan konfigurasi telah dibuat sebagaimana diinginkan, simpan dan keluar dari berkas konfigurasi.


2.6. Restart MariaDB sekali lagi.

$ sudo systemctl restart mysql


2.7. Langkah berikutnya, aktifkan replikasi dengan shell MariaDB. Buka shell MariaDB sekali lagi dan ketikkan perintah berikut, ubah dan suaikan dengan konfigurasi :

MariaDB [(none)]> CHANGE MASTER TO

 -> MASTER_HOST='10.12.12.21',

 -> MASTER_USER='slave_user',

 -> MASTER_PASSWORD='slave123',

 -> MASTER_LOG_FILE='mysql-bin.000001',

 -> MASTER_USE_GTID = current_pos,

 -> MASTER_LOG_POS= 312;

Query OK, 0 rows affected (0.30 sec)

catatan :

Perintah tersebut menyelesaikan beberapa tugas sekaligus:

  • Ini menunjuk server saat ini sebagai slave dari master server yang beralamat di 10.12.12.21,
  • Menyediakan kredensial masuk yang tepat pada server,
  • Memungkinkan slave tahu dari mana harus mulai melakukan replikasi; master log file dan log posisi berasal dari angka yang ditulis sebelumnya.


2.8. Lalu aktifkan server slave:

MariaDB [(none)]> START SLAVE;

Query OK, 0 rows affected (0.00 sec)


2.9. Selanjutnya untuk melihat detil informasi replikasi slave dengan mengetikkan perintah ini. Pilihan \G di belakang perintah berikut untuk menata teks agar dapat lebih mudah dibaca.

MariaDB [(none)]> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.19.19.251

                  Master_User: slave_user

                  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: 

1 row in set (0.00 sec)

catatan :

Jika ada masalah koneksi,  dapat menjalankan slave dengan perintah skip:

MariaDB [(none)]> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;


3. Cek Hasil

Pada database master, buatlah sebuah tabel, misal dengan perintah berikut :

MariaDB [dbapp]> CREATE TABLE slave_user (

    -> id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,

    -> firstname VARCHAR(30) NOT NULL,

    -> lastname VARCHAR(30) NOT NULL,

    -> email VARCHAR(50),

    -> reg_date TIMESTAMP

    -> );


Lalu periksa pada database slave. Jika berhasil, sebuah tabel akan dibuat di sana, sama persis dengan yang di master:

MariaDB [dbapp]> SHOW TABLES;

+--------------------+

| Tables_in_dbapp |

+--------------------+

| slave_user         |

+--------------------+