Replikasi Database dan Galera Cluster MariaDB


Database Management System (DBMS) merupakan aplikasi yang digunakan untuk menyimpan dan mengelola basis data. Dengan DBMS, data yang telah disimpan dan disusun dapat digunakan untuk banyak keperluan. Seperti pembuatan aplikasi, website, dan sistem yang membutuhkan tempat untuk menyimpan atau mengambil data. Untuk itu, dibutuhkan DBMS untuk mengelola dan menyediakan tempat untuk menyimpan data tersebut.

MariaDB

MariaDB merupakan tipe Relational Database, dimana data yang disimpan disusun dalam bentuk relasi-relasi tabel. MariaDB merupakan turunan dari MySQL, maka syntax dan bahasa query yang digunakan sama. MariaDB banyak digunakan karena memiliki skalabilitas dengan berbagai sistem operasi dan bahasa pemrograman. MariaDB juga merupakan perangkat lunak database yang bersifat open-source sehingga siapa saja dapat menggunakannya secara gratis.

Replikasi Database (Master-Slave)

Dalam pengembangan aplikasi, website, atau sistem, pastinya memerlukan database yang selalu tersedia. Server database yang digunakan untuk menampung data dimungkinkan terjadi masalah sehingga tidak dapat digunakan. Untuk mengatasi hal tersebut, database dapat di replikasi dengan server yang terpisah. Sehingga, ketika server utama bermasalah, server database cadangan dapat digunakan. Database Replication merupakan mekanisme untuk membuat dua server database memiliki data yang sama dan secara otomatis menyimpan perubahan yang dilakukan pada server utama.

Setelah mengetahui gambaran tentang Database Replication, kita akan belajar bagaimana cara membuatnya. Sebagai contoh, server yang digunakan pada artikel ini yaitu:

  • Server node-1: 10.23.2.72
  • Server node-2: 10.23.2.74

Langkah 1. Instalasi MariaDB

Sebelum melakukan konfigurasi replikasi database, lakukan instalasi MariaDB terlebih dahulu pada kedua server:

apt install mariadb-server mariadb-backup

Instalasi yang dilakukan adalah mariadb-server sebagai DBMS yang akan digunakan dan mariadb-backup yang merupakan program tambahan MariaDB untuk melakukan replikasi database.

Setelah instalasi selesai, periksa status dari layanan MariaDB dengan perintah:

systemctl status mariadb.service

Jika instalasi berhasil, maka akan ada service MariaDB dengan status active (running)

Kemudian, untuk mengamankan aplikasi MariaDB jalankan perintah:

mysql_secure_installation

Setelah dijalankan maka akan ada beberapa pertanyaan yaitu:

  • Memasukkan password user root: masukkan password atau enter jika masih kosong
  • Atur password root: Y atau enter untuk mengatur password dan n untuk melewati
  • Hapus user anonim: Y atau enter untuk menghapus
  • Jangan izinkan login user root melalui remote: Y atau enter untuk tidak mengizinkan
  • Hapus test database dan aksesnya: Y atau enter untuk menghapus

Yang terakhir masukkan Y atau enter untuk menerapkan konfigurasi keamanan MariaDB.

Langkah 2. Konfigurasi Replikasi MariaDB

Setelah selesai melakukan instalasi layanan MariaDB dan program pencadangannya, serta telah selesai melakukan konfigurasi keamanan MariaDB, lakukan konfigurasi replikasi database.

MASTER

Pertama-tama buka file konfigurasi dari mariadb-server pada server master:

vim /etc/mysql/mariadb.conf.d/50-server.cnf

Kemudian uncomment atau hilangkan pagar (#) pada konfigurasi di bawah ini:

bind-address         = 10.23.2.72 #isi dengan ip servernya (master)
server-id            = nomor_server #isikan angka dengan masing-masing server berbeda
log_bin              = /var/log/mysql/mysql-bin.log #untuk mengaktifkan log
expire_logs_days     = 10 # mengatur waktu kadaluarsa log

#contoh:
bind-address         = 10.23.2.72 #ip server master
server-id            = 101 #isikan angka dengan masing-masing server berbeda
log_bin              = /var/log/mysql/mysql-bin.log #untuk mengaktifkan log
expire_logs_days     = 10 # mengatur waktu kadaluarsa log

Setelah selesai mengedit konfigurasi, simpan file kemudian restart layanan MariaDB:

systemctl restart mariadb.service

Setelah itu, masuk ke dalam program MariaDB dengan perintah:

mysql

Kemudian buat user dan izin user untuk melakukan replikasi beserta password-nya:

grant replication slave on *.* to repl_user@'%' identified by '123';

Perintah di atas digunakan untuk membuat user dengan nama “repl_user” dengan akses replikasi semua database dan tabel, serta login dari mana pun dengan password user “123”. Jalankan perintah untuk merefresh izin user kemudian keluar dari program MariaDB:

flush privileges;
exit

SLAVE

Setelah itu, lakukan konfigurasi MariaDB pada server kedua yaitu server slave dengan membuka file konfigurasi:

vim /etc/mysql/mariadb.conf.d/50-server.cnf

ubah konfigurasi seperti di bawah ini:

bind-address         = 10.23.2.74 #isi dengan ip servernya (slave)
server-id            = nomor_server #isikan angka dengan masing-masing server berbeda
log_bin              = /var/log/mysql/mysql-bin.log #untuk mengaktifkan log
expire_logs_days     = 10 # mengatur waktu kadaluarsa log

read_only=1 #untuk membatasi hanya untuk membaca
report-host= ip-server # isi dengan ip servernya (slave)

#contoh:
bind-address         = 10.23.2.74 #isi dengan ip servernya (slave)
server-id            = 101 #isikan angka dengan masing-masing server berbeda
log_bin              = /var/log/mysql/mysql-bin.log #untuk mengaktifkan log
expire_logs_days     = 10 # mengatur waktu kadaluarsa log

read_only=1 #untuk membatasi hanya untuk membaca
report-host= 10.23.2.74 # isi dengan ip servernya (slave)

MASTER

Setelah melakukan konfigurasi MariaDB pada server slave, buat cadangan database pada server master. Pertama-tama buat direktori untuk file-file cadangan MariaDB:

mkdir /home/mariadb_backup

Kemudian jalankan perintah untuk melakukan pencadangan dengan mariabackup:

mariabackup --backup --target-dir /home/mariadb_backup -u root

Setelah proses pencadangan selesai, masuk ke dalam direktori /home yang di dalamnya terdapat direktori cadangan yang telah dibuat sebelumnya:

cd /home 

Kemudian buat direktori cadangan menjadi bentuk file archive (.tar.gz) dengan menjalankan perintah:

tar -czvf mariadb_backup.tar.gz mariadb_backup/

Maka akan ada file archive (.tar.gz):

SLAVE

Setelah cadangan database pada server master telah dibuat, buat kopian file archive pada server master ke dalam server slave dengan scp:

scp amar@10.23.2.72:/home/mariadb_backup.tar.gz /root

Masukkan password user yang digunakan untuk akses dan periksa pada direktori root:

Kemudian, matikan layanan MariaDB terlebih dahulu dan kosongkan direktori cadangan MariaDB server slave yang berada di dalam /var/lib/mysql/:

systemctl stop mariadb.service
rm -rf /var/lib/mysql/*

Kemudian, extract file archive yang telah diambil dari server master:

ll mariadb_backup.tar.gz
tar zxvf mariadb_backup.tar.gz

Kemudian proses file-file cadangan MariaDB server master tersebut sebelum disalin ke dalam MariaDB pada server slave:

mariabackup --prepare --target-dir /root/mariadb_backup

Setelah file sudah diproses, diperiksa, dan ditata, jalankan perintah untuk melakukan duplikasi MariaDB master ke MariaDB slave:

mariabackup --copy-back --target-dir /root/mariadb_backup

Selanjutnya, ubah kepemilikan file-file cadangan yang diduplikasi ke direktori cadangan MariaDB slave:

chown -R mysql. /var/lib/mysql

Setelah selesai, jalankan kembali layanan MariaDB dan periksa statusnya:

systemctl start mariadb.service
systemctl status mariadb.service

Jika tidak ada error, ambil data pada log file yang telah di duplikasi untuk membuat server slave terhubung ke server master dengan perintah:

cat /root/mariadb_backup/xtrabackup_binlog_info

Setelah itu masuk ke dalam program MariaDB:

mysql

Kemudian jalankan perintah untuk mengubah server master yang hendak digunakan:

change master to 
master_host='10.23.2.72', #IP server master    
master_user='repl_user', #user yang dibuat untuk replikasi
master_password='123', #password usernya
master_log_file='mysql-bin.000002', #sesuaikan hasil cat catxtrabackup_binlog_info
master_log_pos=342; #sesuaikan dengan hasil cat xtrabackup_binlog_info

Setelah selesai mengatur server yang hendak digunakan sebagai master, jalankan slave:

start slave;

Pada tahap ini konfigurasi replikasi telah selesai. Periksa apakah slave sudah berjalan dan dapat melakukan replikasi server master dengan perintah:

show slave status\G;

Jika terdapat keterangan “Waiting for master to send event” dan keterangan lainnya sudah sesuai, maka slave sudah berjalan dan dapat melakukan replikasi.

Langkah 3. Pengujian

Setelah berhasil menjalankan slave, lakukan uji coba dengan membuat database pada server master. Gunakan user root MariaDB atau user biasa selain user yang digunakan untuk replikasi. Pertama-tama masuk ke dalam program MariaDB pada server master:

mysql

Kemudian buat database:

create database cobareplikasi;

Setelah itu periksa pada MariaDB server slave:

show databases;

Maka akan ada database yang kita buat pada server master, yaitu database “cobareplikasi”. Setelah bisa menduplikasi seperti di atas, maka konfigurasi replikasi database sudah selesai. Karena konfigurasi yang dilakukan merupakan Database Master-Slave, ketika membuat perubahan seperti membuat database di server slave, maka server master tidak melakukan duplikasi. Karena, duplikasi hanya dilakukan oleh server slave yang mengambil dari server master.

Replikasi Database (Master-Master)

Replikasi database Master-Master merupakan mekanisme yang mirip dengan mekanisme Master-Slave. Namun, perbedaannya yaitu kedua server saling menuliskan perubahan yang dilakukan. Sebagai contoh, ketika membuat database di server 1, maka server 2 akan menyalinnya. Ketika membuat database di server 2, maka server 1 juga akan menyalinnya. Master-Master biasanya digunakan juga sebagai tindakan preventif dalam menyediakan database. Namun berbeda dengan Master-Slave, mekanisme ini lebih fleksibel karena saling mencocokkan satu sama lain. Kita dapat melakukan perubahan dari server manapun.

Setelah mengetahui gambaran tentang Database Replication Master-Master, kita akan belajar bagaimana cara membuatnya. Sebagai contoh, server yang digunakan pada tahap ini yaitu:

  • Server 1: 10.23.2.72
  • Server 2: 10.23.2.74

Langkah 1. Konfigurasi MariaDB

Buka konfigurasi MariaDB pada kedua server:

vim /etc/mysql/mariadb.conf.d/50-server.cnf

Server 1:

Server 2:

Langkah 2. Buat User Khusus Replication

Kemudian, buat user untuk replikasi database pada kedua server:

GRANT REPLICATION SLAVE ON *.* TO 'replica'@'IP-Sever-Lawan' IDENTIFIED BY 'password';

Server 1:

GRANT REPLICATION SLAVE ON *.* TO 'replica'@'10.23.2.74' IDENTIFIED BY '123';

Server 2:

GRANT REPLICATION SLAVE ON *.* TO 'replica'@'10.23.2.72' IDENTIFIED BY '123';

Langkah 3. Hubungkan Kedua Server

Lihat status master sebelum menghubungkan kedua server:

show master status;

Server 1:

Server 2:

Kemudian hubungkan kedua server dengan perintah:

CHANGE MASTER TO
MASTER_HOST='IP-Server-Lawan',
MASTER_USER='replica',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='file_master_status',
MASTER_LOG_POS=position_master_status; 

Server 1:

Server 2:

Kemudian lihat status slave pada kedua server.

Server 1:

Server 2:

Pengujian

Lihat daftar database terlebih dahulu, kemudian buat database dari server 1:

Lihat daftar database pada server 2:

Maka akan ada database yang dibuat dari server 1. Kemudian coba juga untuk membuat database dari server 2:

Lihat daftar database pada server 1:

Maka akan ada database yang dibuat dari server 2.

Galera Cluster (High Availability Database)

Berbeda dengan replikasi database, dengan clustering, database memiliki tingkat ketersediaan yang tinggi. Jika replikasi hanya membuat kopian dari master kemudian disimpan pada server slave, dengan klaster database saling mereplikasi satu sama lain. Dapat dikatakan semua klaster yang ada merupakan master. Ketika melakukan perubahan pada satu server mana pun, perubahan juga disalin pada server lainnya.

Setelah mengetahui tentang clustering, kita akan belajar bagaimana cara membuat clustering menggunakan Galera Cluster. Pada tahap ini, server yang digunakan sebagai contoh menggunakan server sebelumnya:

  • Server node-1: 10.23.2.72
  • Server node-2: 10.23.2.74

Langkah 1. Konfigurasi Node 1

Pertama-tama, konfigurasi node 1 dengan membuka file konfigurasi MariaDB server:

vim /etc/mysql/mariadb.conf.d/50-server.cnf

Comment atau beri tanda pagar (#) pada bind-address:

Tambahkan juga konfigurasi galera seperti di bawah ini:

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0 #akses dibuka untuk berbagai server
# nama klaster, samakan pada semua node
wsrep_cluster_name="MariaDB_Cluster"
# IP Address node ini
wsrep_node_address="10.23.2.72"

Setelah selesai menambahkan konfigurasi, jalankan perintah di bawah ini untuk memulai klaster:

galera_new_cluster

Kemudian muat ulang layanan MariaDB dan lihat statusnya:

systemctl restart mariadb.service
systemctl status mariadb.service

Jika status running, lanjutkan untuk melakukan konfigurasi pada node selanjutnya.

Langkah 2. Konfigurasi Node 2

Pada node yang kedua atau node lainnya jika menggunakan lebih dari dua server, buka file konfigurasi MariaDB:

vim /etc/mysql/mariadb.conf.d/50-server.cnf

Comment atau beri tanda pagar (#) pada bind-address:

Masukkan konfigurasi di bawah ini:

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#ganti ip belakang sesuai dengan servernya:
wsrep_cluster_address="gcomm://10.23.2.72,10.23.2.74"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# nama klaster, samakan pada semua node
wsrep_cluster_name="MariaDB_Cluster"
# IP Address node ini
wsrep_node_address="10.23.2.74"

Setelah selesai menambahkan konfigurasi, muat ulang layanan MariaDB dan lihat statusnya:

systemctl restart mariadb.service
systemctl status mariadb.service

Setelah itu, periksa pada node yang baru saja dikonfigurasi dengan masuk ke dalam program MariaDB, kemudian gunakan perintah di bawah ini:

show status like 'wsrep_%';

Dapat dilihat pada variabel wsrep_local_state_comment, jika value-nya Synced maka node tersebut sudah sinkron dengan server atau node pertama.

Langkah 2. Pengujian

Untuk menguji apakah clustering sudah berfungsi, buatlah database di server pertama:

create database nama_db;
show databases;

Kemudian periksa juga pada node kedua:

Maka akan ada juga database yang telah dibuat pada server satu. Setelah itu coba juga buat database di server kedua:

create database nama_db;
show databases;

Kemudian periksa database pada server pertama:

Maka akan ada database yang sama yang telah dibuat di server kedua.

Recovery Galera Cluster

Ketika seluruh server Galera mati dan sama sekali tidak ada server yang bertahan, maka service MariaDB di seluruh server mengalami error dan tidak dapat berjalan sama sekali. Untuk itu, perlu dilakukan mekanisme recovery atau pemulihan Galera Cluster.

Langkah 1. Hidupkan Seluruh Node

Hidupkan seluruh server yang terdaftar ke dalam cluster yang telah dibuat. Kemudian gunakan user root untuk melakukan recovery.

Langkah 2. Periksa File Recovery

Periksa file status Galera Cluster yang berada di direktori /var/lib/mysql dengan nama file grastat.dat:

cat /var/lib/mysql/grastate.dat

Gunakan perintah tersebut pada semua server untuk memeriksa file tersebut di seluruh server. Kemudian lihat hasilnya pada masing-masing server.

Perbedaan dari kedua server tersebut adalah value yang diberikan pada variabel safe_to_bootstrap. Angka 1 menunjukkan server yang memiliki data terbaru atau server yang mati terakhir. Dengan melihat data tersebut kita dapat melakukan pemulihan cluster dimulai dari server yang memiliki nilai 1 tersebut.

Langkah 3. Recovery Pada Server Terupdate

Untuk melakukan recovery atau pemulihan cluster, buka file konfigurasi MariaDB pada server yang memiliki data terbaru atau mati paling akhir. (safe_to_bootstrap: 1):

cat /var/lib/mysql/grastate.dat
vim /etc/mysql/mariadb.conf.d/50-server.cnf

Setelah terbuka, cari konfigurasi Galera, kemudian ubah value dari wsrep_cluster_address menjadi gcomm:// tanpa IP address dan juga tanpa tanda kutip. Kemudian, jalankan service MariaDB dan periksa status service-nya:

Masuk ke dalam program tersebut:

mysql

Setelah masuk ke dalam program tersebut, periksa status cluster menggunakan perintah:

SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_ready', 'wsrep_cluster_size', 'wsrep_cluster_status', 'wsrep_connected');

Maka akan ditampilkan tabel yang menunjukkan server tersebut menjadi server yang pertama kali hidup dan menjalankan Cluster serta siap untuk terhubung dengan server lainnya.

Langkah 5. Recovery Pada Server Lain

Untuk melakukan recovery atau pemulihan pada server lainnya, buka file konfigurasi MariaDB pada server tersebut. (safe_to_bootstrap: 0):

vim /etc/mysql/mariadb.conf.d/50-server.cnf

Setelah terbuka, cari konfigurasi Galera, kemudian ubah value dari wsrep_cluster_address menjadi “gcomm://IP-Server Terupdate, IP Server tersebut”. Urutannya IP Address milik server terupdate yang telah di recovery pertama kali, kemudian IP server itu sendiri. Setelah dikonfigurasi, jalankan service MariaDB dan periksa status service-nya:

Jika berhasil berjalan, masuk ke program tersebut:

mysql

Kemudian periksa status cluster-nya:

SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_ready', 'wsrep_cluster_size', 'wsrep_cluster_status', 'wsrep_connected');

Sampai tahap ini kedua server sudah berjalan dan saling terhubung dalam cluster. Jika terdapat server lain atau cluster lebih dari dua buah server, konfigurasi pada file:

/etc/mysql/mariadb.conf.d/50-server.cnf

Pada konfigurasi galera, ubah value wsrep_cluster_address menjadi “gcomm://IP-Server Terupdate, IP Server tersebut”. Sebagai contoh di atas, server ketiga memiliki IP 10.23.2.81.

Kesimpulan

Terdapat banyak mekanisme pada Database Management System khususnya MariaDB yang dapat digunakan untuk mencadangkan database, di antaranya adalah replication dan clustering. Dengan replication, kita dapat membuat cadangan database master menggunakan server lain yang disebut slave. Namun, dengan mekanisme ini, perubahan yang terjadi pada server slave tidak akan ditulis di server master. Sehingga harus melakukan segala perubahan pada server master. Dengan clustering, kita dapat membuat cadangan database pada satu server ke semua server lainnya. Perubahan yang terjadi pada salah satu server mana pun ditulis juga pada semua server yang ada. Mekanisme clustering ini dapat digunakan untuk menciptakan ketersediaan database pada sistem yang krusial.

Tertarik mengikuti training di ID-Networkers? Kami menyediakan berbagai pilihan training yang bisa kamu ikuti. Klik disini untuk info lengkapnya.

Penulis : Bazigan Tsamara Sukamto