Dewacloud blog featured image

Replikasi Master-Slave untuk Database MySQL/MariaDB di Dewacloud

Master Slave Replication digunakan untuk memecahkan problem seperti performance, mendukung cadangan database yang berbeda dan solusi untuk mengurangi kegagalan dari sebuah sistem. Hal ini memungkinkan data dari satu database server (master) untuk direplikasi ke satu atau lebih database server lain (slave).

Bagian master akan mencatat updates yang nantinya diteruskan ke bagian slave. Lalu nanti slave akan memberikan output berupa pesan yang berisikan bahwa ia sudah berhasil menerima update. Dan biasanya akan dikirim pembaruan berikutnya.

Replikasi master-slave dapat berupa sinkron atau asinkron. Yang membedakan hanyalah pada waktu penyebaran perubahannya. Apabila perubahan dilakukan pada master dan slave di waktu yang sama, maka itu sinkron. Sedangkan jika perubahan dilakukan melalui proses antri (queue) maka itu asinkron.

master-slave database

Penggunaan target untuk replikasi pada database MySQL dan MariaDB diantaranya sebagai berikut :

  • scale-out solutions
  • data security
  • analytics
  • long-distance data distribution

Memanfaatkan Konfigurasi Master-Slave untuk MariaDB/MySQL

Lalu bagaimana cara menggunakan replikasi tersebut dan memanfaatkannya? Berikut penjelasannya.

1. Backup

Untuk membuat replication sebagai solusi backup. Salin data dari master ke slave, kemudian buat cadangan data di slave. Kamu dapat menghentikan atau shutdown slave tanpa mempengaruhi operasi master yang sedang berjalan. Dengan begitu, kamu dapat mendapatkan snapshot data secara live yang biasanya master harus dimatikan terlebih dulu.

2. Scale-out

Kamu dapat menggunakan replication sebagai solusi untuk scale-out. Yang mana kamu ingin membagi load query database ke beberapa database servers asalkan masih dalam batas wajar. Karena replication bekerja mendistribusikan dari satu master ke satu atau beberapa slave. Menggunakan replication untuk scale-out lebih baik dilakukan pada environment yang memiliki jumlah pembaca tinggi dan update yang rendah.

3. Menyebarkan beban

Mungkin kamu pernah mengalami situasi di mana memiliki satu master namun ingin mereplikasi database yang berbeda ke slave berbeda. Misalnya, kamu ingin mendistribusikan data penjualan hanya ke departemen yang dapat membantu menyebarkan load selama analisis data.

4. Meningkatkan performa

Apabila jumlah slave meningkat, maka load juga akan meningkat, karena setiap slave menggunakan koneksi klien ke master. Selain itu setiap slave juga menerima setiap salinan master binary log, oleh karena itu beban jaringan pada master tentu meningkat dan dapat menimbulkan kemacetan.

Apabila kamu menggunakan sebagian besar slave yang terhubung ke satu master dan master tersebut juga sedang memproses permintaan lain, maka kamu perlu meningkatkan kinerja proses replication. Salah satu caranya yaitu membuat struktur replication yang lebih dalam. Sehingga master hanya bisa mereplikasi hanya ke satu slave saja. Untuk sisa slave yang lain terhubung ke primary slave.

5. Mengurangi failover

Kamu dapat mengatur master dan slave, atau beberapa slave dan menuliskan script untuk memantau master sudah aktif atau belum. Lalu berikan instruksi ke aplikasi dan slave kamu apabila terjadi kegagalan pada master.

6. Meningkatkan keamanan

Kamu dapat menggunakan SSL untuk mengenkripsi transfer binary log selama replication. Hanya saja master dan slave harus mendukung koneksi jaringan SSL. Apabila salah satunya tidak mendukung koneksi SSL, maka replication via koneksi SSL tidak bisa dilakukan. Melakukan setting replication menggunakan SSL sama saja dengan menyiapkan server dan klien menggunakan SSL. Kamu harus mendapatkan sertifikat keamanan yang sesuai agar bisa digunakan pada master dan setiap slave.

Nah, sekarang mari kita coba mengkonfigurasi replikasi master-slave pada Dewacloud PaaS.

Kamu bisa mengatur cluster DB nya secara manual dan otomatis seperti yang akan kita jelaskan di bawah nanti.

Instalasi MariaDB/MySQL secara Manual

Apabila kamu ingin mendapatkan lebih banyak slave replicator atau menentukan konfigurasi khusus, maka ikuti langkah instalasi manualnya berikut ini.

Buat Environment

Tips: langkah-langkah di bawah ini sepenuhnya cocok untuk database server MySQL dan MariaDB.

Pertama, kamu perlu membuat dua environment yaitu untuk master dan slave.

  1. Masuk ke dashboard Dewacloud, lalu klik pada pojok kiri atas bagian + Environment.
  2. Pada environment Topology Wizard, pilih database MariaDB (atau MySQL) sesuai yang kamu butuhkan. Lalu tetapkan limit cloudlet, masukan nama environment kamu dan pilih Create.
    buat environment master
  3. Tunggu beberapa saat sampai environment berhasil terbuat.
    masterbase
  4. Selanjutnya buat environment yang sama untuk slave. Atau bisa langsung kamu clone saja. Ini akan ditempatkan pada hardnode lain yang mana lebih aman untuk menyimpan data kamu.
  5. Nah, sekarang kamu memiliki 2 environment dengan dua database.
    masterbase dan slave

Konfigurasi Master Database

Sekarang kita mulai konfigurasi untuk yang master.

  1. Pilih icon Config pada master environment kamu seperti gambar di bawah.
    pilih icon config
  2. Masuk ke file my.cnf dan masukan beberapa kode berikut.
    server-id = 1  
    log-bin = mysql-bin  
    binlog-format = mixed
    

    masukan kode pada my.cnf
    Kita menggunakan format mixed binlog agar replication dapat beroperasi dengan foreign keys.

  3. Pilih Save untuk menyimpan perubahan dan Restart Nodes untuk menerapkan perubahan baru.
    pilih restart nodes
  4. Selanjutnya klik Open in Browser di bagian MariaDB lalu nanti Dewacloud akan mengirim kamu email berupa akses login dan password-nya.
  5. Lalu masuk ke bagian User Accounts dan pilih Add user account.
    pilih add user account di phpmyadmin
  6. Selanjutnya masukan nama dan kata sandi untuk user replication slave-nya.
    buat akun di phpmyadmin

    Lalu scroll ke bawah dan centang pada bagian replication client dan replication slave.
    replication client and slave

    Dan klik Go di bagian bawah halaman.

  7. Jika sudah, masuk ke tab Status untuk memastikan replication tadi sudah terkonfigurasi dengan benar.

    status replication

    Perhatikan value pada bagian file dan position karena nantinya kita akan memerlukan untuk melakukan setup pada slave database.

Konfigurasi Slave Database

Sekarang, kembali lagi pada dashboard Dewacloud dan mulai konfigurasikan slave database milik kamu.

  1. Pilih icon Config pada environment slavebase kamu.
    pilih config pada slavebase
  2. Lalu masuk ke file my.cnf dan tambahkan beberapa kode berikut.
    server-id = 2  
    slave-skip-errors = all
    

    Dengan demikian, kita mengizinkan slave untuk melewatkan semua error yang terjadi dari master (slave-skip-errors) = all. Agar tidak menghentikan operasi slave normal jika terjadi kesalahan pada master.

  3. Selanjutnya buka file /etc/phpMyAdmin/config.inc.php dan tambahkan baris kode berikut.
    $cfg['AllowArbitraryServer'] = true;
    
  4. Klik Save untuk menyimpan perubahannya dan Restart server database slave kamu untuk menerapkan perubahan tersebut.
    restart server database slave
  5. Nah, selanjutnya kita akan mengkonfigurasi server database slave melalui built-in Web SSH client. Dan hubungkan ke database kamu sesuai dengan informasi login yang sudah dikirim melalui email tadi.
    mysql -u root -p
  6. Lalu masukan detail replication masternya.
    CHANGE MASTER TO 
    MASTER_HOST='masterbase.user.cloudjkt01.com',
    MASTER_USER='slave',
    MASTER_PASSWORD=’masukanpasswordkamu’,
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=853;
    

    Jangan lupa untuk mengganti detail tersebut sesuai data milik kamu.

    • MASTER_HOST – URL atau IP replication master kamu.
    • MASTER_USER – nama pengguna replication.
    • MASTER_PASSWORD – kata sandi user replication.
    • MASTER_LOG_FILE – file log master (lihat langkah terakhir di bagian konfigurasi master).
    • MASTER_LOG_POS – posisi log master (lihat langkah terakhir di bagian konfigurasi master).
  7. Nah, sekarang kamu bisa memulai slave nya dengan memasukan perintah berikut.
    start slave;
Tips: untuk memastikan bahwa konfigurasi sudah dilakukan dengan benar, masuk ke database admin slave dan pilih tab Status.
 
status slave database

Cek Hasil Replikasi

Apabila sudah berhasil dikonfigurasi, sekarang saatnya mengecek apakah replication master-slave tersebut dapat bekerja dengan baik untuk database kamu.

  1. Buat database baru lagi di masterbase.
    buat database baru di masterbase
  2. Lalu masuk ke slave database dan cek apakah database baru sudah berhasil terbuat.
    database di slave berhasil terbuat

Koneksi ke Master-Slave

Berikut terdapat 2 contoh koneksi ke master database dan slave database dari aplikasi Java atau PHP kamu.

  1. Di bawah ini contoh kode aplikasi Java kita yang terhubung ke master database dan slave database. Klik tombol di bawah ini untuk melihat contoh code.
    Database_config.cfg:
    
    master_host=jdbc:mysql://mariadb-master-host/mysql
    master_username=root
    master_password=abcABC123
    
    slave_host=jdbc:mysql://mariadb-slave-host/mysql
    slave_username=root
    slave_password=abcABC123
    
    driver=com.mysql.jdbc.Driver
    

    Dbmanager.java:

    package com.dewacloud.test;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Properties;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class DbManager {
    
        private final static String createDatabase = "CREATE SCHEMA IF NOT EXISTS dewacloud";
        private final static String showDatabases = "SHOW DATABASES";
    
        public Connection createMasterConnection() throws IOException, ClassNotFoundException, SQLException {
           Connection masterConnection;
           Properties prop = new Properties();
           prop.load(new FileInputStream(System.getProperty("user.home") + "/database_config.cfg"));
           String master_host = prop.getProperty("master_host").toString();
           String master_username = prop.getProperty("master_username").toString();
           String master_password = prop.getProperty("master_password").toString();
           String driver = prop.getProperty("driver").toString();
    
           Class.forName(driver);
           masterConnection = DriverManager.getConnection(master_host, master_username, master_password);
           return masterConnection;
        }
    
        public Connection createSlaveConnection() throws IOException, ClassNotFoundException, SQLException {
           Connection slaveConnection;
           Properties prop = new Properties();
           prop.load(new FileInputStream(System.getProperty("user.home") + "/database_config.cfg"));
           String slave_host = prop.getProperty("slave_host").toString();
           String slave_username = prop.getProperty("slave_username").toString();
           String slave_password = prop.getProperty("slave_password").toString();
           String driver = prop.getProperty("driver").toString();
    
           Class.forName(driver);
           slaveConnection = DriverManager.getConnection(slave_host, slave_username, slave_password);
           return slaveConnection;
        }
    
        public boolean runSqlStatementOnMaster() {
           boolean execute = false;
           Statement statement = null;
           try {
               statement = createMasterConnection().createStatement();
               execute = statement.execute(createDatabase);
           } catch (IOException ex) {
             Logger.getLogger(DbManager.class.getName()).log(Level.SEVERE, null, ex);
           } catch (ClassNotFoundException ex) {
             Logger.getLogger(DbManager.class.getName()).log(Level.SEVERE, null, ex);
           } catch (SQLException ex) {
               ex.printStackTrace();
           } finally {
               if (statement != null) {
                   try {
                       statement.close();
                   } catch (SQLException e) {
                       e.printStackTrace();
                   }
               }
           }
           return execute;
        }
        
        public List runSqlStatementOnSlave() {
           List stringList = new ArrayList();
           Statement statement = null;
           ResultSet resultSet = null;
           try {
               statement = createSlaveConnection().createStatement();
               resultSet = statement.executeQuery(showDatabases);
               while (resultSet.next()) {
                   stringList.add(resultSet.getString(1));
               }
           } catch (IOException ex) {
             Logger.getLogger(DbManager.class.getName()).log(Level.SEVERE, null, ex);
           } catch (ClassNotFoundException ex) {
             Logger.getLogger(DbManager.class.getName()).log(Level.SEVERE, null, ex);
           } catch (SQLException ex) {
               ex.printStackTrace();
           } finally {
               if (resultSet != null) {
                   try {
                       resultSet.close();
                   } catch (SQLException e) {
                       e.printStackTrace();
                   }
               }
               if (statement != null) {
                   try {
                       statement.close();
                   } catch (SQLException e) {
                       e.printStackTrace();
                   }
               }
           }
           return stringList;
        }
    }
    
    
  2. Berikut kode koneksi ke master database dan slave database di aplikasi PHP.
    <?php
    /* Master settings */
    $master_server = "xx.xxx.x.xx";
    $master_username = "root";
    $master_password = "abcABC123";
    
    /* Slave settings */
    $slave_server = "xx.xxx.x.xx";
    $slave_username = "root";
    $slave_password = "abcABC123";
    
    $link_to_master = mysqli_connect(
    $master_server,
    $master_username,
    $master_password,
    'mysql');
    
    if (!$link_to_master) {
    printf("Unable to connect master database server. Error: %s\n", mysqli_connect_error());
    exit;
    }
    
    $link_to_slave = mysqli_connect(
    $slave_server,
    $slave_username,
    $slave_password,
    'mysql');
    
    if (!$link_to_slave) {
    printf("Unable to connect slave database server. Error: %s\n", mysqli_connect_error());
    exit;
    }
    
    print("
    Creating database with name Dewacloud on Master node ");
    
    $result = mysqli_query($link_to_master, 'CREATE DATABASE DewacloudX);
    
    sleep (3);
    
    print("
    Checking if created database was replciated to slave ");
    
    if ($result = mysqli_query($link_to_slave, 'SHOW DATABASES LIKE "DewacloudX"')) {
    $result_text = mysqli_fetch_array($result);
    print ("
    Replicated database is ".$result_text[0]);
    }
    
    mysqli_close($link_to_master);
    mysqli_close($link_to_slave);
    ?>
    

Kesimpulan

Sampai sini, kamu sudah berhasil memiliki database replication kamu sendiri di cloud. Apabila kamu ingin melakukan hal yang sama seperti di atas, maka segera gunakan Dewacloud PaaS dan buat replication database-mu.