Replikasi Database MySQL Dengan SSL Pada Debian Squeeze

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.

MySQL Replication

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

  2. 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;
  3. 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 ;)

 

Jika Anda menyukai posting ini, silakan tinggalkan komentar atau berlangganan RSS feed agar artikel mendatang dikirim langsung ke feed reader Anda.

Post terkait:

  1. Install Lighttpd Dengan PHP5 Dan MySQL Pada Debian 6 (Squeeze)
  2. Uninstall MySQL Server 5 dari Debian
  3. Virtual Host Pada LIGHTTPD
  4. Mac OS X Lambat Setelah Upgrade 10.6.6

4 thoughts on “Replikasi Database MySQL Dengan SSL Pada Debian Squeeze

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

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

Leave a Reply

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

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">