MariaDB 10.4 Clustering with Galera on Centos 7

Galera Cluster adalah solusi ketersediaan tinggi cluster database multi-master sinkronis, berdasarkan replikasi sinkron dan MySQL dan InnoDB. Saat Galera Cluster digunakan, pembacaan dan penulisan database dapat diarahkan ke node mana pun. Setiap node dapat down tanpa gangguan dalam operasi dan tanpa menggunakan prosedur failover yang kompleks.

Galera Cluster memberikan peningkatan yang signifikan dalam HA untuk sistem MySQL. Berikut adalah fitur yang tersedia pada Galera Cluster :

  • True MultiMaster, anda dapat melakukan operasi membaca dan menulis di node mana saja. Perubahan data pada satu node akan direplikasi ke node lain.
  • Synchronous Replication, pada galera cluster tidak ada slave lag, jadi tidak ada data yang hilang jika node crash.
  • No Master-Slave Failover, tidak perlu operasi master-slave atau menggunakan VIP (Virtual IP Addres).
  • Hot Standby, Tidak ada downtime yang terkait dengan kegagalan atau dengan sengaja menghapus node untuk maintenance karena tidak ada failover.
  • Automatic Node Provisioning, Tidak perlu mencadangkan database secara manual dan menyalinnya ke node baru.
  • Supports InnoDB.
  • No Read and Write Splitting Needed, Tidak perlu membagi kueri write dan read.

Dalam sistem replikasi multi-master, Anda dapat melakukan update queri ke node database mana pun. Pembaruan ini kemudian menyebar melalui jaringan ke node database lain. Semua node database berfungsi sebagai master.

State Transfers

Ada dua metode yang tersedia di Galera Cluster untuk proses replikasi data, yaitu :

State Snapshot Transfer (SST)

Dalam State Snapshot Transfer (SST), cluster menyediakan node dengan mentransfer salinan data lengkap dari satu node ke node lainnya. Ketika node baru bergabung dengan cluster, node baru memulai State Snapshot Transfer untuk menyinkronkan datanya dengan node yang sudah menjadi bagian dari cluster.

Incremental State Transfer (IST)

Dalam Incremental State Transfer (IST), cluster menyediakan node dengan mengidentifikasi transaksi yang hilang di joiner dan mengirimkannya saja, bukan seluruh status. Metode penyediaan ini hanya tersedia dalam kondisi tertentu :

  • Di mana status node joiner UUID sama dengan grup.
  • Di mana semua write-set yang hilang tersedia di cache set tulis donor.
Write-set Cache (GCache)

Galera Cluster menyimpan write-set dalam cache khusus yang disebut write-set cache, atau biasa disebut GCache. GCache adalah pengalokasi memori untuk write-set. Tujuan utamanya adalah untuk meminimalkan jejak write-set pada RAM. Galera Cluster meningkatkan hal ini melalui penyimpanan write-set offload ke disk.

GCache menggunakan tiga jenis penyimpanan :

  1. Permanent In-Memory Store, di sini write-set mengalokasikan menggunakan pengalokasi memori default untuk sistem operasi. Ini berguna dalam sistem yang memiliki RAM cadangan. Secara default ini dinonaktifkan.
  2. Permanent Ring-Buffer File, di sini write-set mengalokasikan sebelumnya ke disk selama inisialisasi cache. Ini dimaksudkan sebagai penyimpanan write-set utama. Ukuran default penyimpanan ini adalah 128Mb.
  3. On-Demand Page Store, Di sini write-set mengalokasikan ke file halaman yang dipetakan dengan memori selama runtime sesuai kebutuhan. Ukuran default penyimpanan ini adalah 128Mb, tetapi bisa lebih besar jika perlu menyimpan write-set yang lebih besar. Ukuran penyimpanan halaman dibatasi oleh ruang disk kosong. Secara default, Galera Cluster menghapus file halaman saat tidak digunakan, tetapi Anda dapat mengatur batas ukuran total file halaman yang akan disimpan.

Ditutorial ini saya akan memakai SST rsync untuk proses replikasi data antar node.

Prerequisites

Untuk menonaktifkan Selinux, edit file berikut ini.

nano /etc/selinux/config

Ubah Enforcing menjadi disabled, lalu save. Setelah itu restart server anda.

Edit File /etc/hosts pada masing” node. Ubah menjadi ip address dan hostname nodeanda.

10.102.0.13 DB01
10.102.0.14 DB02
10.102.0.15 DB03

Pastikan port-port berikut ini dibuka di masing” node.

  • 3306, Untuk koneksi klien MySQL dan State Snapshot Transfer yang menggunakan metode mysqldump.
  • 4567, Untuk koneksi replikasi Cluster Galera, replikasi multicast menggunakan UDP dan TCP pada port ini.
  • 4568, Untuk koneksi IST.
  • 4444, Untuk koneksi SST.

Jalankan perintah berikut di masing” node untuk mengizinkan port yang dibutuhkan.

firewall-cmd --permanent --zone=public --add-port=3306/tcp
firewall-cmd --permanent --zone=public --add-port=4567/tcp
firewall-cmd --permanent --zone=public --add-port=4568/tcp
firewall-cmd --permanent --zone=public --add-port=4444/tcp
firewall-cmd --permanent --zone=public --add-port=4567/udp
firewall-cmd --reload
firewall-cmd --list-all

Installasi MariaDB

Jalankan perintah berikut untuk menginstal MariaDB 10.4.

nano /etc/yum.repos.d/mariadb.repo

Tambahkan script berikut didalam file repositori.

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Apabila repositori sudah dibuat, jalankan perintah berikut untuk memulai installasi mariadb & rsync.

yum install MariaDB-server MariaDB-client MariaDB-common rsync lsof -y

systemctl enable mariadb
systemctl start mariadb

Amankan instalasi dengan menjalankan perintah berikut.

mysql_secure_installation

MariaDB akan menanyakan kata sandi root, yang tidak Anda miliki karena Anda baru saja menginstal MySQL. Untuk alasan itu, cukup tekan enter.

Berikutnya Ketik Y , untuk mengatur kata sandi root untuk mysql anda.

Selanjutkan akan tampil script seperti ini, Ketik Y pada semua pilihan.

Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Membuat user untuk mengizinkan remote login dan mengakses semua database.

use mysql;
CREATE USER  'root'@'%' IDENTIFIED BY 'inipassword';
GRANT ALL ON *.* to 'root'@'%' IDENTIFIED BY 'inipassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
SELECT User, Host FROM mysql.user WHERE Host <> 'localhost';

Konfigurasi Galera di masing-masing Node

Buat file terpisah khusus konfigurasi galera pada folder /etc/my.cnf.d.

nano /etc/my.cnf.d/galera.cnf

Tambahkan konfigurasi berikut pada node 1.

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
log_error = /var/log/mariadb.log

[galera]
#Konfigurasi Provider Galera
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so

#NAMA GRUP CLUSTER
wsrep_cluster_name="DATABASE_CLUSTER"

#Konfigurasi Kluster Galera
wsrep_cluster_address="gcomm://10.102.0.13,10.102.0.14,10.102.0.15"

#Konfigurasi Sinkronisasi Galera
wsrep_sst_method=rsync

#IP ADDRESS DB01
wsrep_node_address="10.102.0.13"
wsrep_node_name="DB01"

Tambahkan konfigurasi berikut pada node 2.

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
log_error = /var/log/mariadb.log

[galera]
#Konfigurasi Provider Galera
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so

#NAMA GRUP CLUSTER
wsrep_cluster_name="DATABASE_CLUSTER"

#Konfigurasi Kluster Galera
wsrep_cluster_address="gcomm://10.102.0.13,10.102.0.14,10.102.0.15"

#Konfigurasi Sinkronisasi Galera
wsrep_sst_method=rsync

#IP ADDRESS DB02
wsrep_node_address="10.102.0.14"
wsrep_node_name="DB02"

Tambahkan konfigurasi berikut pada node 3.

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
log_error = /var/log/mariadb.log

[galera]
#Konfigurasi Provider Galera
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so

#NAMA GRUP CLUSTER
wsrep_cluster_name="DATABASE_CLUSTER"

#Konfigurasi Kluster Galera
wsrep_cluster_address="gcomm://10.102.0.13,10.102.0.14,10.102.0.15"

#Konfigurasi Sinkronisasi Galera
wsrep_sst_method=rsync

#IP ADDRESS DB03
wsrep_node_address="10.102.0.15"
wsrep_node_name="DB03"

Buat file log pada masing” node untuk menyimpan hasil log dari galera.

touch /var/log/mariadb.log
chown mysql:mysql /var/log/mariadb.log

Stop layanan MariaDB pada masing” node.

systemctl stop mariadb

Jalankan perintah berikut untuk memulai cluster pada salah satu node, dalam hal ini saya menjalankan pada node 1.

sudo galera_new_cluster

Setelah itu nyalakan layanan mariadb pada node 1, dilanjutkan dengan node yang lainnya. Tidak disarankan menyalakan layanan mariadb secara bersamaan.

systemctl start mariadb

Berikutnya periksa cluster size dengan menjalankan perintah sql berikut. Apabila value sudah sesuai dengan jumlah node, maka konfigurasi sudah berhasil.

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Untuk memeriksa status sinkronisasi telah berjalan, jalankan perintah berikut.

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_local_state_comment'"

Testing Replication On The Galera Cluster

Login ke mysql di node 1 menggunakan user anda.

mysql -u root -p

Buat database testing menggunakan perintah berikut.

create database testing_db;
show databases;

Apabila database sudah dibuat, login kembali ke mysql pada node 2. Terlihat database yang sudah dibuat pada node 1 sudah berhasil replikasi ke node2.

show databases;

Menambahkan Node Baru ke Cluster

Untuk menambahkan node baru ke cluster, Anda perlu :

  • Menambahkan Konfigurasi Galera di file galera.cnf pada node baru.
  • Menambahkan IP Address node baru di variabel wsrep_cluster_address pada setiap node.
  • Stop layanan MariaDB di node yang ada di cluster, disarankan untuk stop satu per satu tidak secara bersamaan.
  • Jalankan perintah galera_new_cluster di node master.
  • Start layanan MariaDB di node master, setelah itu di node yang lainnya satu per satu.

Jika salah satu node crash dan akibatnya dikeluarkan dari cluster, Anda hanya perlu mrestart server MariaDB dan node yang rusak akan bergabung kembali dengan cluster. Anda tidak boleh menjalankan perintah galera_new_cluster lagi kecuali cluster dimatikan (Semua node di cluster offline).

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.