Clustering 3 Node MariaDB dengan Galera Cluster, Galera Cluster merupakan synchronous multi master untuk MariaDB, Galera hanya tersedia pada Distribusi GNU/Linux saja. dan hanya mendukung XtraDB/InnoDB storage engine, pada saat artikel ini ditulis dukungan untuk MyISAM masih experimental, galera sangat membantu untuk membuat sistem yang high available, dengan menggunakan Galera saya tidak perlu pusing jika ada server database yang mati, server lain akan otomatis menggantikannya dan tidak perlu khawatir akan kehilangan data, data akan tersinkron satu sama lain, dan untuk penambahan node terbilang cukup mudah.
Saya mencoba 3 node MariaDB, dan diatasnya terdapat sebuah LoadBalancer yang nantinya akan mendistribusikan beban ke setiap node, berikut infra yang saya buat
Instalasi MariaDB
Tambahkan repositori mariadb terlebih dahulu
$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 $ sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mariadb.biz.net.id/repo/10.1/ubuntu xenial main'
Pasang MariaDB
$ sudo apt update $ sudo apt install mariadb-server
Konfigurasi Galera
buka berkas my.cnf lalu cari bagian [galera], hilangkan tanda # pada konfigurasi yang akan kita gunakan, dan sesuaikan sesuai yang kita butuhkan, kira-kira seperti dibawah
$ sudo vim /etc/mysql/my.cnf [galera] binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 # Galera Cluster Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera Provider Configuration wsrep_cluster_address=gcomm://192.168.0.1,192.168.0.2,192.168.0.3 wsrep_cluster_name=mycluster # Galera Node Configuration wsrep_node_address=192.168.0.1 wsrep_node_name=node-1 # Galera Synchronization Configuration wsrep_sst_method=rsync # Allow server to accept connections on all interfaces. bind-address=0.0.0.0 # Optional setting #wsrep_slave_threads=1 innodb_flush_log_at_trx_commit=2
untuk setiap nodes tinggal lakukan langkah yang sama, wsrep_cluster_address=gcomm://xxx.xxx.xxx.xxx di isi dengan alamat ip setiap node, wsrep_cluster_name diisi dengan nama cluster, untuk wsrep_cluster_address dan wsrep_cluster_name disamakan untuk setiap node karena berada dalam satu cluster, wsrep_node_address diisi dengan alamt ip node, dan wsrep_node_name di isi dengan nama node
Konfigurasi Firewall
ijinkan semua port yang akan digunakan, berikut list port yang akan kita gunakan meliputi port mariadb dan galera
- 3306 untuk koneksi klien mariadb
- 4567 untuk trafik galera cluster replication, multicast replication menggunakan dua protokol TCP dan UDP
- 4568 untuk Incremental State Transfer
- 4444 untuk semua kondisi transfer snapshot
berikut perintah untuk mengijinkan port diatas dengan ufw
$ sudo ufw allow 3306,4567,4568,4444/tcp $ sudo ufw allow 4567/udp
Menjalankan Cluster
pastikan semua layanan mariadb pada setiap node mati
$ sudo systemctl stop mariadb
Jalankan Node pertama dengan perintah galera_new_cluster
node-1 $ sudo galera_new_cluster
jika tidak terjadi galat, galera telah berhasil dijalankan untuk memastikannya akan kita cek di prompt mariadb
node-1 $ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+ 1 row in set (0.002 sec)
dengan kueri diatas kan menampilkan jumlah node yang berada di cluster, untuk node berikutnya kita hanya perlu menjalankan layanan mariadb seperti biasa
node-2 $ sudo systemctl start mariadb
dan kita cek kembali apakah nodenya bertambah
node-2 $ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+ 1 row in set (0.002 sec)
lakukan juga pada node yang ketiga
node-3 $ sudo systemctl start mariadb node-3 $ mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+ 1 row in set (0.001 sec)
konfigurasi telah selesai, masing-masing node telah terhubung satu sama lain, ketika ada write di salah satu node maka node tersebut akan melakukan commit ke node lain, sehingga data disetiap node akan sama.
sekian, semoga bermanfaat 🙂
kalau mau restart ulang galera cluster nya gimana, seandainya kita mau tambahkan node satu lgi
tidak perlu direstart, di node baru di bagian
cluster_wsrep_address=gcomm://
tinggal tambahkan ip address node baru, dan pada wsrep_node_address dan wsrep_node_name tinggal di sesuaikan, lalu tinggal jalankan mariadb seperti biasa, dan akan otomatis join ke cluster.
systemctl start mariadb
tinggal cek aja apakah cluster sizenya sudah bertambah
show status like "wsrep_cluster_size"
Oke mas,,
tapi saya ada masalah, ada node yg mati, jadi data gak sama dengan server lain,,
1. gimana untuk sinkron ulang nya..
2. jadi saya coba sinkron kn ulang dengan jalankan galera_new_cluster, eh ketika start mariadb, malah gak bisa ,, mlah eror gini
tbosss@tbosss:~$ sudo /etc/init.d/mysql start
[….] Starting mysql (via systemctl): mysql.serviceJob for mysql.service failed because the control process exited with error code.
See “systemctl status mysql.service” and “journalctl -xe” for details.
failed!
3. karna error gitu cluster saya rusak,, jadi buat ulang lagi dengan nama cluster baru pun tetap gak bisa,, akhir nya saya uninsstall lagi maria db nya..
4. bisa gak kalau cluster rusak gak perlu uninstall maria db,, kn sulit kalau db nya udah banyak,, butuh waktu satu harian untuk install baru dan backup.
karna kebetulan di kantor saya db nya udah banyak.
mohon pencerahannya mas
semisal ada salah satu node yang mati, tinggal restart service mariadbnya aja di node yg mati, dia akan otomatis join lagi ke cluster. ga perlu jalanin galera_new_cluster lagi.
semisal pas di restart ga bisa join lagi silahkan cek lognya, bisa diliat pake journalctl
ini kn saya restart mariadb di salah satu node ada error gini mas
https://uploads.disquscdn.com/images/7b7dd3a5b7b719a71a6d8de6816da93826130ea08e06a1a4cee41b9f390fa6fe.png
coba full log errornya paste ke pastebin
udh bsa mas yg kmren,,
saya dapat masalah baru,,
jadi cerita nya saya udh pasang cluster 3 node, saya udh import db dan lakukan testing lain,, smua nya berhasil DB saya ini emng besar,, sql nya aja 1,7 Gb, dan tabel nya ada 345 ,,
jadi ketika 3 node ni udh berjalan normal,, gimana cara nambah kan yg baru mas,, soalnya krna db nya besar dia gak mau up mariadb nya kalau di restart,, timeout error nya..
mgkin ada cara lain untuk add node baru,, di saat db nya udh gede,,
mas.. kalau install cluster tpi file my.cnf nya gak ada yg ada hanya file mariadb.cnf
===isi nya hanya gini ===
# MariaDB-specific config file.
# Read by /etc/mysql/my.cnf
[client]
# Default is Latin1, if you need UTF-8 set this (also in server section)
#default-character-set = utf8
[mysqld]
#
# * Character sets
#
# Default is Latin1, if you need UTF-8 set all this (also in client section)
#
#character-set-server = utf8
#collation-server = utf8_general_ci
#character_set_server = utf8
#collation_server = utf8_general_ci
# Import all .cnf files from configuration directory
!includedir /etc/mysql/mariadb.conf.d/
mantap terima kasih, saya coba implementasi di debian dan centos berhasil juga