Visualiser une révision

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

TutoMaker : import en cours (21 septembre 2017 23:14:26)

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
```