Visualiser une révision

[Tuto/HowTo] [Debian/Ubuntu] Clusteriser vos bases de données MariaDB avec Galera Cluster et HaProxy

TutoMaker : mise en page (21 septembre 2017 23:28:48)

IMPORT ET MISE EN PAGE EN COURS, PRIÉ DE NE PAS ÉDITER POUR LE MOMENT. vox
==========================================================================

Présentation
============

Un Cluster de base de données est un ensemble de serveurs reliés entre eux via réseau afin de créer un ensemble virtuel utilisant la réplication des données pour protéger les bases de données contre une éventuelle panne (machine, réseau).

HaProxy va servir de pont (proxy) entre les clients et les serveurs du cluster de base de données. C'est un répartiteur de charge (load balancer) qui va choisir le serveur le plus facilement accessible (le moins occupés) lorsqu'un client veut effectuer une action sur les BDD. Il n'est pas obligatoire au bon fonctionnement du cluster, juste une belle optimisation.

Galera Cluster quant à lui permet de créer/gérer le cluster mariaDB. Il va aussi s'occuper de la redondance des données (leur multiplication dans la grappe).

Un serveur peut tout à fait cumuler répartiteur de charge HaProxy et serveur de base de données Galera Cluster.

**Attention: :**  Si vous devez reboot une machine du cluster, vous devrez probablement lancer cette commande sur un des Noeuds et relancer les autres.

```
sed -ie '/safe_to/c\safe_to_bootstrap: 1' /var/lib/mysql/grastate.dat
mysqld_safe --wsrep-new-cluster
```

Limitations
-----------

source : [MariaDB Galera Cluster : la réplication multi maitres](https://wiki.deimos.fr/MariaDB_Galera_Cluster_:_la_r%C3%A9plication_multi_maitres)

* Supporte uniquement le [moteur de stockage innoDB](https://fr.wikipedia.org/wiki/InnoDB)
* Il faut qu'il y ait des [clés primaires](https://fr.wikipedia.org/wiki/Cl%C3%A9_primaire) sur toutes les tables
* [DELETE](http://sql.sh/cours/delete) ne fonctionne que sur les tables munies de clefs primaires
* [LOCK/UNLOCK](https://mariadb.com/kb/en/mariadb/lock-tables-and-unlock-tables/)/[GET_LOCK](https://mariadb.com/kb/en/mariadb/get_lock/)/[RELEASE_LOCK](https://mariadb.com/kb/en/mariadb/release_lock/) ne fonctionne pas en multi maître
* Les [query logs](https://mariadb.com/kb/en/mariadb/general-query-log/) ne peuvent être envoyés sur des tables, mais uniquement sur des fichiers
* Les [transactions XA](https://fr.wikipedia.org/wiki/XA_%28bases_de_donn%C3%A9es%29) ne sont pas supportées


Mise en place de Galera Cluster + mariadb
=========================================

#### Passez en administrateur (root)

* **Sur Ubuntu / Raspbian**

```
sudo su
```

* **Sur Debian / Ubuntu Minimal**

```
su
```

#### Ajoutez clés et dépôts pour la dernière version (10.2.x)

```
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mariadb.cu.be/repo/10.2/ubuntu xenial main'
```

#### Installez la dernière version de mariadb-server et galera

```
apt-get update
apt-get install -y mariadb-server galera-3
```

**éventuellement l'Arbitrator (attention, ne réplique PAS les base de données mais reçoit autant de requête)**

```
apt-get install galera-arbitrator-3
```

#### Créez _/etc/mysql/conf.d/galera.cnf_

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

 * **Ensuite ajoutez dedans** 

```
[mysqld]
#mysql settings
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_size=0
query_cache_type=0
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=256M
bind-address=10.8.1.42

#Galera settings
wsrep_provider=/usr/lib/libgalera_smm.so
#SSL for Galera
#wsrep_provider_options="socket.ssl_key=/etc/mysql/ssl/server-key.pem;socket.ssl_cert=/etc/mysql/ssl/server-cert.pem;socket.ssl_ca=/etc/mysql/ssl/ca-cert.pem"
wsrep_cluster_name="monSuperCluster"
wsrep_cluster_address="gcomm://10.8.1.42,10.8.1.43,10.8.1.44"
wsrep_sst_method=rsync
wsrep_on=ON
wsrep_node_address="10.8.1.42"
wsrep_node_name="monJoliNom"
```

* Ajoutez à _**wsrep_cluster_address=**_ les [hostnames](https://fr.wikipedia.org/wiki/Hostname) de vos machines séparés par des virgules par exemple

```
wsrep_cluster_address="hostnameMachine1,hostnameMachine2,hostnameMachine3"
```

  * **Note :** il est déconseillé de spécifier des adresses IP, privilégiez plus tôt des [noms de domaines](https://fr.wikipedia.org/wiki/Hostname) dont vous ferez la correspondance soit dans votre serveur DNS, soit dans vos fichiers _/etc/hosts_.

* Vérifiez à _**default_storage_engine=**_ qu'InnoDB est bien le moteur par défaut (vous pouvez éventuellement le remplacer par un autre moteur tant qu'il est compatible avec galera)

```
default_storage_engine=InnoDB
```

* Spécifiez éventuellement à _**innodb_buffer_pool_size=**_ combien mémoire (RAM et Swap) InnoDB peut consommer

```
innodb_buffer_pool_size=256M
```

  * **Note :** la doc conseille de prendre la valeur qu'on utilise sur un serveur lambda et de réduire l'utilisation mémoire de 5% afin de ne pas subir une augmentation dû a l'utilisation du cluster.

* Le nom du cluster (doit obligatoirement être identique sur chaque Node) 

* L'adresse du Node

```
wsrep_node_address="10.8.1.42"
```

* Le nom du Node

```
wsrep_node_name="monJoliNom"
```

* Le provider du Node (paramètre _**wsrep_provider**_)

```
wsrep_provider=/usr/lib/libgalera_smm.so
```

  * Au choix _**/usr/lib/libgalera_smm.so**_ ou _**/usr/lib/galera/libgalera_smm.so**_

#### Autoriser dans AppArmor le cluster à utiliser des ports non root ([source](http://galeracluster.com/documentation-webpages/galerainstallation.html#disabling-apparmor))

```
sudo ln -s /etc/apparmor.d/usr /etc/apparmor.d/disable/.sbin.mysqld
sudo service apparmor restart
```

#### Sur certaines machines le fichier _/etc/mysql/my.cnf_ n'existe pas. Si c'est le cas, créez le en copiant le [contenu suivant](https://www.0rion.netlib.re/forum4/download/file.php?id=804)

#### [a vérifier] Si vous partez d'une base de données mysql/mariadb déjà existante, vous devez l'upgrade vers galera ([source](http://galeracluster.com/documentation-webpages/migration.html))

#### Sur un des nodes arrêtez mariadb

```
service mysql stop
```

#### Ensuite initialisez le cluster

```
sudo /usr/bin/galera_new_cluster
```

#### Relancez mariadb sur tout les Nodes

```
service mysql restart
```

#### Testez si ça fonctionne

```
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
```

#### Si vous avez l'erreur "_ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded_", sur tout les nodes, resetez les password admin :

```
service mysql stop
mysqld_safe --skip-grant-tables &
mysql -uroot
use mysql;
update user set password=PASSWORD("MY_NEW_PASSWORD_HERE") where User='root';
update user set plugin="mysql_native_password";
quit;
/etc/init.d/mysql stop
kill -9 $(pgrep mysql)
/etc/init.d/mysql start
```


________________________________________________



Installation d'un répartiteur de charge HaProxy pour Galera Cluster
===================================================================

**Note :** vous pouvez le ou les installer sur des machines dédiés, ou sur un ou plusieurs de vos serveurs de bases de données. Vous pouvez aussi directement l'installer sur un client. 

#### Installez les pré-requis

```
apt-get update
apt-get install haproxy
```

#### Éditez la valeur _ENABLED=0_ à _ENABLED=1_ dans les fichiers _/etc/default/haproxy_ et _/etc/init.d/haproxy_

```
sed -i "s/ENABLED=0/ENABLED=1/g" /etc/default/haproxy
sed -i "s/ENABLED=0/ENABLED=1/g" /etc/init.d/haproxy
```

#### Éditez _/etc/haproxy/haproxy.cfg_

```
sudo nano /etc/haproxy/haproxy.cfg
```

#### Adaptez puis ajoutez

```
# Load Balancing for Galera Cluster
listen galera
bind 10.8.0.66:3306
balance leastconn
mode tcp
option tcpka
option mysql-check user haproxy
server hostnameNode1 10.8.1.42:3306 check weight 1
server hostnameNode2 10.8.1.43:3306 check weight 1
server hostnameNode3 10.8.1.44:3306 check weight 1
```

* **_listen galera_** => Format "listen numUnique". Identifie notre bloc de configuration.
* **_bind 10.8.0.66:3306_** => adresseIP:port sur quelle adresse le serveur HaProxy doit-il écouter (si vous passez par des [tunnels SSH](https://www.0rion.netlib.re/forum4/viewtopic.php?f=40&t=369), choisissez 127.0.0.1). Si votre répartiteur est sur la même machine que le cluster de Base De Données, pensez à lui attribuer un port différent. (qu'il faudra mentionner aux clients) Le caractère magique * est autorisé.
* **_mode tcp_** => choisissez tcp
* **_balance leastconn_** => l’algorithme de répartition de charge (load balancing). Accepte : roundrobin , leastconn, source. ([informations](https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts#load-balancing-algorithms))
option mysql-check user haproxy => on demande a HaProxy de tenter de se connecter à la base de données du cluster
* **_stats_** => configurer la WEBUI pour administrer HaProxy depuis votre navigateur 

  * _**listen stats 127.0.0.1:8080**_ => adresseIP:port sur quelle adresse le serveur Web doit écouter/répondre pour la WEBUI (si vous passez par [tunnels SSH](https://www.0rion.netlib.re/forum4/viewtopic.php?f=40&t=369) ou [Tor Hidden Service](https://www.0rion.netlib.re/forum4/viewtopic.php?f=45&t=261) indiquez 127.0.0.1 comme IP et prenez un port inutilisé (peu importe lequel tant que vos ne l’oubliez pas)
  * _**stats enable|disable**_ => activer|désactiver la WEBUI

#### Commentez _**option httplog**_ puis sauvez et quittez avec _**CTRL+X**_

#### Sur le cluster Galera, créez l'utilisateur dédié à HaProxy

```
mysql -u root -p -e "CREATE USER 'haproxy'@'10.8.1.%';"
```

  * _**10.8.1.%**_ => ici on autorise les connexions entrantes depuis les adresses IP allant de 10.8.1.0 à 10.8.1.255, remplacez par une seule adresse si vous le souhaitez (déconseilez si vous souhaitez pouvoir utiliser plusieurs répartiteur de charge)

#### Démarrez HaProxy

```
service haproxy restart
```


__________________________________________________-



Ajouter un serveur à Galera Cluster
===================================

#### Installez votre serveur en suivant la procédure ci-haut.

#### Sur chacun de vos Nodes éditez le fichier /_etc/mysql/conf.d/galera.cnf_ afin d'ajouter l'hostname de votre nouveau serveur. La valeur à éditer est _wsrep_cluster_address_ (_CTRL+W_ pour chercher), comme suit

```
wsrep_cluster_address="gcomm://hostnameServer1,hostnameServer2,hostnameServer3"
```

#### Sur chacun de vos Nodes éditez le fichier _/etc/hosts_ afin d'ajouter la correspondance entre adresse IP et nom de domaine pour votre nouveau serveur. Par exemple

```
10.8.0.42 penséeprofonde
10.8.0.43 server1
10.8.0.44 server2
```

* **Note :** A moins d'avoir spécifié "_bind 0.0.0.0_" (= écoute sur toutes les IP) sur vos différents Noeuds, il est primordiale de joindre les ip que vous avez spécifiez en écoute. Si par exemple sur server1 vous avez spécifiez "_bind 10.8.0.43_" (= écoute uniquement sur _10.8.0.43_) alors il faut obligatoirement joindre ce serveur sur cette adresse (même _127.0.0.1_ et _localhost_ ne fonctionneront pas!).