Setting up Galera Replication + HA cluster using Corosync and Pacemaker on ubuntu 18 by Pranish Ghimire

If you Dont Want Galera and would like to Use Mysql 8.0 Master/Slave Replication , Skip Galera and proceed , and Follow the tutorial in the End

setup hostname using the below command on NODE01 and NODE02 respectively

hostnamectl set-hostname NODE01
hostnamectl set-hostname NODE02

In both VM (nodes) make the following entries in /etc/hosts

192.168.1.102 NODE01 
192.168.1.103 NODE02

Installation of Galera Cluster

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

nano /etc/apt/sources.list.d/galera.list

paste below line

deb https://releases.galeracluster.com/galera-4/ubuntu bionic main
deb https://releases.galeracluster.com/mysql-wsrep-8.0/ubuntu bionic main

sudo nano /etc/apt/preferences.d/galera.pref

paste the below line

#Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001

Update the server and install mysql galera

sudo apt update
apt install galera-4 mysql-wsrep-8.0

In Node01

sudo nano /etc/mysql/conf.d/galera.cnf

paste the below and change needed things

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

#Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

#Galera Cluster Configuration
wsrep_cluster_name="Galera_Cluster"
wsrep_cluster_address="gcomm://192.168.1.102,192.168.1.103"

#Galera Synchronization Configuration
wsrep_sst_method=rsync

#Galera Node Configuration
wsrep_node_address="192.168.1.102"
wsrep_node_name=“NODE01”

One second node paste the same and change like below

sudo nano /etc/mysql/conf.d/galera.cnf

. . . #Galera Node Configuration wsrep_node_address="192.168.1.103" wsrep_node_name="NODE02" . . .

Allow Different ports Through Firewall

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

Disable AppArmor by executing the following on each server:

systemctl stop apparmor
systemctl disable apparmor

Enable MySQL to Start on Boot on All Servers

sudo systemctl enable mysql

Run the following on your first server:

sudo mysqld_bootstrap

Bring up the Second Node

sudo systemctl start mysql
You can see the Cluster Status by executing below on any Node
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
you should see something like below

+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+


HA Using Corosync and Pacemaker

My Network is as follows

NODE01 192.168.1.102
NODE02 192.168.1.103

IP FLOAT  192.168.1.104

Suggested to Disable Firewall , But if you want , allow All Traffic flow between two nodes using the below command

ON NODE01

ufw allow from 192.168.100.103 to any 
ON Node02

ufw allow from 192.168.100.102 to any

Install Pacemaker and crms execute bellow commands on both servers

 apt-get install pacemaker crmsh
 update-rc.d corosync defaults
update-rc.d pacemaker defaults

Do the steps below on the primary node only:

apt-get install haveged
corosync-keygen
apt-get remove --purge haveged
scp /etc/corosync/authkey root@NODE02:/etc/corosync/.

Do the steps below on the secondary node only:

chown root: /etc/corosync/authkey
chmod 400 /etc/corosync/authkey

On both nodes do:

EDIT CONFIG FILES

nano /etc/corosync/corosync.conf

FOR NODE01

totem {
  version: 2
  cluster_name: lbcluster
  transport: udpu
  interface {
    ringnumber: 0
    bindnetaddr: 192.168.1.102
    broadcast: yes
    mcastport: 5405
  }
}

quorum {
  provider: corosync_votequorum
  two_node: 1
}

nodelist {
  node {
    ring0_addr: 192.168.1.102
    name: NODE01
    nodeid: 1
  }
  node {
    ring0_addr: 192.168.1.103
    name: NODE02
    nodeid: 2
  }
}

logging {
  to_logfile: yes
  logfile: /var/log/corosync/corosync.log
  to_syslog: yes
  timestamp: on
}

FOR NODE02

totem {
  version: 2
  cluster_name: lbcluster
  transport: udpu
  interface {
    ringnumber: 0
    bindnetaddr: 192.168.1.103
    broadcast: yes
    mcastport: 5405
  }
}

quorum {
  provider: corosync_votequorum
  two_node: 1
}

nodelist {
  node {
    ring0_addr: 192.168.1.102
    name: NODE01
    nodeid: 1
  }
  node {
    ring0_addr: 192.168.1.103
    name: NODE02
    nodeid: 2
  }
}

logging {
  to_logfile: yes
  logfile: /var/log/corosync/corosync.log
  to_syslog: yes
  timestamp: on
}

On both servers, create the pcmk file in the Corosync service directory

mkdir -p /etc/corosync/service.d/

sudo nano /corosync/service.d/pcmk

service {
 name: pacemaker
 ver: 1
}

nano /etc/default/corosync

add the below in the begining

START=yes

Start corosync and pacemaker

service corosync start
service pacemaker start

On NODE01 run:

crm configure property stonith-enabled=false
crm configure property no-quorum-policy=ignore

To add the floating IP resource where MySQL will be listening on run on either one of the nodes the following command after replacing the IP address and netmask with the appropriate values:

crm configure primitive floating-ip ocf:heartbeat:IPaddr2 params ip=192.168.1.104 cidr_netmask="24" op monitor interval="30s"

The above will Create HA , and the floating IP will forward to the Active Server

TO Create MYSQL specific Resource Execute the Below Command in any node (Have Some Bugs in the RA , mysql crashes after enabling monitor)

crm configure

primitive mysql-resource ocf:heartbeat:mysql params binary="/usr/sbin/mysqld" config="/etc/mysql/my.cnf" op start timeout=60s interval=0 op stop timeout=60s interval=0 op monitor interval=10s

colocation mysql-float-with-ip inf: mysql-resource floating-ip

commit

exit

TO Check Status crm status

Installing MYSQL8 Server

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29
wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb
dpkg -i mysql-apt-config_0.8.12-1_all.deb
    select mysql8 and okay 
    
sudo apt install -f mysql-client=8.0* mysql-community-server=8.0* mysql-server=8.0*

Configure MySQL on Master Node

nano /etc/mysql/mysql.conf.d/mysqld.cnf

Add the below

bind-address = 192.168.1.102
server-id = 1
log-bin=master-bin

Create a Replication User on Master Node

mysql -u root -p
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'Pranish@1234';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;

Next, verify the Master status with the following command:

SHOW MASTER STATUS\G

mysql> SHOW MASTER STATUS\G

*************************** 1. row *************************** File: master-bin.000001 Position: 851 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)

From the above output, note down the mysql-bin.000001 value and the Position ID 851. You will need both to set up a slave server.

On Slave Server edit the Config file as Master and only change the bind IP to the original IP and server-id = 2

Login to Mysql in slave server

mysql -u root -p 
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST ='192.168.1.102', MASTER_USER ='replication_user', MASTER_PASSWORD ='Pranish@1234', MASTER_LOG_FILE = 'master-bin.000001', MASTER_LOG_POS = 851;
START SLAVE;

Test the Master-Slave Replication

At this point, Master-Slave replication is configured. Now it's time to test whether the replication works or not.

To do so, we will create a database on the Master Node and verify whether it will be replicated on the Slave Node.

First, log in to the MySQL on the Master Node:

mysql -u root -p
CREATE DATABASE newdb;
EXIT;

Next, log in to the MySQL on the Slave Node:

mysql -u root -p
SHOW DATABASES;

If the DB is replicated , we are done here