Cara menggunakan failover replikasi master-master mysql

Replikasi Master Slave digunakan untuk memecahkan masalah seperti kinerja, mendukung cadangan basis data yang berbeda, dan solusi untuk mengurangi kegagalan sistem. Ini memungkinkan data dari satu server basis data (master) untuk direplikasi ke satu atau lebih server basis data lain (budak).

Bagian master akan merekam update yang nantinya akan diteruskan ke bagian slave. Kemudian nantinya slave akan memberikan output berupa pesan yang berisi bahwa telah berhasil menerima update. Dan biasanya update selanjutnya akan dikirimkan

Replikasi master-slave bisa sinkron atau asinkron. Perbedaannya hanya pada waktu penyebaran perubahan tersebut. Ketika perubahan dilakukan pada master dan slave pada saat yang sama, maka itu sinkron. Sedangkan jika perubahan dilakukan melalui proses antrian maka bersifat asinkron

Cara menggunakan failover replikasi master-master mysql

Penggunaan target untuk replikasi pada database MySQL dan MariaDB adalah sebagai berikut

  • solusi skala-out
  • keamanan data
  • analitik
  • distribusi data jarak jauh

Memanfaatkan Konfigurasi Master-Slave untuk MariaDB/MySQL

Lalu bagaimana cara menggunakan replikasi dan memanfaatkannya?

1. Cadangan

Untuk membuat replikasi sebagai solusi cadangan. Salin data dari master ke slave, lalu cadangkan data di slave. Anda dapat menghentikan atau mematikan slave tanpa memengaruhi pengoperasian master. Dengan begitu, Anda bisa mendapatkan gambaran langsung dari data yang biasanya master harus dimatikan terlebih dahulu

2. Skala-out

Anda dapat menggunakan replikasi sebagai solusi untuk skala-out. Dimana anda ingin membagi beban query database ke beberapa server database selama masih dalam batas wajar. Karena replikasi berfungsi untuk mendistribusikan dari satu master ke satu atau beberapa budak. Menggunakan replikasi untuk peningkatan skala lebih baik dilakukan di lingkungan yang memiliki banyak pembaca dan pembaruan rendah

3. Sebarkan beban

Mungkin Anda pernah mengalami situasi di mana Anda memiliki satu master tetapi ingin mereplikasi database yang berbeda ke budak yang berbeda. Misalnya, Anda ingin mendistribusikan data penjualan hanya ke departemen yang dapat membantu menyebarkan beban selama analisis data

4. Meningkatkan kinerja

Jika jumlah slave bertambah, maka beban juga akan bertambah, karena setiap slave menggunakan koneksi client ke master. Selain itu, setiap slave juga menerima setiap copy log biner master, sehingga beban jaringan pada master bertambah dan dapat menyebabkan kemacetan.

Cara menggunakan failover replikasi master-master mysql

Jika Anda menggunakan sebagian besar budak yang terhubung ke satu master dan master juga memproses permintaan lain, maka Anda perlu meningkatkan kinerja proses replikasi. Salah satu caranya adalah membuat struktur replikasi yang lebih dalam. Sehingga master hanya bisa mereplikasi ke satu slave saja. Untuk sisa budak terhubung ke budak utama

5. Kurangi failover

Anda dapat mengatur master dan slave, atau beberapa slave dan menulis skrip untuk memantau apakah master aktif atau tidak. Kemudian beri instruksi pada aplikasi dan slave Anda ketika terjadi kegagalan pada master

6. Tingkatkan keamanan

Anda dapat menggunakan SSL untuk mengenkripsi transfer log biner selama replikasi. Hanya saja master dan slave harus mendukung koneksi jaringan SSL. Jika salah satunya tidak mendukung koneksi SSL, maka replikasi melalui koneksi SSL tidak dapat dilakukan. Menyiapkan replikasi menggunakan SSL sama dengan menyiapkan server dan klien menggunakan SSL. Anda harus mendapatkan sertifikat keamanan yang sesuai agar dapat digunakan pada master dan setiap budak

Nah, sekarang mari kita coba konfigurasi replikasi master-slave di Dewacloud PaaS

Anda dapat mengatur klaster DB secara manual dan otomatis seperti yang akan kami jelaskan di bawah ini

Instalasi manual MariaDB/MySQL

Jika Anda ingin mendapatkan lebih banyak replikator budak atau menentukan konfigurasi tertentu, ikuti langkah-langkah penginstalan manual di bawah ini

Ciptakan Lingkungan

Kiat. Langkah-langkah di bawah ini sepenuhnya cocok untuk database server MySQL dan MariaDB

Pertama, Anda perlu membuat dua lingkungan untuk master dan slave

  1. Masuk ke dashboard Dewacloud, lalu klik pojok kiri atas bagian + Environment
  2. Di lingkungan Topology Wizard, pilih database MariaDB (atau MySQL) yang Anda butuhkan. Kemudian atur batas cloudlet, masukkan nama lingkungan Anda dan pilih Buat
    Cara menggunakan failover replikasi master-master mysql
  3. Tunggu beberapa detik hingga lingkungan berhasil dibuat
    Cara menggunakan failover replikasi master-master mysql
  4. Selanjutnya, buat lingkungan yang sama untuk budak. Atau Anda bisa mengkloningnya. Ini akan ditempatkan pada hardnode lain yang lebih aman untuk menyimpan data Anda
  5. Nah, sekarang Anda memiliki 2 lingkungan dengan dua database
    Cara menggunakan failover replikasi master-master mysql

Konfigurasi Basis Data Utama

Sekarang kita mulai konfigurasi untuk master

  1. Pilih ikon Config di lingkungan master Anda seperti yang ditunjukkan pada gambar di bawah ini
    Cara menggunakan failover replikasi master-master mysql
  2. Pergi ke file saya. cnf dan masukkan kode berikut.
    server-id = 1  
    log-bin = mysql-bin  
    binlog-format = mixed
    

    Cara menggunakan failover replikasi master-master mysql

    Kami menggunakan format binlog campuran sehingga replikasi dapat beroperasi dengan kunci asing

  3. Pilih Save untuk menyimpan perubahan dan Restart Nodes untuk menerapkan perubahan baru
    Cara menggunakan failover replikasi master-master mysql
  4. Selanjutnya klik Open in Browser pada bagian MariaDB dan nanti Dewacloud akan mengirimkan email berupa akses login dan password
  5. Lalu buka bagian Akun Pengguna dan pilih Tambahkan akun pengguna
    Cara menggunakan failover replikasi master-master mysql
  6. Selanjutnya, masukkan nama dan kata sandi untuk pengguna replikasi budak
    Cara menggunakan failover replikasi master-master mysql

    Kemudian gulir ke bawah dan periksa bagian klien replikasi dan budak replikasi

    Cara menggunakan failover replikasi master-master mysql

    Dan klik Go di bagian bawah halaman

  7. Jika demikian, buka tab Status untuk memastikan replikasi dikonfigurasi dengan benar

    Cara menggunakan failover replikasi master-master mysql

    Perhatikan nilai di bagian file dan posisi karena nanti kita perlu men-setup database slave

Konfigurasi Basis Data Budak

Sekarang, kembali ke dashboard Dewacloud dan mulai konfigurasikan database slave Anda

  1. Pilih ikon Config di lingkungan slavebase Anda
    Cara menggunakan failover replikasi master-master mysql
  2. Lalu pergi ke file saya. cnf dan tambahkan kode berikut.
    server-id = 2  
    slave-skip-errors = all
    
    _

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

  3. Kemudian buka file /etc/phpMyAdmin/config. Inc. php dan tambahkan baris kode berikut.
    $cfg['AllowArbitraryServer'] = true;
    
  4. Klik Simpan untuk menyimpan perubahan dan Restart server database budak Anda untuk menerapkan perubahan
    Cara menggunakan failover replikasi master-master mysql
  5. Nah, selanjutnya kita akan melakukan konfigurasi server database slave melalui built-in Web SSH client. Dan hubungkan ke database Anda sesuai dengan informasi login yang dikirimkan melalui email tadi.
    mysql -u root -p
  6. Kemudian masukkan detail replikasi master.
    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 detailnya sesuai dengan data Anda

    • MASTER_HOST – URL atau IP master replikasi Anda
    • MASTER_USER – nama pengguna replikasi
    • MASTER_PASSWORD – kata sandi replikasi pengguna
    • MASTER_LOG_FILE – file log master (lihat langkah terakhir di bagian konfigurasi master)
    • MASTER_LOG_POS – posisi master log (lihat langkah terakhir di bagian konfigurasi master)
  7. Nah, sekarang Anda bisa memulai slave dengan memasukkan perintah berikut.
    start slave;

Kiat. untuk memastikan konfigurasi sudah dilakukan dengan benar, masuk ke database admin slave dan pilih tab Status
 

Cara menggunakan failover replikasi master-master mysql

Periksa Hasil Replikasi

Setelah berhasil dikonfigurasi, sekarang saatnya untuk memeriksa apakah replikasi master-slave dapat bekerja dengan baik untuk database Anda

  1. Buat database baru lagi di masterbase
    Cara menggunakan failover replikasi master-master mysql
  2. Kemudian masukkan database slave dan periksa apakah database baru telah berhasil dibuat
    Cara menggunakan failover replikasi master-master mysql

Koneksi ke Master-Slave

Berikut adalah 2 contoh koneksi ke database master dan database slave dari aplikasi Java atau PHP Anda

  1. Di bawah ini adalah contoh kode aplikasi Java kami yang terhubung dengan database master dan database slave. Klik tombol di bawah untuk melihat contoh kode.
    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. Jawa

    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 adalah kode koneksi ke database master dan database slave pada 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

Hingga saat ini, Anda telah berhasil memiliki database replikasi Anda sendiri di cloud. Jika Anda ingin melakukan hal yang sama seperti di atas, maka segera gunakan Dewacloud PaaS dan replikasi database Anda