---
# System prepended metadata

title: Serveurs SQL et haute disponibilité
tags: [Bases de données, ' Haute disponibilité']

---

---
tags: Bases de données, Haute disponibilité
---

# Serveurs SQL et haute disponibilité

## MariaDB

### Introduction

MariaDB est un système de gestion de base de données, fork communautaire de MySQL.

### Installation

L'installation de MariaDB est des plus simples.

```bash=
# On installe MariaDB depuis les dépôts RHEL
[root@hostname01 ~] dnf install mariadb
# On provisionne le dossier /var/lib/mysql utilisé par MariaDB pour inscrire les fichiers de données
[root@hostname01 ~] mysql_install_db
# On utilise cette commande qui permet d'activer (ou non) un certain nombre de paramètres et de bonnes pratiques.
# On gardera - sauf besoin spécifique - les options proposées par défaut par MariaDB.
[root@hostname01 ~] mysql_secure_installation
```

MariaDB est installé. Il faut - en théorie - paramétrer le pare-feu pour autoriser le trafic MySQL via un <code>firewall-cmd --add-service=mysql --permanent</code>.
Cependant, nous allons - dans la suite de cette documentation - ajouter au pare-feu le service Galera qui ouvre également les ports requis pour le MySQL.

## Galera Cluster

### Introduction

Galera Cluster pour Maria DB est un gestionnaire de cluster de base de données, qui permet une réplication synchrone entre plusieurs instances de base de données. 

### Installation

On appliquera les réglages suivants uniquement sur la première instance de base de données :

```bash=
# On installe le paquet maria-db-server-galera
[root@hostname01 ~] dnf -y install mariadb-server-galera
# On ajoute le service Galera au pare-feu pour autoriser le trafic lié à MariaDB et à Galera puis on active les nouvelles règles
[root@hostname01 ~] firewall-cmd --add-service=galera --permanent
[root@hostname01 ~] firewall-cmd --reload</code>

# On ouvre le fichier de configuration de Galera
[root@hostname01 ~] nano /etc/my.cnf.d/galera.cnf</code>
```

On est désormais dans le fichier de configuration de Galera, on procède aux modifications suivantes :

```bash=
# on précise le nom du cluster
wsrep_cluster_name="Cluster_Name"

# on retire le commentaire et on remplace dummy par gcomm
# on ajoute également les IP des serveurs BDD qui constituent le cluster
wsrep_cluster_address="gcomm://XX.XX.XX.XX,YY.YY.YY.YY,ZZ.ZZ.ZZ.ZZ"

# on retire le commentaire et on indique l'adresse IP de la machine
wsrep_node_address="XX.XX.XX.XX"
```

On démarre maintenant Galera et on active MariaDB.

```bash=
[root@hostname01 ~] galera_new_cluster
[root@hostname01 ~] systemctl enable mariadb
```

On passe maintenant à la configuration des autres serveurs de BDD.
```bash=
[root@hostname02 ~] nano /etc/my.cnf.d/galera.cnf

# on précise le nom du cluster
wsrep_cluster_name="Cluster_Name"

# on retire le commentaire et on remplace dummy par gcomm
# on ajoute également les IP des serveurs BDD qui constituent le cluster
wsrep_cluster_address="gcomm://XX.XX.XX.XX,YY.YY.YY.YY,ZZ.ZZ.ZZ.ZZ"

# on retire le commentaire et on indique l'adresse IP de la machine
wsrep_node_address="YY.YY.YY.YY"

[root@hostname02 ~] systemctl enable --now mariadb
```

On peut désormais se mettre sur un des noeuds qui constituent le cluster et vérifier que cela fonctionne :

```sql=
[root@hostname01 ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.3.11-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show status like 'wsrep_%';
+------------------------------+--------------------------------------------------+
| Variable_name                | Value                                            |
+------------------------------+--------------------------------------------------+
| wsrep_apply_oooe             | 0.000000                                         |
| wsrep_apply_oool             | 0.000000                                         |
| wsrep_apply_window           | 0.000000                                         |
| wsrep_causal_reads           | 0                                                |
| wsrep_cert_deps_distance     | 0.000000                                         |
| wsrep_cert_index_size        | 0                                                |
| wsrep_cert_interval          | 0.000000                                         |
| wsrep_cluster_conf_id        | 2                                                |
| wsrep_cluster_size           | 2                                                |
| wsrep_cluster_state_uuid     | 7b640dad-faea-11e9-a8e9-eac28b190651             |
| wsrep_cluster_status         | Primary                                          |
| wsrep_commit_oooe            | 0.000000                                         |
| wsrep_commit_oool            | 0.000000                                         |
| wsrep_commit_window          | 0.000000                                         |
| wsrep_connected              | ON                                               |
| wsrep_desync_count           | 0                                                |
| wsrep_evs_delayed            |                                                  |
| wsrep_evs_evict_list         |                                                  |
| wsrep_evs_repl_latency       | 0.000238062/0.000353304/0.000585888/0.00012582/5 |
| wsrep_evs_state              | OPERATIONAL                                      |
| wsrep_flow_control_paused    | 0.000000                                         |
| wsrep_flow_control_paused_ns | 0                                                |
| wsrep_flow_control_recv      | 0                                                |
| wsrep_flow_control_sent      | 0                                                |
| wsrep_gcomm_uuid             | 9a3f806b-faeb-11e9-9c42-4f064553ffb9             |
| wsrep_incoming_addresses     | 10.0.0.31:3306,10.0.0.51:3306                    |
| wsrep_last_committed         | 3                                                |
| wsrep_local_bf_aborts        | 0                                                |
| wsrep_local_cached_downto    | 18446744073709551615                             |
| wsrep_local_cert_failures    | 0                                                |
| wsrep_local_commits          | 0                                                |
| wsrep_local_index            | 1                                                |
| wsrep_local_recv_queue       | 0                                                |
| wsrep_local_recv_queue_avg   | 0.000000                                         |
| wsrep_local_recv_queue_max   | 1                                                |
| wsrep_local_recv_queue_min   | 0                                                |
| wsrep_local_replays          | 0                                                |
| wsrep_local_send_queue       | 0                                                |
| wsrep_local_send_queue_avg   | 0.000000                                         |
| wsrep_local_send_queue_max   | 1                                                |
| wsrep_local_send_queue_min   | 0                                                |
| wsrep_local_state            | 4                                                |
| wsrep_local_state_comment    | Synced                                           |
| wsrep_local_state_uuid       | 7b640dad-faea-11e9-a8e9-eac28b190651             |
| wsrep_protocol_version       | 8                                                |
| wsrep_provider_name          | Galera                                           |
| wsrep_provider_vendor        | Codership Oy <info@codership.com>                |
| wsrep_provider_version       | 3.23(rXXXX)                                      |
| wsrep_ready                  | ON                                               |
| wsrep_received               | 3                                                |
| wsrep_received_bytes         | 231                                              |
| wsrep_repl_data_bytes        | 0                                                |
| wsrep_repl_keys              | 0                                                |
| wsrep_repl_keys_bytes        | 0                                                |
| wsrep_repl_other_bytes       | 0                                                |
| wsrep_replicated             | 0                                                |
| wsrep_replicated_bytes       | 0                                                |
| wsrep_thread_count           | 2                                                |
+------------------------------+--------------------------------------------------+
```

On voit que `[wsrep_local_state_comment]` est `Synced` et que `[wsrep_cluster_size]` a une valeur qui correspond au nombre de noeuds dans le cluster : Galera fonctionne.

## Pacemaker

### Introduction

Pacemaker est un gestionnaire de cluster haute disponibilité. Le service Pacemaker est en charge du démarrage, de l'arrêt, de la supervision des ressources du cluster.

En d'autres termes, Pacemaker va superviser nos serveurs de bases de données et s'assurer que même en cas de dysfonctionnement d'un des serveurs le service garde un fonctionnement relativement normal. Pour cela, Pacemaker va nous permettre de mettre en place une IP virtuelle (*Virtual IP* ou *vIP*). Cette IP virtuelle sera celle utilisée pour contacter nos BDD : elle va basculer entre nos trois serveurs si celui qui porte l'IP tombe. On s'assure ainsi que cette IP soit toujours attribuée à un serveur fonctionnel.

### Installation

L'installation de Pacemaker se fait directement sur les serveurs de bases de données.

Sur les trois hôtes, on réalise donc les opérations suivantes :
```bash=
# On ajoute le dépôt haute disponibilité de RHEL
[root@hostname01 ~] dnf config-manager --set-enabled rhel-8-for-x86_64-highavailability-rpms
# On installe Pacemaker et les fence-agents
[root@hostname01 ~] dnf install pcs fence-agents-all
# On autorise le trafic lié à la haute disponibilité de pacemaker dans le pare-feu puis on les active
[root@hostname01 ~] firewall-cmd --permanent --add-service=high-availability
[root@hostname01 ~] firewall-cmd --reload

# On crée un user hacluster
[root@hostname01 ~] passwd hacluster
New password:
Retype new password:
passwd: password updated successfully

# On démarre le service Pacemaker et on l'active au démarrage
[root@hostname01 ~] systemctl start pcsd.service
[root@hostname01 ~] systemctl enable pcsd.service

# On fait s'authentifier les hôtes entre eux en utilisant l'user hacluster
[root@hostname01 ~] pcs host auth hostname01 hostname02

# On procède à la création du cluster
[root@hostname01 ~] pcs cluster setup ha_cluster hostname01 hostname02

# On démarre le cluster sur tous les noeuds qui le compose et on l'active au démarrage
[root@hostname01 ~] pcs cluster start --all
[root@hostname01 ~] pcs cluster enable --all

# On vérifie la présence d'erreurs
[root@hostname01 ~] crm_verify -L -V
(unpack_resources)      error: Resource start-up disabled since no STONITH resources have been defined
(unpack_resources)      error: Either configure some or disable STONITH with the stonith-enabled option
(unpack_resources)      error: NOTE: Clusters with shared data need STONITH to ensure data integrity
Errors found during check: config not valid

# Nous n'avons pas de données partagés (Galera Cluster est une architecture "shared-nothing") et n'avons donc pas besoin de Stonith
[root@hostname01 ~] pcs property set stonith-enabled=false

# Quorum & fencing est déjà géré par Galera, on le désactive donc pour éviter des conflits
[root@hostname01 ~] pcs property set no-quorum-policy=ignore
```

Le cluster Pacemaker est créé et fonctionnel.