Kali ini saya akan menjelaskan bagaimana melakukan replikasi database MySQL dari satu server (master) ke server lainnya (slave) dan menggunakan enkripsi SSL, sehingga sulit bagi hacker untuk sniff data ketika proses replikasi berlangsung.
Dengan melakukan replikasi kita bisa memiliki database slave yang datanya sama persis dengan database master. Semua updates yang dilakukan di sisi master akan “langsung” ter-replikasi ke slave. Perlu diingat bahwa skema seperti ini bukan untuk backup, karena apabila kita melakukan perintah DELETE pada master maka perintah tersebut juga akan tereksekusi di slave. Tapi skema seperti ini dapat berguna apabila misalnya terjadi hardware failure pada salah satu server sehingga bisa langsung switch over. Atau untuk meningkatkan performa aplikasi web, semua proses write / update dilakukan di server master, dan proses read / select dilakukan di server slave.
Tutorial ini akan menunjukkan bagaimana cara mereplikasi database koole dari server server1.lifebit.co (master, IP 192.168.1.1) ke server server2.lifebit.co (slave, IP 192.168.1.2). Kedua server menggunakan distro Linux Debian Squeeze. Database koole sudah terisi dengan data pada server master, dan pada server slave belum terisi apa-apa.
- Install MySQL Server pada server1 dan server2 maka install dengan cara berikut;
server1 & server2:apt-get install mysql-server mysql-client
kita akan diminta untuk memasukkan password baru root MySQL, bukan password root linux!
New password for the MySQL "root" user: Repeat password for the MySQL "root" user:
jika sudah terinstall lalu kita login ke MySQL (server1 dan server2) untuk mengecek apakah SSL support sudah diaktifkan atau belum;
mysql -u root -p
lalu execute perintah ini pada prompt SQL;
show variables like '%ssl%';jika hasilnya seperti di bawah ini;
+---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+----------+ 7 rows in set (0.07 sec)
itu berarti MySQL server sudah terinstall dengan dukungan SSL. Selanjutnya kita tinggal mengaktifkannya aja. Keluar dulu dari prompt SQL;
quit;
dan buka file file /etc/mysql/my.cnf;
vi /etc/mysql/my.cnf
pada bagian * Security Features uncomment atau tambahkan line baru dengan kata “ssl”
# * Security Features ## Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ ## For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem
lalu restart mysql;
/etc/init.d/mysql restart
cek lagi apakah SSL sudah diaktifkan atau belum;
mysql -u root -p
show variables like '%ssl%';outputnya harus seperti ini;
mysql> show variables like '%ssl%';
+---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+----------+ 7 rows in set (0.07 sec)
ketik;
quit;
untuk keluar dari SQL prompt..
- Mengkonfigurasi Master Agar proses replikasi dapat berjalan, kita harus mengkonfigurasi service MySQL untuk listen pada semua interface (server1). Untuk itu beri tanda # pada baris bind-address = 127.0.0.1 di /etc/mysql/my.cnf:
server1:vi /etc/mysql/my.cnf
# Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1
restart MySQL;
/etc/init.d/mysql restart
Sekarang kita akan membuat CA, server, dan client certificates yang akan dibutuhkan untuk proses enkripsi SSL. Sebagai contoh saya akan membuat certificates tersebut di direktori /etc/mysql/newcerts;
mkdir /etc/mysql/newcerts
cd /etc/mysql/newcerts
pastikan openssl sudah terinstall;
apt-get install openssl
buat CA certificate;
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes 1000 -key ca-key.pem > ca-cert.pem
buat server certificate;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
buat client certificate;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
sehingga isi dari folder /etc/mysql/newcerts terlihat seperti ini;
root@server1:/etc/mysql/newcerts# ls -l total 32 -rw-r--r-- 1 root root 1346 Dec 17 16:17 ca-cert.pem -rw-r--r-- 1 root root 1675 Dec 17 16:17 ca-key.pem -rw-r--r-- 1 root root 1099 Dec 17 16:17 client-cert.pem -rw-r--r-- 1 root root 1679 Dec 17 16:17 client-key.pem -rw-r--r-- 1 root root 956 Dec 17 16:17 client-req.pem -rw-r--r-- 1 root root 1099 Dec 17 16:17 server-cert.pem -rw-r--r-- 1 root root 1675 Dec 17 16:17 server-key.pem -rw-r--r-- 1 root root 956 Dec 17 16:17 server-req.pem root@server1:/etc/mysql/newcerts#
Penting! Pastikan COMMON NAME ketika membuat CA certificate dan Server certificate harus berbeda. Misal common name CA certificate adalah ca.lifebit.co dan common name untuk server certificate adalah lifebit.co.
sekarang kita harus mentransfer ca-cert.pem, client-cert.pem, dan client-key.pem ke slave (server2), tapi sebelumnya kita buat dulu direktori /etc/mysql/newcerts di server2;
server2:mkdir /etc/mysql/newcerts
kembali ke server1, kita bisa transfer file-file tersebut di atas tadi dengan cara;
server1:scp /etc/mysql/newcerts/ca-cert.pem root@192.168.1.2:/etc/mysql/newcerts scp /etc/mysql/newcerts/client-cert.pem root@192.168.1.2:/etc/mysql/newcerts scp /etc/mysql/newcerts/client-key.pem root@192.168.1.2:/etc/mysql/newcerts
lalu, buka /etc/msql/my.cnf;
vi /etc/mysql/my.cnf
edit pada bagian * Security Features; hilangkan tanda pagar pada ssl-ca, ssl-cert, dan ssl-key dan isi dengan nilai yang sesuai;
# * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl ssl-ca=/etc/mysql/newcerts/ca-cert.pem ssl-cert=/etc/mysql/newcerts/server-cert.pem ssl-key=/etc/mysql/newcerts/server-key.pem
restart MySQL;
/etc/init.d/mysql restart
Sekarang kita buat user MySQL yang akan digunakan oleh server2 untuk mengakses database pada server1, misal slave_user;
mysql -u root -p
pada MySQL prompt, execute perintah ini;
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password'; FLUSH PRIVILEGES;
quit;
Kita harus memberitau MySQL agar membuat log untuk database koole (yang akan direplikasi). Nantinya log inilah yang akan digunakan oleh slave untuk melihat apa yang sudah berubah dari database master. Edit file /etc/mysql/my.cnf seperti ini;
vi /etc/mysql/my.cnf
# The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about other settings you may need to change. server-id = 1 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M binlog_do_db = koole
restart MySQL;
/etc/init.d/mysql restart
Langkah berikutnya kita akan mengunci (lock) database koole di server1, mengetahui master status server1, dan membuat SQL dump database koole (yang akan kita import ke server2), lalu unlock database koole agar bisa digunakan lagi;
mysql -u root -p
pada prompt MySQL execute command ini;
USE koole; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
perintah terakhir akan menampilkan output seperti ini. Catat hasilnya!
+---------------+----------+--------------+------------------+ | File | Position | Binlog_do_db | Binlog_ignore_db | +---------------+----------+--------------+------------------+ | mysql-bin.006 | 183 | koole | | +---------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
Sekarang jangan keluar dulu dari prompt MySQL, karena kalau keluar database akan otomatis unlock. Buka satu lagi prompt bash / Linux di server1;
cd /tmp
mysqldump - u root -ppasswordrootmysql --opt koole > snapshot.sql
scp snapshot.sql root@192.168.1.2:/tmp
Kalau proses transfer sudah selesai kita boleh close prompt Linux, kemudian unlock dan keluar dari database koole;
server1:UNLOCK TABLES; quit;
- Konfigurasi Slave
Di server slave kita buat database koole;mysql -u root -p Enter password: CREATE DATABASE koole; quit;
lalu import mysql dump dari server master yang tadi sudah dibuat (snapshot.sql)
mysql -u root -p<password> koole < /tmp/snapshot.sql
Penting: ngga ada spasi antara -p dan <password>.
Sekarang kita beritau server slave bahwa dia adalah slave, masternya adalah 192.168.1.1, dan database yang harus dimonitor di master adalah koole. Untuk itu tambahkan / edit baris berikut di /etc/mysql/my.cnf;
server-id=2 master-host=192.168.1.1 master-user=slave_user master-password=slave_password master-connect-retry=60 replicate-do-db=koole
restart MySQL;
/etc/init.d/mysql restart
Langkah berikutnya;
mysql -u root -p Enter password: SLAVE STOP;
masih di sql prompt yang sama;
CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.006', MASTER_LOG_POS=183;
MASTER_HOST adalah ip address atau hostname server master (dalam contoh ini 192.168.1.1).
MASTER_USER adalah user yang diberikan akses untuk melakukan replikasi di database master.
MASTER_PASSWORD adalah password user replikasi di server master.
MASTER_LOG_FILE adalah file log yang terlihat ketika kita mengetikkan perintah SHOW MASTER STATUS; di server master tadi.
MASTER_LOG_POS adalah posisi terakhir MySQL ketika kita mengetikkan perintah SHOW MASTER STATUS; di server master.Langkah terakhir adalah start slave, masih di prompt sql server slave;
START SLAVE; quit;
Selesai! Sekarang coba tes lakukan update di server master dan lihat apakah ada perubahan di server slave ;)
Post terkait:

wah tutorialnya bagus ni, saya udah nyoba dan berhasil. Saya mau tanya ni mas, kalo yang tutorial mas ini kan untuk replikasi satu arah ya. Nah setelah saya coba berhasil mas, saya mau tanya bagaimana caranya jika saya ingin merubah settingannya jadi replikasi dua arah atau master – master.
kalo maksudnya mau syncing 2 db mysql yang selevel, coba deh baca tutorial di sini;
http://www.neocodesoftware.com/replication/
kayaknya simple aja tuh konfigurasinya
ok, mas terima kasih banyak buat infonya. Maaf mas saya mau
nanya lagi ni.
Sekarang kalo misal saya punya beberapa server. Misal 1 server sebagai induk server master(katakanlah speknya lebih tinggi dari server lainnya),
terus ada beberapa server yang jadi replikanya, tapi model replikasinya master to master(syncing db) dan 1 lagi server khusus untuk slave saja(sebagai server backup data).
Nah kalo konfigurasinya seperti itu gimana mas…? mohon infonya. Terima Kasih
ya kalo gitu sama aja kan prinsipnya.
karena semua master saling syncing, berarti sebenernya ngga ada lagi istilah slave? atau malah sebenernya semua slave.
bisa disebut master karena server tersebut ngga membaca data dari server lain.