Cara menggunakan mysql clustering vs replication

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.

Tutorial Video:

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:

Cara menggunakan mysql clustering vs replication
Cara menggunakan mysql clustering vs replication

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

Cara menggunakan mysql clustering vs replication
Cara menggunakan mysql clustering vs replication

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 dpkg -i mysql-cluster-community-management-server_8.0.26-1ubuntu20.04_amd64.deb
0

Enable ndb_mgmd kembali:

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

Jalankan service ndb_mgmd:

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

Verifikasi apakan NDB Cluster Management service sudah berjalan:

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

Harusnya ada output seperti dibawah:

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

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 dpkg -i mysql-cluster-community-management-server_8.0.26-1ubuntu20.04_amd64.deb
5

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:

Cara menggunakan mysql clustering vs replication
Cara menggunakan mysql clustering vs replication

Setelah ketemu, copy link download .deb tersebut.

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

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

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

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

Install Data Node Binaries menggunakan dpkg:

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

Buat file konfigurasi untuk server node:

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

Tambahkan teks berikut kedalam konfigurasi my.cnf:

$ sudo mkdir /var/lib/mysql-cluster
0

Pastikan untuk menyesuaikan IP dari server manager. Kemudian save.

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

$ sudo mkdir /var/lib/mysql-cluster
1

Sekarang kita dapat menjalankan node server menggunakan perintah berikut:

$ sudo mkdir /var/lib/mysql-cluster
2

Seharusnya ada output seperti dibawah ini:

$ sudo mkdir /var/lib/mysql-cluster
3

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

Selanjutnya berikan akses untuk server manager:

$ sudo mkdir /var/lib/mysql-cluster
4

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 mkdir /var/lib/mysql-cluster
5

Sekarang, buka dan edit file Unit systemd:

$ sudo mkdir /var/lib/mysql-cluster
6

Pastekan kode berikut:

$ sudo mkdir /var/lib/mysql-cluster
7

Save dan keluar dari editor.

Reload kembali systemd manager dengan daemon-reload:

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

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

$ sudo mkdir /var/lib/mysql-cluster
9

Jalankan service ndbd:

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

Verifikasi bahwa Cluster server sudah jalan:

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

Harusnya ada output seperti dibawah:

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

* 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:

Cara menggunakan mysql clustering vs replication
Cara menggunakan mysql clustering vs replication

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

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

Buat folder dengan nama ‘install’:

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

Extract deb-bundle kedalam folder ‘install’:

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

Masuk ke dalam folder ‘install’:

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

Install dependensi MySQL Cluster:

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

Install dependensi tambahan yang ada pada folder ‘install’:

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

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 nano /var/lib/mysql-cluster/config.ini
9

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

[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
0

Tambahkan teks berikut pada bagian bawah file my.cnf:

[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
1

Save file.

Restart MySQL server:

[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
2

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

[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
3

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:

[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
4

Masukkan password sesuai dengan yang di konfigurasi sebelumnya.

Setelah masuk pada MySQL, jalankan query berikut:

[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
5

Harusnya ada output seperti berikut:

[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
6

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:

[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
7

Kemudian ketikkan SHOW:

[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
8

Harusnya ada ouput seperti berikut:

[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
9

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:

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

Hasilnya kurang lebih:

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

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:

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

Kemudian buat database baru:

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

Use database yang baru:

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

Buat sebuah table:

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

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

Kemudian masukkan data:

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

Lihat hasilnya:

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

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.