====== Cluster MariaDB =======
{{tag>DB "bases de données" MariaDB cluster Galera Haproxy}}
===== Infrastructure =====
L'infrastructure se compose de 5 VMs :
* 2 load balancers (KeepAlived + HA Proxy)
* 3 nodes MariaDB
===== Installation =====
**Note :** l'installation est à effectuer sur les trois noeuds.
L'installation est très simple, Galera étant maintenant installé par défaut.
sudo aptitude install mariadb-server
===== Configuration =====
**Note :** la configuration est à effectuer sur les trois noeuds.
Afin de sécuriser l'accès à la base de données, nous lançons le script
sudo mysql_secure_installation
Nous définissons un mot de passe pour root, interdisons l'utilisateur anonyme, interdisons l'accès avec le compte root à distance, interdisons l'accès à la vase de test.
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Nous nous connectons en saisissant le mot de passe défini précédemment
sudo mysql -u root -p
Nous vérifions que l'accès par socket est configuré
USE mysql;
SELECT plugin FROM user WHERE user='root';
Vous devriez avoir ceci en retour
+-------------+
| plugin |
+-------------+
| unix_socket |
+-------------+
1 row in set (0.00 sec)
Nous désactivons l'accès par socket, mettons à jour les privilèges, et sortons
UPDATE user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;
QUIT
Afin d'accéder à l'instance MariaDB depuis l'extérieur, nous éditons le fichier suivant
sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
Et mettons en commentaire cette ligne :
#bind-address = 127.0.0.1
===== Configuration noeud 1 =====
Nous stoppons MariaDB
sudo systemctl stop mariadb
Nous créons le fichier /etc/mysql/mariadb.conf.d/50-galera.cnf
sudo vim /etc/mysql/mariadb.conf.d/50-galera.cnf
Et nous y intégrons les informations suivantes
[galera]
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='cluster01'
wsrep_cluster_address='gcomm://'
# Galera synchronisation configuration
wsrep_sst_method=rsync
# Galera node configuration
wsrep_node_address='10.9.214.73'
wsrep_node_name='dbcl01-db01'
Nous démarrons MariaDB
sudo systemctl start mariadb
Nous lançons le cluster (à ne faire que sur le noeud 1, et une seule fois)
sudo galera_new_cluster
Nous nous connectons à la base pour vérifier
mysql -u root -p
Et saisissons la requête
SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_ready', 'wsrep_cluster_size', 'wsrep_cluster_status', 'wsrep_connected');
Vous devriez avoir ce résultat
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_size | 1 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_ready | ON |
+----------------------+---------+
4 rows in set (0.01 sec)
===== Configuration noeud 2 et 3 =====
Nous stoppons MariaDB
sudo systemctl stop mariadb
Nous créons le fichier /etc/mysql/mariadb.conf.d/50-galera.cnf
sudo vi /etc/mysql/mariadb.conf.d/50-galera.cnf
Et nous y intégrons les informations suivantes
[galera]
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='cluster01'
wsrep_cluster_address='gcomm://10.9.214.73,10.9.214.74'
# Galera synchronisation configuration
wsrep_sst_method=rsync
# Galera node configuration
wsrep_node_address='10.9.214.74'
wsrep_node_name='dbcl01-db02'
Nous démarrons MariaDB
sudo systemctl start mariadb
Nous nous connectons à la base pour vérifier
mysql -u root -p
Et saisissons la requête
SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_ready', 'wsrep_cluster_size', 'wsrep_cluster_status', 'wsrep_connected');
Vous devriez avoir ce résultat
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_size | 2 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_ready | ON |
+----------------------+---------+
4 rows in set (0.00 sec)
Nous réitérons la même opération sur le noeud 3.
Nous créons le fichier /etc/mysql/mariadb.conf.d/50-galera.cnf
sudo vi /etc/mysql/mariadb.conf.d/50-galera.cnf
Et nous y intégrons les informations suivantes
[galera]
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='cluster01'
wsrep_cluster_address='gcomm://10.9.214.73,10.9.214.74,10.9.214.75'
# Galera synchronisation configuration
wsrep_sst_method=rsync
# Galera node configuration
wsrep_node_address='10.9.214.75'
wsrep_node_name='dbcl01-db03'
Nous démarrons MariaDB
sudo systemctl start mariadb
Nous nous connectons à la base pour vérifier
mysql -u root -p
Et saisissons la requête
SHOW GLOBAL STATUS WHERE Variable_name IN ('wsrep_ready', 'wsrep_cluster_size', 'wsrep_cluster_status', 'wsrep_connected');
Vous devriez avoir ce résultat
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_size | 3 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_ready | ON |
+----------------------+---------+
4 rows in set (0.00 sec)
Il ne nous reste plus qu'à éditer les fichiers 50-galera.cnf sur les noeuds 1 et 2 à ajouter tous les noeuds du cluster à la ligne "wsrep_cluster_address" de la façon suivante
wsrep_cluster_address='gcomm://10.9.214.73,10.9.214.74,10.9.214.75'
Nous redémarrons MariaDB sur les noeuds 1 et 2
sudo systemctl restart mariadb
===== Mise en place du load balancer =====
Nous installons les paquets haproxy et keepalived :
sudo aptitude install haproxy keepalived
Nous créons les comptes haproxy sur l'un des noeuds MariaDB, mettons à jour les privilèges, et sortons
mysql -u root -p
CREATE USER 'haproxy'@'10.9.214.71';
CREATE USER 'haproxy'@'10.9.214.72';
FLUSH PRIVILEGES;
quit
Pour contrôler que nous avons bien nos deux utilisateurs
mysql -u root -p -e "select * from mysql.user" | grep haproxy | cut -d$'\t' -f1,2
Vous devriez avoir ceci en retour
Enter password:
10.9.214.71 haproxy
10.9.214.72 haproxy
Editez le fichier /etc/haproxy/haproxy.cfg et ajoutez ceci à la fin du fichier
listen mariadb-galera-writes
bind 0.0.0.0:3307
mode tcp
option mysql-check user haproxy
server db1 10.9.214.73:3306 check
server db2 10.9.214.74:3306 check backup
server db3 10.9.214.75:3306 check backup
listen mariadb-galera-reads
bind 0.0.0.0:3306
mode tcp
balance leastconn
option mysql-check user haproxy
server db1 10.9.214.73:3306 check
server db2 10.9.214.74:3306 check
server db3 10.9.214.75:3306 check
# HAProxy web ui
listen stats
bind 0.0.0.0:80
mode http
stats enable
stats uri /haproxy
stats realm HAProxy\ Statistics
stats auth admin:password
stats admin if TRUE
===== Keepalived =====
Sur le noeud 1, nous éditons le fichier /etc/keepalived/keepalived.conf et y ajoutons
# config file for keepalived on lac-dbcl01-lb01
global_defs {
notification_email {
root@neotion.com
}
notification_email_from lac-dbcl01-lb01-noreply@neotion.com
smtp_server smtp.neotion.com
smtp_connect_timeout 30
router_id lac-dbcl01-lb01
}
vrrp_script chk_haproxy {
script "/usr/bin/systemctl is-active --quiet haproxy"
interval 2
weight 2
}
vrrp_instance Cluster01 {
state MASTER
interface eth0
smtp_alert
virtual_router_id 10
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass password # use 8 chars & something better
}
virtual_ipaddress {
10.9.214.70
}
track_script {
chk_haproxy
}
}
Sur le noeud 2, nous éditons le fichier /etc/keepalived/keepalived.conf et y ajoutons
# config file for keepalived on lac-dbcl01-lb02
global_defs {
notification_email {
root@example.com
}
notification_email_from lac-dbcl01-lb02-noreply@neotion.com
smtp_server smtp.example.com
smtp_connect_timeout 30
router_id lac-dbcl01-lb02
}
vrrp_script chk_haproxy {
script "/usr/bin/systemctl is-active --quiet haproxy"
interval 2
weight 2
}
vrrp_instance Cluster01 {
state MASTER
interface eth0
smtp_alert
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass password # use 8 chars & something better
}
virtual_ipaddress {
10.9.214.70
}
track_script {
chk_haproxy
}
}
Redémarrer haproxy et keeaplived sur chaque noeud
sudo service haproxy restart
sudo service keepalived restart
===== Liens =====
* [[https://www.digitalocean.com/community/tutorials/how-to-configure-a-galera-cluster-with-mariadb-10-1-on-ubuntu-16-04-servers|how to configure a galera cluster with mariadb 10.1 on ubuntu 16.04 servers]]
* [[https://medium.com/mariadb-galera-load-balancer-glb/what-is-galeraand-how-to-configure-glb-with-galera-cluster-6d42a0591754|what is galera and how to configure glb with galera cluster]]
* [[https://blog.devarieux.net/2016/06/monter-cluster-galera-mariadb.html|monter un cluster Galera MariaDB]]
* [[https://blog.laimbock.com/2014/10/01/howto-setup-high-available-haproxy-with-keepalived/|howto setup high available haproxy with keepalived]]