Cluster MariaDB

L'infrastructure se compose de 5 VMs :

  • 2 load balancers (KeepAlived + HA Proxy)
  • 3 nodes MariaDB

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

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

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)

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

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

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
  • infrastructure/db/mariadb/cluster.txt
  • Dernière modification : 02/05/2024 10:57
  • de Stéphane Paillet