Menu
📱 Lihat versi lengkap (non-AMP)
MySQL Cluster High Availability

Setup MySQL Cluster untuk High Availability: Tutorial NDB Cluster Lengkap

Editor: Hendra WIjaya
Update: 3 February 2026
Baca: 5 menit

Setup MySQL Cluster untuk High Availability: Tutorial NDB Cluster Lengkap

Bagi aplikasi mission-critical, single point of failure adalah tidak bisa diterima. Setelah mengimplementasikan MySQL Cluster untuk beberapa client di industri telekomunikasi dan perbankan, saya akan berbagi setup yang terbukti reliable untuk high availability.

Arsitektur MySQL NDB Cluster

1. Node Types

Management Node (ndb_mgmd):

  • Mengelola konfigurasi cluster
  • Monitoring node status
  • Tidak menyimpan data
  • Minimum 1, recommended 2 untuk HA

Data Node (ndbd/ndbmtd):

  • Menyimpan data (partitioned)
  • Replicated (2+ replicas)
  • Minimal 2 node (1 node group)
  • Recommended 4 node (2 node groups)

SQL Node (mysqld):

  • Akses point untuk aplikasi
  • Standard MySQL server dengan NDB engine
  • Bisa multiple untuk load balancing

2. Minimum Requirements

Untuk production HA:

  • 2 Management Nodes
  • 4 Data Nodes (2 node groups)
  • 2+ SQL Nodes
  • Minimal 4GB RAM per Data Node
  • Network: Low latency (< 1ms) antar node
  • Disk: SSD untuk optimal performance

Persiapan Server

1. Network Setup

IP Assignment:

  • Management Node 1: 192.168.1.10
  • Management Node 2: 192.168.1.11
  • Data Node 1: 192.168.1.20
  • Data Node 2: 192.168.1.21
  • Data Node 3: 192.168.1.22
  • Data Node 4: 192.168.1.23
  • SQL Node 1: 192.168.1.30
  • SQL Node 2: 192.168.1.31

2. System Preparation (Semua Node)

# Update sistem
sudo apt update && sudo apt upgrade -y

# Install dependencies
sudo apt install -y libaio1 libncurses5

# Disable SELinux/AppArmor untuk testing
sudo systemctl stop apparmor
sudo systemctl disable apparmor

# Setup hosts file
sudo tee -a /etc/hosts <<EOF
192.168.1.10 mgm-node1
192.168.1.11 mgm-node2
192.168.1.20 data-node1
192.168.1.21 data-node2
192.168.1.22 data-node3
192.168.1.23 data-node4
192.168.1.30 sql-node1
192.168.1.31 sql-node2
EOF

# Setup firewall
sudo ufw allow from 192.168.1.0/24

3. Download MySQL Cluster

# Download MySQL Cluster
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-8.0/mysql-cluster-gpl-8.0.35-linux-glibc2.28-x86_64.tar.gz

# Extract
sudo tar -xzvf mysql-cluster-gpl-8.0.35-linux-glibc2.28-x86_64.tar.gz
sudo mv mysql-cluster-gpl-8.0.35-linux-glibc2.28-x86_64 /usr/local/mysql

# Setup symlink
sudo ln -s /usr/local/mysql/bin/* /usr/bin/

Setup Management Node

1. Management Node 1 (192.168.1.10)

Buat direktori:

sudo mkdir -p /var/lib/mysql-cluster
sudo mkdir -p /usr/local/mysql/bin
sudo mkdir -p /var/log/mysql

Buat config.ini:

sudo nano /var/lib/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=2G
IndexMemory=512M
MaxNoOfConcurrentOperations=100000
MaxNoOfLocalOperations=110000
StringMemory=25
MaxNoOfTables=4096
MaxNoOfOrderedIndexes=2048
MaxNoOfUniqueHashIndexes=512
MaxNoOfAttributes=24576
MaxNoOfTriggers=14336
DiskCheckpointSpeed=10M
DiskCheckpointSpeedInRestart=100M
FragmentLogFileSize=256M
NoOfFragmentLogFiles=6
RedoBuffer=64M
MaxNoOfExecutionThreads=2
TransactionDeadlockDetectionTimeout=5000

[tcp default]
AllowUnresolvedHostnames=1
SendBufferMemory=4M
ReceiveBufferMemory=4M

[ndb_mgmd]
NodeId=1
Hostname=192.168.1.10
DataDir=/var/lib/mysql-cluster
PortNumber=1186

[ndb_mgmd]
NodeId=2
Hostname=192.168.1.11
DataDir=/var/lib/mysql-cluster
PortNumber=1186

[ndbd]
NodeId=3
Hostname=192.168.1.20
DataDir=/var/lib/mysql-data

[ndbd]
NodeId=4
Hostname=192.168.1.21
DataDir=/var/lib/mysql-data

[ndbd]
NodeId=5
Hostname=192.168.1.22
DataDir=/var/lib/mysql-data

[ndbd]
NodeId=6
Hostname=192.168.1.23
DataDir=/var/lib/mysql-data

[mysqld]
NodeId=7
Hostname=192.168.1.30

[mysqld]
NodeId=8
Hostname=192.168.1.31

[api]
NodeId=9
Hostname=192.168.1.30

[api]
NodeId=10
Hostname=192.168.1.31

2. Copy config ke Management Node 2

scp /var/lib/mysql-cluster/config.ini root@192.168.1.11:/var/lib/mysql-cluster/

3. Start Management Node 1

sudo ndb_mgmd --config-file=/var/lib/mysql-cluster/config.ini --reload

# Verifikasi
sudo ndb_mgm -e show

Setup Data Nodes

1. Data Node Configuration (Semua Data Nodes)

Buat my.cnf:

sudo nano /etc/my.cnf
[mysqld]
ndbcluster
ndb-connectstring=192.168.1.10,192.168.1.11

[ndbd]
connect-string=192.168.1.10,192.168.1.11

Buat direktori data:

sudo mkdir -p /var/lib/mysql-data
sudo chown mysql:mysql /var/lib/mysql-data

2. Start Data Nodes

Di setiap data node:

sudo ndbd --initial

# Verifikasi di management node
sudo ndb_mgm -e show

Output akan menunjukkan status “started” untuk semua data nodes.

Setup SQL Nodes

1. SQL Node Configuration

Buat my.cnf:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# NDB Cluster Configuration
ndbcluster
ndb-connectstring=192.168.1.10,192.168.1.11

# Server Configuration
server-id=1
bind-address=0.0.0.0

# InnoDB untuk non-NDB tables
innodb_buffer_pool_size=512M

# NDB specific
ndb-batch-size=524288
ndb-cluster-connection-pool=1
ndb-extra-logging=1
ndb-use-exact-count=0

# Binary log untuk replication (jika perlu)
log_bin=mysql-bin
binlog_format=ROW

2. Start SQL Node

sudo systemctl restart mysql

# Verifikasi cluster connection
mysql -u root -p -e "SHOW ENGINE NDB STATUS;"

Testing Cluster

1. Create NDB Table

-- Create database
CREATE DATABASE cluster_db;
USE cluster_db;

-- Create table dengan NDB engine
CREATE TABLE users (
    id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uk_username (username)
) ENGINE=NDBCLUSTER;

2. Test Data Distribution

-- Insert data
INSERT INTO users (username, email) VALUES 
('user1', 'user1@example.com'),
('user2', 'user2@example.com'),
('user3', 'user3@example.com');

-- Verifikasi di semua SQL nodes
SELECT * FROM users;

-- Check partition info
SELECT 
    TABLE_NAME,
    PARTITION_NAME,
    SUBPARTITION_NAME,
    TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'cluster_db' AND TABLE_NAME = 'users';

3. Test Failover

Kill satu data node:

# Di data node 1
sudo killall -9 ndbd

Verifikasi cluster masih berjalan:

# Di management node
sudo ndb_mgm -e show
# Seharusnya menunjukkan node failed tapi cluster accessible

Insert data lagi untuk verifikasi:

INSERT INTO users (username, email) VALUES 
('user4', 'user4@example.com');

SELECT * FROM users;

Restart data node:

sudo ndbd

Monitoring Cluster

1. Management Console

# Interactive management
sudo ndb_mgm

# Commands:
ndb_mgm> SHOW
ndb_mgm> ALL STATUS
ndb_mgm> 3 STATUS  # Status node 3
ndb_mgm> 3 RESTART -N  # Restart node 3
ndb_mgm> 3 STOP  # Stop node 3
ndb_mgm> EXIT

2. Cluster Status Query

-- Check cluster status
SHOW STATUS LIKE 'Ndb_cluster%';

-- Check node status
SELECT * FROM ndbinfo.nodes;

-- Check memory usage
SELECT 
    node_id,
    memory_type,
    used,
    total,
    ROUND(used/total*100, 2) as usage_pct
FROM ndbinfo.memoryusage;

3. Monitoring Script

sudo nano /usr/local/bin/check_cluster.sh
#!/bin/bash

ALERT_EMAIL="admin@example.com"

# Check cluster status
STATUS=$(ndb_mgm -e "show" 2>&1)

# Check if any node is not connected
if echo "$STATUS" | grep -q "not connected\|failed"; then
    echo "MySQL Cluster Issue Detected:
$STATUS" | mail -s "[CRITICAL] MySQL Cluster Alert" $ALERT_EMAIL
fi

# Check data memory usage
MEMORY=$(mysql -e "SELECT ROUND(SUM(used)/SUM(total)*100, 2) as pct FROM ndbinfo.memoryusage WHERE memory_type='Data memory';")

if (( $(echo "$MEMORY > 85" | bc -l) )); then
    echo "MySQL Cluster Memory High: ${MEMORY}%" | mail -s "[WARNING] MySQL Cluster Memory" $ALERT_EMAIL
fi

Load Balancing SQL Nodes

1. HAProxy Setup

# Install HAProxy
sudo apt install haproxy

Konfigurasi haproxy.cfg:

frontend mysql_front
    bind *:3306
    default_backend mysql_back

backend mysql_back
    balance roundrobin
    option mysql-check user haproxy_check
    server sql1 192.168.1.30:3306 check
    server sql2 192.168.1.31:3306 check

Buat user monitoring:

-- Di setiap SQL node
CREATE USER 'haproxy_check'@'%' IDENTIFIED BY 'Check#Pass123';

2. Application Connection

# Connect ke HAProxy (192.168.1.100:3306)
conn = mysql.connector.connect(
    host='192.168.1.100',
    port=3306,
    user='app_user',
    password='App#Pass123'
)

Best Practices MySQL Cluster

1. Data Design

  • Selalu pakai PRIMARY KEY
  • Gunakan proper data types
  • Minimalis kolom BLOB/TEXT
  • Partition large tables

2. Configuration

  • Minimal 2 replicas (NoOfReplicas=2)
  • Monitor memory usage
  • Backup regular dari SQL nodes
  • Test failover secara rutin

3. Network

  • Dedicated network untuk cluster
  • Low latency antar node
  • Redundant network paths
  • Monitor network partition

Troubleshooting

1. Node Not Starting

# Check logs
tail -f /var/lib/mysql-data/ndb_3_out.log

# Reset dengan initial (hati-hati!)
sudo ndbd --initial

2. Split-Brain Scenario

# Stop semua management nodes
# Start satu management node sebagai arbitrator
ndb_mgmd --config-file=/var/lib/mysql-cluster/config.ini --reload

# Start data nodes satu per satu

3. Memory Exhaustion

-- Check memory usage
SELECT * FROM ndbinfo.memoryusage;

-- Increase di config.ini dan rolling restart
DataMemory=4G
IndexMemory=1G

Kesimpulan

MySQL NDB Cluster menyediakan true high availability dengan:

  • No single point of failure
  • Automatic failover
  • Horizontal scalability
  • Synchronous replication

Dengan setup yang tepat, Anda mendapatkan 99.999% uptime untuk mission-critical applications.

Artikel Terkait

Bagikan:

Link Postingan: https://www.tirinfo.com/setup-mysql-cluster-high-availability/