Table of Contents

Ubuntu MariaDB Galera Cluster Install

We are going to set up a Galera Cluster with 4 nodes. Feel free to use 3 nodes if you like, but be aware 3 nodes is the minimum. If you are unsure if you need a Galera cluster or a just Primary Replica setup click [Here]

Install MariaDB

Run the following using sudo or root.

apt update
apt install -y mariadb-server mariadb-client
systemctl start mariadb.service
mysql_secure_installation

Apply the following when running mysql_secure_installation

Enter current password for root (enter for none): press enter
Switch to unix_socket authentication [Y/n]        press n
Change the root password? [Y/n]                   press y
New password:                                     enter new root password
Re-enter new password:                            enter new root password again
Remove anonymous users?                           press y
Disallow root login remotely?                     press y
Remove test database and access to it?            press y
Reload privilege tables now?                      press y

Configure Galera Cluster

Now we need to create the Galera configuration so that the nodes can communicate with each other.

vi /etc/mysql/conf.d/galera.cnf

Add the following lines.

Note At the present time on Binlog Format ROW is supported.

On Node 1

[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://node1_ip,node2_ip,node3_ip,node4_ip"

# Galera Synchronization Configuration
wsrep_sst_method                                = rsync

# Galera Node Configuration
wsrep_node_address                              = "node1_ip"
wsrep_node_name                                 = "node1"

On Node 2

Same as node 1 except for these 2 lines.

wsrep_node_address                              = "node2_ip"
wsrep_node_name                                 = "node2"

On Node 3

Same as node 1 except for these 2 lines.

wsrep_node_address                              = "node3_ip"
wsrep_node_name                                 = "node3"

On Node 4

Same as node 1 except for these 2 lines.

wsrep_node_address                              = "node4_ip"
wsrep_node_name                                 = "node4"

Initialize The Galera Cluster

Stop MariaDB on all nodes.

systemctl stop mariadb.service

On the first node, initialize the MariaDB Galera cluster with the following command.

galera_new_cluster

Check the status of the cluster.

mysql -u root -p
SHOW STATUS LIKE 'wsrep_cluster_size';

You should get an output similar to this one.

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

On the second node start MariaDB.

systemctl start mariadb.service

And again check the status.

mysql -u root -p
SHOW STATUS LIKE 'wsrep_cluster_size';

You should get an output similar to this one. Indicating we have 2 nodes running.

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

Do the same for the rest of the nodes in the cluster.

Verify Cluster Replication

On the first node create some databases with the following command.

mysql -u root -p
CREATE DATABASE testdb1;
CREATE DATABASE testdb2;
exit

Now lets check if the databases are present on the rest of the nodes. On each node you can check like this.

mysql -u root -p
SHOW DATABASES;

You should see the databases we created on node 1 being replicated on the rest of the nodes.

+--------------------+
| Database           |
+--------------------+
| testdb1            |
| testdb1            |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.001 sec)