Membuat Replikasi Database MySQL

Rasanya di internet sudah banyak sekali yang membahas bagaimana membuat replikasi database MySQL, dari cara yang sulit sampai ke yang mudah. Tapi ternyata ada beberapa tutorial yang tidak bisa berjalan sebagai mestinya. Jadi perkenankanlah saya menuliskannya lagi di sini dengan disertai beberapa komentar pelengkap.

Tutorial ini bukan bermaksud untuk menggurui atau menyalahkan tutorial lain. Namun sebagai catatan pelengkap terhadap beberapa tutorial replikasi mysql yang telah ada sebelumnya. Namun catatan ini telah saya coba untuk replikasi master-slave di 2 mesin berbeda dan terbukti berjalan dengan baik.

Dalam panduan ini kita menggunakan sistem operasi Ubuntu Linux dan kita umpamakan ada 2 mesin mysql dengan IP:

202.0.0.100 (master)
202.0.0.200 (slave)

Setup Master

Pada mesin master, kita buka terminal. Jika Anda tidak dapat langsung bekerja di mesin master, maka Anda dapat mengakses mesin master via ssh.

Pertama yang kita lakukan adalah mengubah konfigurasi mysql di master (202.0.0.100) dengan meng-edit file /etc/mysql/my.cnf.

sudo nano /etc/mysql/my.cnf

Yang pertama kita ubah adalah variable bind-address. Jika sebelumnya menunjuk ke localhost (127.0.0.1), maka kita ubah ke IP static dari mesin server. Berikut contohnya:

bind-address = 202.0.0.100

Selanjutnya temukan variabel server-id. Pastikan bahwa baris ini tidak diawali dengan karakter # (karakter ini menjadikan variabel tersebut komentar dan akan diabaikan oleh mysql). Ubah nilainya menjadi 1 atau angka terserah Anda. Namun harus diingat ID server ini karena akan dijadikan referensi oleh slave. Pada contoh saya menggunakan angka 100.

server-id = 100

Temukan variabel log_bin dan pastikan tidak diawali karakter # (komen). Nilainya adalah /var/log/mysql/mysql-bin.log. Berikut contohnya:

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

Temukan variabel binlog_do_db dan pastikan tidak diawali karakter # (komen). Isikan nilainya dengan nama database yang ingin Anda replikasi. Berikut contoh untuk mereplikasi database kontak.

binlog_do_db = kontak

Bagaimana jika ingin mereplikasi lebih dari 1 database? Caranya gampang. Anda tinggal menambahkan variabel binlog_do_db dengan nilai database ke-2 dst. Berikut contohnya jika akan mereplikasi database kontak dan rs.

binlog_do_db = kontak
binlog_do_db = rs

Simpan perubahan yang sudah dilakukan dan restart mysql. Untuk restart mysql dapat menggunakan perintah:

sudo service mysql restart

Pastikan mysql dapat restart dengan baik. Jika ada error, coba telusuri pesan error di file /var/log/mysql/error.log. Biasanya error karena bind-address yang tidak sesuai dengan IP mesin.

Jika tidak ada error, kita dapat lanjut dengan membuat hak akses bagi mesin slave. Pertama Anda harus masuk dulu ke mysql. Jalankan shell mysql dengan cara:

mysql -u root -p

Jalankan perintah berikut untuk memberikan hak akses bagi slave. Pada contoh kita beri nama slave sebagai replicator. Berikut contohnya:

GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%' IDENTIFIED BY 'katakunci';

Kemudian ikuti perintah:

FLUSH PRIVILEGES;

Selanjutnya perlu kita buat backup data untuk database yang akan kita replikasi. Backup ini yang akan kita import ke mesin slave. Pada contoh kita akan mereplikasi database kontak, maka kita backup database kontak. Namun sebelum membuat backup-nya kita perlu kunci database supaya tidak ada perubahan saat kita buat backup-nya.

use kontak;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Kita akan melihat tabel seperti contoh di bawah ini:

+------------------+----------+--------------------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------------------------+------------------+
| mysql-bin.000070 | 300 | kontak, rs | |
+------------------+----------+--------------------------------+------------------+
1 row in set (0.00 sec)

Ini perlu dicatat. Copy paste saja di text editor untuk digunakan nanti pada saat mengeset slave.

Kita biarkan terminal yang terkoneksi ke mysql master. Kita buka lagi terminal ke-2. Mengapa? Karena pada saat lock kita tidak boleh melakukan perubahan. Karena jika mengubah sesuatu di sesi mysql yang sama, maka secara otomatis lock terbuka.

Di terminal ke-2 kita lakukan backup ke-2 database di shell. Berikut perintahnya:

mysqldump -u root -p --opt kontak > kontak.sql

Demikian juga dengan database ke-2:

mysqldump -u root -p --opt rs > rs.sql

Setelah proses selesai, kita dapat menutup terminal ke-2. Sekarang kita kembali ke terminal pertama (sesi mysql) dan buka lock dengan perintah:

UNLOCK TABLES;

Kemudian kita dapat keluar dari sesi mysql.

exit;

Oke, setting utk mesin master telah selesai.

Setup Slave

Sekarang kita lakukan setup untuk mesin slave via terminal. Jika Anda tidak dapat bekerja langsung di mesin slave, maka Anda perlu mengaksesnya via ssh. Masuk ke shell mysql.

mysql -u root -p

Pertama adalah membuat database yang akan direplikasi. Pada contoh ini kita akan mereplikasi 2 database, maka kita perlu membuat 2 database tersebut.

CREATE DATABASE kontak;
CREATE DATABASE rs;

Kemudian via shell kita restore ke-2 file backup yang telah kita buat tadi. Mungkin Anda perlu mengirimkan data backup dari mesin master tadi ke mesin slave. Berikut cara import-nya.

use kontak;
source /home/backup/kontak.sql;

Tunggu sampai proses selesai. Lakukan juga untuk database ke-2.

use rs;
source /home/backup/rs.sql;

Setelah selesai. Anda dapat keluar dari shell mysql.

exit;

Pada shell kita edit file konfigurasi mysql di slave. Seperti di atas, kita pakai editor andalan nano.

sudo nano /etc/mysql.cnf

Temukan variabel server-id dan ubah nilainya menjadi 2. Namun dalam contoh ini saya mengubahnya menjadi 200. Anda dapat menyesuaikan terhadap setup server lain yang ada dalam network Anda. Asal nilainya tidak sama dengan ID server.

server-id = 200

Kemudian tambahkan variabel relay-log seperti berikut ini. Secara default variabel ini belum ada di my.cnf.

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

Pastikan variabel berikut tidak diawali dengan karakter # (komen).

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

Tambahkan variabel replicate_do_db dan isikan dengan nama database yang di-replikasi.

replicate_do_db = kontak

Variable ini tidak terdapat di beberapa tutorial di internet yang kadang membuat proses replikasi tidak berjalan dengan semestinya!

Jika Anda mereplikasi lebih dari 1 database, maka tuliskan lagi variabel tersebut dengan nilai database ke-2 dst. Berikut contohnya jika mereplikasi 2 database:

replicate_do_db = kontak
replicate_do_db = rs

Jangan lupa simpan perubahan. Setelah itu restart service mysql dengan perintah:

sudo service mysql restart;

Selanjutnya kita perlu meng-enable replikasi di slave. Masuk dulu di shell mysql.

mysql -u root -p

Kemudian jalankan perintah berikut:

CHANGE MASTER TO MASTER_HOST='202.0.0.100',MASTER_USER='replicator', MASTER_PASSWORD='katakunci', MASTER_LOG_FILE='mysql-bin.000070', MASTER_LOG_POS= 300;

Fungsi dari perintah ini adalah mengeset agar mesin menjadi slave bagi master di 202.0.0.100, mengeset kredensi yang digunakan utk akses ke master dan memberitahu file bin log dan posisi pembacaan data.

Pastikan tidak ada error. Jika ada error, coba teliti lagi satu per satu variabel yang telah di set di master & slave, siapa tahu ada yang salah.

Jika tidak ada error, silakan aktifkan slave dengan perintah:

START SLAVE;

Kita dapat melihat status slave dengan perintah berikut:

show slave status\G;

Jika terjadi masalah saat koneksi master-slave, kita dapat mencoba menjalankan perintah berikut di slave untuk melewati pesan error.

set global SQL_SLAVE_SKIP_COUNTER=1;
slave start;

Cek Replikasi

Untuk mengecek apakah replikasi berjalan atau tidak dapat dilakukan dengan mudah. Coba lihat status di master dengan perintah berikut di shell mysql master.

show master status\G;

Kemudian cek status slave dengan menjalankan perintah berikut di shell mysql slave.

show slavel status\G;

Apakah nilai master log bin dan posisinya sama? Jika sama, berarti berjalan dengan baik.

Cara pengecekan ke-2 adalah dengan melakukan perubahan data di salah satu tabel di master dan cek apakah data juga ikut berubah di slave? Jika ikut berubah, berarti replikasi sudah berjalan dengan baik.

Delay Replikasi

Kadang kala slave tidak ikut berubah padahal master telah berubah. Mestinya delay tidak terlalu lama. Namun jika delay sudah lebih dari 10 menit, maka Anda perlu mengecek apakah segalanya bekerja dengan baik (lihat bab Cek Replikasi). Anda perlu mengecek network-nya juga. Mungkin ada masalah di network.

Delay seperti ini kadang dianggap mengganggu. Namun kadang kala kita memerlukan delay!

Karena kerja replikasi seyogyanya segera, maka apa yang terjadi pada data di master akan segera dilakukan pula di slave. Coba bayangkan jika ada kesalahan query seperti menghapus database atau tabel, atau server master di-hack, lalu begitu pula yang akan dilakukan di server replikasi. Alamak…

Nah, kita bisa menunda proses replikasi di slave dengan cara mengeset nilai delay dengan harapan kerusakan tidak segera terjadi di slave dan kita dapat menyelamatkan data di slave. Pada mysql versi 5.6 ada perintah yang memaksa slave untuk melakukan delay, yaitu:

change master to master_delay = N;

Isikan N dengan nilai berapa detik replikasi akan ditunda. Sebaiknya delay tidak terlalu lama, karena pada prinsipnya replikasi semestinya dilakukan segera.

Penutup

Tidak sulit kan membuat replikasi? Setup replikasi sangat bermanfaat untuk mem-backup database utama secara segera ke database slave. Replikasi akan melakukan sinkronisasi data antara master ke slave dengan cara melakukan perubahan yang terjadi di master ke mesin slave. Secara komunikasi data tentu saja ini sangat efisien karena hanya perubahannya yang terjadi di master yang dikirimkan ke slave.

Walau pun demikian, kita perlu melakukan backup secara tradisional juga, yaitu menyalin snapshot database. Anda dapat menggunakan script automysqlbackup untuk melakukannya. Dan script ini perlu dijalankan di waktu-waktu tertentu dengan utility scheduler semacam crontab.

Lain kali kita bahas automysqlbackup.

Oh iya, jika Anda punya masukan atau saran, janganlah ragu untuk menulis di bagian komentar di bawah. Saya akan sangat berterima kasih atas sumbangsih Anda.

Salam

24 thoughts on “Membuat Replikasi Database MySQL

  1. mangtaps

    tutornya bagus klo bisa kasi tutorial bagaimana replikasi dari banyak master ke satu selve ? thanks

    Reply
  2. mangtaps

    tutornya bagus klo bisa kasi tutorial bagaimana replikasi dari banyak master ke satu selve ? thanks

    drafshare.blogspot.com

    Reply
  3. ravie

    artikel yang sangat menarik, jika diperkenankan saya bertanya apakah ada cara untuk mengetahui lamanya waktu replikasi? jika ada bisa membantu saya dengan menshare caranya ke email saya? mengingat saya sedang dihadapkan dengan tugas akhir. atas bantuannya saya ucapkan terimakasih

    regard

    Reply
  4. titi

    Artikel yg bagus sekali mas, kebetulan saya juga sedang mengerjakan tugas itu. Namun, saya mengalami sedikit kendala ketika memasukkan perintah show master status. Bukannya nampil tabel seperti diatas, melainkan muncul tulisan empty set. Kenapa ya bisa begitu? Mohon pencerahannya masa.

    Reply
  5. rama

    misalnya saya replikasi database di server A ke database ke server B, dan di server B ada data masuk/baru (dibuat tester aplikasi) nah di A kan tidak ada tambahan data. sedangkan di B ada lalu bagaimana database di server B, bila da tambhana baru dari server database A kan otomatis urutan tabelnya berbeda ? apakah error ?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *