Lewati ke konten utama

MySQL/MariaDB/Percona Database Primary-Secondary Replication

Primary-secondary replication digunakan untuk menyelesaikan berbagai masalah kinerja, mendukung pencadangan berbagai database, dan sebagai bagian dari solusi yang lebih besar untuk mengurangi kegagalan sistem. Ini memungkinkan data dari satu server database (primary , sebelumnya dikenal sebagai “master”) direplikasi ke satu atau lebih server database (secondaries , sebelumnya dikenal sebagai “slaves”). Primary mencatat pembaruan, yang kemudian diteruskan ke secondaries. Secondary mengirimkan pesan yang menyatakan bahwa pembaruan telah diterima dengan sukses, yang memungkinkan pengiriman pembaruan selanjutnya. Replikasi primary-secondary dapat bersifat sinkron atau asinkron. Perbedaannya hanya pada waktu propagasi perubahan. Jika perubahan dibuat pada primary dan secondary secara bersamaan, itu sinkron. Jika perubahan diantrekan dan ditulis nanti, itu asinkron.

database primary-secondary replication

Penggunaan yang disarankan untuk replikasi di database MySQL/MariaDB/Percona meliputi:

  • Solusi scale-out
  • Keamanan data
  • Analitik
  • Distribusi data jarak jauh

Bagaimana Anda dapat menggunakan replikasi ini dan mengambil manfaat darinya:

  • Backups: untuk menggunakan replikasi sebagai solusi pencadangan, replikasi data dari master ke slave, lalu cadangkan data di slave. Slave dapat dijeda dan dimatikan tanpa mempengaruhi operasi master yang sedang berjalan, sehingga Anda dapat menghasilkan snapshot data “langsung” yang efektif yang sebaliknya memerlukan penghentian master.
  • Scale-out: Anda dapat menggunakan replikasi sebagai solusi scale-out; yaitu, di mana Anda ingin membagi beban query database di beberapa server database, dalam beberapa batasan yang masuk akal. Karena replikasi bekerja dari distribusi satu master ke satu atau lebih slaves, menggunakan replikasi untuk scale-out bekerja paling baik di lingkungan dengan jumlah bacaan yang tinggi dan jumlah tulis/pembaruan yang rendah.
  • Menyebarkan beban: mungkin ada situasi ketika Anda memiliki satu master dan ingin mereplikasi database yang berbeda ke slave yang berbeda. Misalnya, Anda mungkin ingin mendistribusikan data penjualan hanya ke departemen yang diperlukan untuk membantu menyebarkan beban selama analisis data.
  • Meningkatkan kinerja: seiring bertambahnya jumlah slave yang terhubung ke master, beban, meskipun minimal, juga meningkat, karena setiap slave menggunakan koneksi klien ke master. Karena setiap slave harus menerima salinan penuh dari log biner master, beban jaringan pada master juga dapat meningkat dan menciptakan bottleneck. Jika Anda menggunakan banyak slaves yang terhubung ke satu master, dan master tersebut juga sibuk memproses permintaan (misalnya, sebagai bagian dari solusi scale-out), maka Anda mungkin ingin meningkatkan kinerja proses replikasi. Salah satu cara untuk meningkatkan kinerja proses replikasi adalah dengan membuat struktur replikasi yang lebih dalam yang memungkinkan master hanya mereplikasi ke satu slave, dan slaves yang tersisa terhubung ke slave utama ini untuk kebutuhan replikasi mereka.
  • Mengurangi kegagalan: Anda dapat mengatur master dan slave (atau beberapa slaves) dan menulis skrip yang memantau master untuk memeriksa apakah itu aktif. Kemudian instruksikan aplikasi dan slaves Anda untuk mengubah master jika terjadi kegagalan.
  • Keamanan: Anda dapat menggunakan SSL untuk mengenkripsi transfer log biner yang diperlukan selama replikasi, tetapi baik master maupun slave harus mendukung koneksi jaringan SSL. Jika salah satu host tidak mendukung koneksi SSL, replikasi melalui koneksi SSL tidak mungkin dilakukan. Pengaturan replikasi menggunakan koneksi SSL mirip dengan pengaturan server dan klien menggunakan SSL. Anda harus mendapatkan (atau membuat) sertifikat keamanan yang sesuai yang dapat Anda gunakan di master dan sertifikat serupa (dari otoritas sertifikat yang sama) di setiap slave.

Sekarang, mari kita periksa contoh sederhana tentang cara mengonfigurasi replikasi master-slave di platform.

Manual Installation

Jika Anda lebih suka mengonfigurasi replikasi Master-Slave secara manual untuk mendapatkan lebih banyak slave replicators atau menentukan beberapa konfigurasi khusus, silakan ikuti instruksi di bawah ini.

Create Environments

tip

Instruksi di bawah ini sepenuhnya cocok untuk server database MySQL dan MariaDB.

Pertama-tama, kita membuat dua environment untuk database master dan slave kita.

1. Masuk ke dashboard platform dan klik tombol New Environment.

create new environment button

2. Di wizard Environment Topology, pilih MariaDB (atau MySQL) sebagai database yang ingin Anda gunakan. Tetapkan batas cloudlet dan ketik nama environment pertama Anda, misalnya masterbase.

environment topology wizard

Tunggu sebentar untuk environment Anda dibuat.

master database created

3. Dengan cara yang sama, buat satu environment lagi dengan MariaDB atau cukup klon itu. Mari beri nama slavebase. Ini akan ditempatkan di hardnode lain, yang bahkan lebih aman dan andal untuk menyimpan data Anda.

Sekarang Anda memiliki dua environment identik dengan dua database.

slave database created

Configure Primary Database

Sekarang mari kita konfigurasi basis master.

1. Klik tombol Config untuk database master Anda.

master DB config button

2. Arahkan ke file my.cnf dan tambahkan properti berikut seperti yang ditunjukkan di bawah ini:

server-id = 1
log-bin = mysql-bin
binlog-format = mixed
master DB my.cnf config

Kami menggunakan format binlog “mixed” (binlog-format = mixed) untuk memungkinkan replikasi operasi dengan foreign key.

catatan

Jangan gunakan format binlog “statement”. Jika tidak, Anda akan mendapatkan kesalahan di kemudian hari!

3. Simpan perubahan dan Restart MariaDB untuk menerapkan parameter konfigurasi baru.

master DB restart node

4. Klik tombol Open in Browser untuk MariaDB. Platform telah mengirimkan email kepada Anda dengan kredensial ke database. Masuk menggunakan kredensial ini.

5. Arahkan ke tab User accounts dan klik Add user account.

master DB add user

6. Tentukan nama dan kata sandi untuk pengguna replikasi slave Anda.

database user credentials

Sekarang, gulir ke bawah dan centang hak administratif replication client dan replication slave.

database user privileges

Klik Go di bagian bawah halaman.

7. Beralih ke tab Status untuk memastikan bahwa replikasi dikonfigurasi dengan benar.

master DB status

Perhatikan nilai log File dan Position, karena ini akan diperlukan nanti untuk mengatur database slave.

Configure Secondary Database

Mari kembali ke dashboard platform dan konfigurasikan database slave kita.

1. Klik tombol Config untuk environment slavebase Anda.

slave DB config button

2. Arahkan ke file my.cnf dan tambahkan string berikut:

server-id = 2
slave-skip-errors = all
slave DB my.cnf config

Kami mengizinkan slave base kami untuk melewati semua kesalahan dari master (slave-skip-errors = all) agar tidak menghentikan operasi slave normal jika terjadi kesalahan pada master base.

catatan

Pengabaian ini tidak disarankan untuk digunakan selama tahap pengembangan karena membantu menemukan dan memecahkan bug. Namun, di lingkungan produksi (saat kode Anda sudah diuji), ini membantu menghindari desinkronisasi akibat beberapa masalah kecil di node master.

3. Selanjutnya, buka file /etc/phpMyAdmin/config.inc.php dan tambahkan opsi berikut:

$cfg['AllowArbitraryServer'] = true;
slave DB arbitrary server option

4. Simpan perubahan dan Restart server database slave Anda untuk menerapkan parameter konfigurasi baru.

slave DB restart node

5. Mari kita konfigurasikan server database slave kita melalui Web SSH bawaan. Hubungkan ke database Anda menggunakan kredensial dari email yang diterima setelah pembuatan node.

mysql -u root -p
MySQL access via Web SSH

6. Berikan detail master replikasi.

CHANGE MASTER

TO MASTER_HOST='node275500-masterbase.jelastic.com', MASTER_USER='slave', MASTER_PASSWORD='passw0rd', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=853;

Jangan lupa untuk mengganti nilai opsi dalam contoh di atas dengan data yang benar:

  • MASTER_HOST - URL atau IP dari master replikasi
  • MASTER_USER - pengguna replikasi
  • MASTER_PASSWORD - kata sandi pengguna replikasi
  • MASTER_LOG_FILE - file log master (lihat langkah terakhir dari bagian konfigurasi master)
  • MASTER_LOG_POS - posisi log master (lihat langkah terakhir dari bagian konfigurasi master)
SSH set replication master

7. Sekarang, Anda dapat memulai slave replikasi dengan perintah yang sesuai:

start slave;
SSH start replication slave
tip

Jika Anda ingin memastikan bahwa semuanya dikonfigurasi dengan benar, masuklah ke admin database slave dan buka tab Status.

database status tab

Check Results

Sekarang kita harus memastikan bahwa replikasi master-slave berfungsi untuk database kita.

1. Mari buat database baru (misalnya jelastic) di master base kita.

master DB create database

2. Arahkan ke slave base, dan Anda akan melihat bahwa database baru berhasil direplikasi.

slave DB replicated database

Connection to Primary-Secondary

Berikut adalah dua contoh menghubungkan ke database master dan slave dari aplikasi Java dan PHP Anda.

1. Sebagai contoh, Anda dapat melihat kode aplikasi Java kami, yang terhubung ke database master dan slave.

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.jelastic.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 jelastic";
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<String> runSqlStatementOnSlave() {
List<String> stringList = new ArrayList<String>();
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. Koneksi ke database master dan slave untuk aplikasi PHP Anda:

<?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 Jelastic on Master node ");
$result = mysqli_query($link_to_master, 'CREATE DATABASE JelasticX');
sleep (3);

print(" Checking if created database was replicated to slave ");
if ($result = mysqli_query($link_to_slave, 'SHOW DATABASES LIKE "JelasticX"')) {
$result_text = mysqli_fetch_array($result);
print (" Replicated database is ".$result_text[0]);
}

mysqli_close($link_to_master);
mysqli_close($link_to_slave);

?>

Sekarang, Anda memiliki replikasi database sendiri di cloud. Nikmati!

Baca Juga