Membangun cluster MariaDB/MySQL kita bisa menggunakan Galera, Galera sudah termasuk dalam paket instalasi MariaDB di Ubuntu 20.04 jadi tidak perlu menginstall paket tambahan. Beberapa fitur Galera cluster
– True Multi-master, Active-Active Cluster Read and write to any node at any time.
– Synchronous Replication No slave lag, no data is lost at node crash.
– Tightly Coupled All nodes hold the same state. No diverged data between nodes allowed.
– Multi-threaded Slave For better performance. For any workload.
– No Master-Slave Failover Operations or Use of VIP.
– Hot Standby No downtime during failover (since there is no failover).
– Automatic Node Provisioning No need to manually back up the database and copy it to the new node.
– Supports InnoDB.
– Transparent to Applications Required no (or minimal changes) to the application.
– No Read and Write Splitting Needed.
– Easy to Use and Deploy
Server yang akan digunakan
192.168.148.11 DB-HAPROXY 192.168.163.201 DB-CLUSTER-1 192.168.164.27 DB-CLUSTER-2 192.168.148.92 DB-CLUSTER-3
Update System
Update system anda ke update paling baru yang tersedia, jalankan di semua server
apt update; apt upgrade -y
Setting Hostname Server
Agar masing-masing server mudah dikenali, setting hostname masing-masing server
# server HaProxy hostnamectl set-hostname --static DB-HAPROXY # server 1 hostnamectl set-hostname --static DB-CLUSTER-1 # server 2 hostnamectl set-hostname --static DB-CLUSTER-2 # server 3 hostnamectl set-hostname --static DB-CLUSTER-3
di semua jalankan perintah ini untuk menambah mapping IP tersebut ke hostname
echo '192.168.148.11 DB-HAPROXY 192.168.163.201 DB-CLUSTER-1 192.168.164.27 DB-CLUSTER-2 192.168.148.92 DB-CLUSTER-3' >> /etc/hosts
matikan services apparmor
systemctl stop apparmor systemctl disable apparmor
ubah file permission /tmp
agar bisa ditulis oleh MariaDB.
chmod 777 /tmp
Install MariaDB Server
Di ketiga server tersebut jalankan perintah berikut ini untuk menginstall MySQL/MariaDB 10.3
apt install mariadb-server -y
di Ubuntu services MariaDB otomatis dijalankan, karena kita masih butuh untuk konfigurasinya, matikan service nya terlebih dahulu
systemctl stop mariadb
Untuk konfigurasi cluster berikut ini sesuaikan IP address dengan IP Server database yang anda miliki.
Server Database 1 : DB-CLUSTER-1
Konfigurasi Galera cluster akan disimpan di /etc/mysql/mariadb.conf.d/50-galera.cnf
, buat file tersebut lalu isi dengan
[mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=192.168.163.201 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="dbcluster" wsrep_cluster_address="gcomm://192.168.163.201,192.168.164.27,192.168.148.92" wsrep_sst_method=rsync wsrep_node_address="192.168.163.201" wsrep_node_name="DB-CLUSTER-1"
untuk binding IP address kita setting di 50-galera.cnf
, jadi bind di 50-server.cnf
dinonaktifkan
sed -i 's/bind-address/#bind-address/g' /etc/mysql/mariadb.conf.d/50-server.cnf
Cluster database ini akan dijalankan dari DB-CLUSTER-1 dengan perintah galera_new_cluster
. Setelah menjalankan perintah tersebut cek status cluster anda.
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
outputnya
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+
karena kita baru menjalankan 1 server cluster, jadi hanya muncul 1 di ukuran clusternya.
Buat user haproxy
, user ini nanti dibuat untuk mengecek status database.
CREATE USER 'haproxy'@'192.168.148.11';
ganti 192.168.148.11
dengan IP HaProxy.
Server Database 2 : DB-CLUSTER-2
Konfigurasi Galera cluster akan disimpan di /etc/mysql/mariadb.conf.d/50-galera.cnf
, buat file tersebut lalu isi dengan
[mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=192.168.164.27 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="dbcluster" wsrep_cluster_address="gcomm://192.168.163.201,192.168.164.27,192.168.148.92" wsrep_sst_method=rsync wsrep_node_address="192.168.164.27" wsrep_node_name="DB-CLUSTER-2"
untuk binding IP address kita setting di 50-galera.cnf
, jadi bind di 50-server.cnf
dinonaktifkan
sed -i 's/bind-address/#bind-address/g' /etc/mysql/mariadb.conf.d/50-server.cnf
Jalankan services mariadb
systemctl start mariadb
Setelah menjalankan perintah tersebut cek status cluster anda.
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
outputnya
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
sekarang sudah keliatan ukuran cluster menjadi 2.
Server Database 3 : DB-CLUSTER-3
Konfigurasi Galera cluster akan disimpan di /etc/mysql/mariadb.conf.d/50-galera.cnf
, buat file tersebut lalu isi dengan
[mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=192.168.148.92 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="dbcluster" wsrep_cluster_address="gcomm://192.168.163.201,192.168.164.27,192.168.148.92" wsrep_sst_method=rsync wsrep_node_address="192.168.148.92" wsrep_node_name="DB-CLUSTER-3"
untuk binding IP address kita setting di 50-galera.cnf
, jadi bind di 50-server.cnf
dinonaktifkan
sed -i 's/bind-address/#bind-address/g' /etc/mysql/mariadb.conf.d/50-server.cnf
Jalankan services mariadb
systemctl start mariadb
Setelah menjalankan perintah tersebut cek status cluster anda.
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
outputnya
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+
ukuran cluster sudah menjadi 3, sesuai dengan jumlah server yang kita alokasikan.
Testing Query Cluster
Untuk mengecek apakah cluster kita sudah bisa saling sinkronisasi data, buat database baru untuk testing. Login ke mysql/mariadb di CLUSTER-DB-1
mysql
lalu eksekusi query dibawah ini
CREATE DATABASE dbpesan; CREATE TABLE dbpesan.pesan_singkat ( `id` INT NOT NULL AUTO_INCREMENT , `pesan` TEXT NOT NULL , PRIMARY KEY (`id`)); INSERT INTO dbpesan.pesan_singkat (`id`, `pesan`) VALUES (1, 'pesan pertama'); INSERT INTO dbpesan.pesan_singkat (`id`, `pesan`) VALUES (2, 'pesan kedua'); INSERT INTO dbpesan.pesan_singkat (`id`, `pesan`) VALUES (3, 'pesan ketiga');
dari ketiga server cek user hasil querynya
SELECT * FROM dbpesan.pesan_singkat;
keluaran query diatas
+----+---------------+ | id | pesan | +----+---------------+ | 1 | pesan pertama | | 2 | pesan kedua | | 3 | pesan ketiga | +----+---------------+ 3 rows in set (0.001 sec)
HaProxy Galera Cluster
Sampai disini kita belum bisa membagi rata akses ke cluster database yang telah kita buat, untuk itu kita akan menggunakan HaProxy sebagai load balancer
Install HaProxy
apt install haproxy -y
Di konfigurasi HaProxy /etc/haproxy/haproxy.cfg
tambahkan dibagian paling bawah
# statistik listen stats bind :8080 mode http stats enable stats hide-version stats realm Haproxy\ Statistics stats uri / stats auth jaranguda:WRmfp7Csprzq4NMLJbJsrhxLjPcmtX listen galera_cluster bind 192.168.148.11:3306 balance source mode tcp option tcpka option mysql-check user haproxy option tcplog server DB-CLUSTER-1 DB-CLUSTER-1:3306 check weight 1 server DB-CLUSTER-2 DB-CLUSTER-2:3306 check weight 1 server DB-CLUSTER-3 DB-CLUSTER-3:3306 check weight 1
listen stats tersebut untuk melihat status Haproxy.
192.168.148.11
ganti dengan IP HaProxy.
aktifkan haproxy waktu booting
systemctl enable haproxy
jalankan service haproxy
systemctl restart haproxy
bila anda membuat user baru di cluster mariadb tambahkan IP HaProxy untuk hostnamenya, contoh
CREATE DATABASE wordpress GRANT ALL PRIVILEGES ON userwp.* TO "wordpress"@"192.168.148.11" IDENTIFIED BY "pxwLzqdLrFKTphzpH7";
jadi nanti aplikasi akan mengakses database lewat Haproxy.
saya mempunyai beberapa masalah dalam konfgurasinya, apakah saya bisa menghubungi anda langsung ? saya dalam pross pengerjaan Tugas Akhir