[MARIADB] GALERA 3 NODE - fourslickz/notes GitHub Wiki

=========================

Node1 (Production)

=========================

[mysqld]
bind-address=0.0.0.0
default_storage_engine=InnoDB
binlog_format=ROW
innodb_autoinc_lock_mode=2
query_cache_size=0

wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://10.2.0.101,10.2.0.102,10.2.0.103"

# Node specific
wsrep_node_name="node1"
wsrep_node_address="10.2.0.101"
wsrep_sst_method=rsync

=========================

Node2

=========================

[mysqld]
bind-address=0.0.0.0
default_storage_engine=InnoDB
binlog_format=ROW
innodb_autoinc_lock_mode=2
query_cache_size=0

wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://10.2.0.101,10.2.0.102,10.2.0.103"

# Node specific
wsrep_node_name="node2"
wsrep_node_address="10.2.0.102"
wsrep_sst_method=rsync

=========================

Node3

=========================

[mysqld]
bind-address=0.0.0.0
default_storage_engine=InnoDB
binlog_format=ROW
innodb_autoinc_lock_mode=2
query_cache_size=0

wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://10.2.0.101,10.2.0.102,10.2.0.103"

# Node specific
wsrep_node_name="node3"
wsrep_node_address="10.2.0.103"
wsrep_sst_method=rsync

SCRIPT

#!/bin/bash
# ========================================
# Script Deploy MariaDB Galera 3 Node
# NODE_ID = 1,2,3
# ========================================

NODE_ID=$1   # jalankan: ./deploy_galera.sh 1
IP_NODE1="10.2.0.101"
IP_NODE2="10.2.0.102"
IP_NODE3="10.2.0.103"
CLUSTER_NAME="galera_cluster"

if [ -z "$NODE_ID" ](/fourslickz/notes/wiki/--z-"$NODE_ID"-); then
    echo "Usage: $0 <NODE_ID: 1|2|3>"
    exit 1
fi

# Tentukan node-specific
case $NODE_ID in
  1)
    NODE_NAME="node1"
    NODE_IP="$IP_NODE1"
    ;;
  2)
    NODE_NAME="node2"
    NODE_IP="$IP_NODE2"
    ;;
  3)
    NODE_NAME="node3"
    NODE_IP="$IP_NODE3"
    ;;
  *)
    echo "NODE_ID harus 1,2, atau 3"
    exit 1
    ;;
esac

# 1️⃣ Install MariaDB + Galera
yum install -y MariaDB-server MariaDB-client galera rsync haproxy

systemctl enable mariadb
systemctl stop mariadb

# 2️⃣ Konfigurasi my.cnf
cat > /etc/my.cnf.d/galera.cnf <<EOL
[mysqld]
bind-address=0.0.0.0
default_storage_engine=InnoDB
binlog_format=ROW
innodb_autoinc_lock_mode=2
query_cache_size=0

wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name="$CLUSTER_NAME"
wsrep_cluster_address="gcomm://$IP_NODE1,$IP_NODE2,$IP_NODE3"

wsrep_node_name="$NODE_NAME"
wsrep_node_address="$NODE_IP"
wsrep_sst_method=rsync
EOL

# 3️⃣ Bootstrap atau start
if [ "$NODE_ID" == "1" ](/fourslickz/notes/wiki/-"$NODE_ID"-==-"1"-); then
    echo "Bootstrapping Node1..."
    galera_new_cluster
else
    echo "Starting Node$NODE_ID..."
    systemctl start mariadb
fi

# 4️⃣ Setup HAProxy (optional)
cat > /etc/haproxy/haproxy.cfg <<EOL
global
    log /dev/log local0
    maxconn 2000

defaults
    log global
    mode tcp
    timeout connect 5s
    timeout client  50s
    timeout server  50s

frontend mysql_front
    bind *:3306
    default_backend mysql_back

backend mysql_back
    balance roundrobin
    server node1 $IP_NODE1:3306 check
    server node2 $IP_NODE2:3306 check
    server node3 $IP_NODE3:3306 check
EOL

systemctl enable haproxy
systemctl restart haproxy

# 5️⃣ Firewall / IPtables (optional)
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3306 -j DNAT --to-destination $IP_NODE1:3306
iptables -t nat -A POSTROUTING -s 10.2.0.0/24 -o eth0 -j MASQUERADE
service iptables save

echo "Node$NODE_ID deployment selesai. Cek cluster status:"
echo "Login ke MariaDB dan jalankan: SHOW STATUS LIKE 'wsrep%';"