Cara Membuat Cluster Database MySQL (Database Terdistribusi)

MySQL Cluster merupakan database terdistribusi untuk kondisi database dengan trafic yang tinggi. MySQL Cluster bekerja dengan melakukan sinkronisasi data antar server bukan replikasi data (replikasi berbeda dengan cluster). Cluster MySQL terdiri dari satu server manajemen (ndb_mgmd) yang menyimpan konfigurasi cluster dan mengontrol satu atau lebih node db server (ndbd).

MySQL Cluster dapat bekerja dengan banyak node sesuai dengan beban database, namun untuk ujicoba pada kesempatan ini hanya digunakan 2 server, 1 server sebagai manajer dan 1 server lain sebagai node server.

Persiapan

Untuk mengikuti tutorial ini, pastikan memiliki minimal 2 server (boleh lebih) baik fisik, vps atau dalam bentuk virtual machine. Pastikan sistem operasi yang digunakan merupakan sistem operasi Ubuntuk versi 18.04 keatas, versi 20.04 yang direkomendasikan.

Catat IP dari masing-masing server yang digunakan, pada kasus ini, IP yang digunakan:

  • 192.168.1.12 sebagai Cluster Manager / server utama
  • 192.168.1.13 sebagai Node Server

* IP anda bisa saja berbeda, silahkan disesuaikan

Langkah 1 – Install dan Konfigurasi Cluster Manager / Server Utama

Langkah awal yang perlu kita lakukan adalah menginstall MySQL Cluster Manager (ndb_mgmd), paket ini bisa di download melalui laman download resmi MySQL: https://downloads.mysql.com/archives/cluster/

Pada laman awal, anda akan diminta memilih versi MySQL Cluster Manager, pada saat tutorial ini dibuat versinya adalah 8.0.26, biarkan deafault saja. Kemudian pilih OS server yang digunakan, pilih Ubuntu Linux seperti gambar dibawah:

Kemudian croll, cari paket DEB Pacakage NDB Management Server sesuai dengan versi Ubuntu yang digunakan:

Setelah ketemu, catat lokasi downloadnya.

Sekarang, silahkan login pada server utama (tutorial ini: 192.168.1.12) dan download file .deb tersebut:

$ cd ~
$ wget https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-community-management-server_8.0.26-1ubuntu20.04_amd64.deb

Install ndb_mgmd menggunakan dpkg:

$ sudo dpkg -i mysql-cluster-community-management-server_8.0.26-1ubuntu20.04_amd64.deb

Selanjutnya, kita harus mengkofigurasi dan memberitahukan mysql-cluster bahwa server utama harus menjadi server pertama yang menjalankan MySQL Cluster. Untuk melakukan hal tersebut, kita dapat membuat configurasi cluster dengan cara:

Buat folder mysql-cluster pada /var/lib:

$ sudo mkdir /var/lib/mysql-cluster

Buat file config.ini pada folder yang baru dibuat:

$ sudo nano /var/lib/mysql-cluster/config.ini

Pastekan text berikut pada file config.ini:

[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=1  # Number of replicas

[ndb_mgmd]
# Management process options:
hostname=192.168.1.12 # Hostname of the manager
datadir=/var/lib/mysql-cluster  # Directory for the log files

[ndbd]
hostname=192.168.1.13 # Hostname/IP of the first data node
NodeId=2            # Node ID for this data node
datadir=/usr/local/mysql/data   # Remote directory for the data files

[mysqld]
# SQL node options:
hostname=192.168.1.12 # In our case the MySQL server/client is on the same Droplet as the cluster manager

Setelah melakukan paste, pastikan untuk mengubah hostname IP sesuai dengan IP server yang digunakan. Save dan keluar dari editor.

Selanjutnya, jalankan server manager dengan mengeksekusi ndb_mgmd dan memberitahukan file (-f) lokasi dari konfigurasi cluster:

$ sudo ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Seharu kita melihat output seperti ini:

MySQL Cluster Management Server 
2021-12-10 21:48:39 [MgmtSrvr] INFO     -- The default config directory '/usr/mysql-cluster' does not exist. Trying to create it...
2021-12-10 21:48:39 [MgmtSrvr] INFO     -- Successfully created config directory

Ini menunjukkan bahwa server MySQL Cluster Management telah berhasil diinstal.

Selanjutnya, agar server Manajemen Cluster berjalan secara otomatis saat boot, kita harus membuat dan mengaktifkan layanan systemd.

Sebelum kita membuat layanan, kita perlu mematikan server yang sedang berjalan:

$ sudo pkill -f ndb_mgmd

Sekarang, buka dan edit file Unit systemd :

$ sudo nano /etc/systemd/system/ndb_mgmd.service

Pastekan code berikut:

[Unit]
Description=MySQL NDB Cluster Management Server
After=network.target auditd.service

[Service]
Type=forking
ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

Di sini, kita telah menginstruksikan systemd tentang cara memulai, menghentikan, dan memulai kembali proses ndb_mgmd. Simpan dan tutup file.

Sekarang, muat ulang konfigurasi manajer systemd menggunakan daemon-reload:

$ sudo systemctl daemon-reload

Enable ndb_mgmd kembali:

$ sudo systemctl enable ndb_mgmd

Jalankan service ndb_mgmd:

$ sudo systemctl start ndb_mgmd

Verifikasi apakan NDB Cluster Management service sudah berjalan:

$ sudo systemctl status ndb_mgmd

Harusnya ada output seperti dibawah:

● ndb_mgmd.service - MySQL NDB Cluster Management Server
   Loaded: loaded (/etc/systemd/system/ndb_mgmd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-12-10 21:23:37 UTC; 3s ago
  Process: 11184 ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini (code=exited, status=0/SUCCESS)
 Main PID: 11193 (ndb_mgmd)
    Tasks: 11 (limit: 4915)
   CGroup: /system.slice/ndb_mgmd.service
           └─11193 /usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Langkah terakhir untuk menyiapkan Cluster Manager adalah mengizinkan koneksi masuk dari node MySQL Cluster lain. Tambahkan aturan untuk mengizinkan koneksi masuk dari node server (192.168.1.13):

$ sudo ufw allow from 192.168.1.13

Langkah 2 – Install dan Konfigurasi Node Server

Pada server node, kita akan menginstall MySQL Cluster data node daemon dan mengkonfigurasi agar dapat berkomunikasi dengan Cluster Manager.

Lihat file MySQL Cluster data node daemon pada: https://downloads.mysql.com/archives/cluster/

Cari versi ubuntu yang digunkan dan file DEB Package NDB Data Node Binaries:

Setelah ketemu, copy link download .deb tersebut.

Login pada server node (pada tutorial ini: 192.168.1.13) dan download file Data Node Binaries:

$ cd ~
$ wget https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster-community-data-node_8.0.26-1ubuntu20.04_amd64.deb

Sebelum kita menginstal Data Node Binaries, kita perlu menginstal dependensi, libclass-methodmaker-perl:

$ sudo apt update
$ sudo apt install libclass-methodmaker-perl

Install Data Node Binaries menggunakan dpkg:

$ sudo dpkg -i mysql-cluster-community-data-node_8.0.26-1ubuntu20.04_amd64.deb

Buat file konfigurasi untuk server node:

$ sudo nano /etc/my.cnf

Tambahkan teks berikut kedalam konfigurasi my.cnf:

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=192.168.1.12  # location of cluster manager

Pastikan untuk menyesuaikan IP dari server manager. Kemudian save.

Buat data directory pada /usr/local/mysql/data:

$ sudo mkdir -p /usr/local/mysql/data

Sekarang kita dapat menjalankan node server menggunakan perintah berikut:

$ sudo ndbd

Seharusnya ada output seperti dibawah ini:

2021-12-10 19:48:21 [ndbd] INFO     -- Angel connected to '192.168.1.12:1186'
2021-12-10 19:48:21 [ndbd] INFO     -- Angel allocated nodeid: 1

NDB data node daemon telah berhasil di install dan berjalan di server.

Selanjutnya berikan akses untuk server manager:

$ sudo ufw allow from 192.168.1.12

Berikutnya kita akan menambahkan data node daemon agar server node dapat menjalankan MySQL Cluster saat setelah reboot, prosesnya sama dengan server manager.

Matikan ndbd service terlebih dahulu:

$ sudo pkill -f ndbd

Sekarang, buka dan edit file Unit systemd:

$ sudo nano /etc/systemd/system/ndbd.service

Pastekan kode berikut:

[Unit]
Description=MySQL NDB Data Node Daemon
After=network.target auditd.service

[Service]
Type=forking
ExecStart=/usr/sbin/ndbd
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

Save dan keluar dari editor.

Reload kembali systemd manager dengan daemon-reload:

$ sudo systemctl daemon-reload

Mengaktifkan layanan yang baru saja dibuat sehingga daemon dapat dimulai saat reboot:

$ sudo systemctl enable ndbd

Jalankan service ndbd:

$ sudo systemctl start ndbd

Verifikasi bahwa Cluster server sudah jalan:

$ sudo systemctl status ndbd

Harusnya ada output seperti dibawah:

● ndbd.service - MySQL NDB Data Node Daemon
   Loaded: loaded (/etc/systemd/system/ndbd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-12-10 20:56:29 UTC; 8s ago
  Process: 11972 ExecStart=/usr/sbin/ndbd (code=exited, status=0/SUCCESS)
 Main PID: 11984 (ndbd)
    Tasks: 46 (limit: 4915)
   CGroup: /system.slice/ndbd.service
           ├─11984 /usr/sbin/ndbd
           └─11987 /usr/sbin/ndbd

* Jika server node lebih dari 1, silahkan ulangi langkah 2 diatas pada server node lainnya.

Langkah 3 – Konfigurasi dan Menjalankan MySQL Cluster

Pada dasarnya, MySQL Server standar yang ada di repository Ubuntu belum mendukung Clustering database. Oleh karena itu kita perlu menginstall custom paket SQL server. Paket tersebut bisa didownload di: https://downloads.mysql.com/archives/cluster/

Pada laman tersebut cari DEB Bundle yang sesuai dengan versi Ubuntu yang digunakan, copy link donwloadnya:

Login pada server manager (pada tutorial ini: 192.168.1.12) kemudian download deb-bundle:

$ cd ~
$ wget https://downloads.mysql.com/archives/get/p/14/file/mysql-cluster_8.0.26-1ubuntu20.04_amd64.deb-bundle.tar

Buat folder dengan nama ‘install’:

$ mkdir install

Extract deb-bundle kedalam folder ‘install’:

$ tar -xvf mysql-cluster_8.0.26-1ubuntu20.04_amd64.deb-bundle.tar -C install/

Masuk ke dalam folder ‘install’:

$ cd install

Install dependensi MySQL Cluster:

$ sudo apt update
$ sudo apt install libaio1 libmecab2

Install dependensi tambahan yang ada pada folder ‘install’:

$ sudo dpkg -i mysql-common_8.0.26-1ubuntu20.04_amd64.deb
$ sudo dpkg -i mysql-cluster-community-client-pluggin_8.0.26-1ubuntu20.04_amd64.deb
$ sudo dpkg -i mysql-cluster-community-client-core_8.0.26-1ubuntu20.04_amd64.deb
$ sudo dpkg -i mysql-cluster-community-client_8.0.26-1ubuntu20.04_amd64.deb
$ sudo dpkg -i mysql-client_8.0.26-1ubuntu20.04_amd64.deb
$ sudo dpkg -i mysql-cluster-community-server-core_8.0.26-1ubuntu20.04_amd64.deb
$ sudo dpkg -i mysql-cluster-community-server_8.0.26-1ubuntu20.04_amd64.deb

Saat menginstall mysql-cluster-community-server, kita akan di minta uyntuk memasukkan password root daru database MySQL yang akan digunakan. Pastikan untuk mengingat password yang diinput tersebut kemudian <Ok>.

Install MySQL Server binary dengan dpkg:

$ sudo dpkg -i mysql-server_8.0.26-1ubuntu20.04_amd64.deb

Selanjutnya kita menambahkan konfigurasi mysql cluster pada configurasi mysql yang telah di install, buka my.cnf dari mysql:

$ sudo nano /etc/mysql/my.cnf

Tambahkan teks berikut pada bagian bawah file my.cnf:

. . .
[mysqld]
# Options for mysqld process:
ndbcluster                      # run NDB storage engine

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=192.168.1.12  # location of management server

Save file.

Restart MySQL server:

$ sudo systemctl restart mysql

MySQL secara default akan dimulai secara otomatis ketika service di restart. Jika tidak, jalankan perintah berikut:

$ sudo systemctl enable mysql

Langkah 4 – Verifikasi Instalasi MySQL Cluster

Untuk verifikasi MySQL Cluster, silahkan login pada server manager / node server.

Cara verifikasi pertama:

Setelah masuk, silahkan login pada MySQL:

$ mysql -u root -p

Masukkan password sesuai dengan yang di konfigurasi sebelumnya.

Setelah masuk pada MySQL, jalankan query berikut:

mysql> SHOW ENGINE NDB STATUS \G

Harusnya ada output seperti berikut:

*************************** 1. row ***************************
  Type: ndbcluster
  Name: connection
Status: cluster_node_id=4, connected_host=192.168.1.12, connected_port=1186, number_of_data_nodes=1, number_of_ready_data_nodes=1, connect_count=0
. . .

Outut diatas memperlihatkan bahwa cluster sudah berjalan dengan number_of_data_nodes=1, artinya, kita punya 1 server selain server manager yang dapat melayani permintaan data.

Keluar dari MySQL Promt dengan mengetik ‘quit‘ atau CTRL-D.

Cara verifikasi kedua:

Login pada server, kemudian ketikkan ndb_mgm:

$ ndb_mgm

Kemudian ketikkan SHOW:

ndb_mgm> SHOW

Harusnya ada ouput seperti berikut:

Connected to Management Server at: 192.168.1.12:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 1 node(s)
id=2    @192.168.1.13  (mysql-ver ndb-8.0.26, Nodegroup: 0, *)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.1.12  (mysql-ver ndb-8.0.26)

[mysqld(API)]   1 node(s)
id=3    @192.168.1.12  (mysql-ver ndb-8.0.26)

Informasi diatas memperlihatkan bahwa terdapat 1 server manager dan 1 server node pada cluster database saat ini, jumlah tersebut bisa bertambah sesuai dengan jumlah server yang digunakan.

Kita juga bisa melihat status dari masing-masing node dengan perintah:

ndb_mgm> 2 STATUS

Hasilnya kurang lebih:

Node 2: started (mysql-ver ndb-8.0.26)

Langkah 5 – Ujicoba Cluster Database MySQL

Ujicoba dapat dilakukan dengan melakukan manipulasi data pada salah satu server.

Pertama masuk ke MySQL di salah satu server:

$ mysql -u root -p

Kemudian buat database baru:

mysql> CREATE DATABASE minimarket;

Use database yang baru:

mysql> USE minimarket;

Buat sebuah table:

CREATE TABLE produk (nama VARCHAR(20), harga INT(11)) ENGINE=ndbcluster;

Kita harus secara eksplisit memberitahukan bahwa ENGINE yang digunakan ada ndbcluster.

Kemudian masukkan data:

mysql> INSERT INTO produk (nama,harga) VALUES('indomie',3000);

Lihat hasilnya:

mysql> SELECT * FROM produk;

Kesimpulan

Pada tutorial ini, kita telah membuat database terdistribusi bersifat cluster dengan MySQL. Server yang digunakan adalah Ubuntu 20.04. Perlu dipahami bahwa, tutorial ini menggunakan hanya 2 server, dimana pada kasus production bisa saja server yang dibutuhkan lebih banyak, jika demikian konfigurasi hanya perlu di tambahkan dan disesuaikan saja sesuai jumlah server yang ada.

Leave a Reply

Your email address will not be published. Required fields are marked *