Visualiser une révision

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

TutoMaker : ajout repot debian 8 et 9 (22 septembre 2017 00:28:46)

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)

* **Sur Ubuntu 16.xx**

```
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'
```
* **Sur Debian 8 (Jessie) / Raspbian Jessie**

```
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mariadb.mirror.nucleus.be/repo/10.2/debian jessie main'
```

* **Sur Debian 9 (stretch)**

```
sudo apt-get install software-properties-common dirmngr
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mariadb.mirror.nucleus.be/repo/10.2/debian stretch main'
```

* Pour les autres distro, [voyez ce lien](https://downloads.mariadb.org/mariadb/repositories/) :)


#### 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)

```
wsrep_cluster_name="monSuperCluster"
```

* 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 (dans ce dernier cas, veillez à écouter sur des ports différents si non conflit). 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!).






Connecter un client au Cluster Galera
=====================================

**Installez le client mysql/mariadb**

```
apt-get install -y mariadb-client
```

**Si vous souhaitez pouvoir 'l'utiliser depuis php, installez le module php-mysql**

```
apt-get install php-mysql
```

**Pour vous connecter à vos Bases De Données, spécifiez comme host au choix votre Répartiteur de charge HaProxy ou directement un de vos serveurs Galera. N'oubliez pas de bien joindre les IP que vous avez spécifiez en écoute à moins d'avoir choisis "_bind 0.0.0.0_".**

Du point de vue client le cluster va se comporter comme un simple serveur mysql/mariadb. N'oubliez pas néanmoins de toujours utiliser des clés primaires dans vos tables de données.


__________________________________________________________________________________



Quelques commandes
==================


#### Afficher des infos à propos du cluster (toutes les variables "wsrep_").

```
mysql -u root -p -e "show status like 'wsrep%';"
```

#### Afficher des infos à propos des utilisateurs de vos Base de Données.

```
mysql -u root -p -e "select host, user, password from mysql.user;"
```

#### Créer un utilisateur et sa Base de Données

```
mysql -u root -p -e "CREATE DATABASE MA_BASE; GRANT ALL PRIVILEGES ON MA_BASE.* TO 'monUSER'@'10.8.1.%' identified by 'monPass'; FLUSH PRIVILEGES;"
```

* Traduction : Créer la base de données intitulée MA_BASE. Ensuite donner accès à MA_BASE à l'utilisateur monUSER depuis n'importe quelle adresse du réseau 10.8.1.x et dont le mot de passe est monPass (en claire).

#### Changer mot de passe utilisateur

```
mysql -uroot -p -e "UPDATE mysql.user SET Password=PASSWORD('monNouveauPASS') WHERE USER='monUSER';"
```

#### Changer Host accepté pour un utilisateur

```
mysql -uroot -p -e "UPDATE mysql.user SET Host='%.%.%.%' WHERE USER='monUser';"
```

* Dans l'exemple ici on autorise toutes les IP sources pour l'utilisateur monUser.

#### Checker combien de Nœuds sont connecté.

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

* Cette commande est très utile pour vérifier qu'une machine est bien connectée au cluster.

![screenshot-2017_08_22-Commade_Galera_Cluster_mariadb_Status_Cluster](https://framapic.org/xBSZ5iDe3ioW/NulfTWDbSiHW.png)

#### Supprimer une Base de Données.

```
mysql -uroot -p -e "DROP DATABASE maBaseDeDonnées;"
```

#### Supprimer un utilisateur

```
mysql -uroot -p -e "DROP USER ‘identifiant’@’serveur’;"
```


________________________________________________________________________________________________




Farm Link
=========

* [[Tuto/HowTo] [Debian/Ubuntu] Clusteriser vos bases de données MariaDB avec Galera Cluster et HaProxy](https://www.0rion.netlib.re/forum4/viewtopic.php?f=95&t=663&p=1528#p1525) (tutoriel d'origine)
* [mariaDB official website](http://mariadb.org/)
* [LinuxFR - HAProxy 1.5](http://linuxfr.org/news/haproxy-1-5)
* [[Tuto]HA: Mettre en place un cluster de base de données avec MariaDB, Galera Cluster et HaProxy sous Debian 7](http://denisrosenkranz.com/tutoha-mettre-en-place-un-cluster-de-base-de-donnees-avec-mariadb-galera-cluster-et-haproxy-sous-debian-7/)
* [Migrer de Mysql vers MariaDB](https://www.abyssproject.net/2014/07/migrer-mysql-vers-mariadb/)
* [[Tuto]HA: Introduction à HaProxy sous Debian 7](http://denisrosenkranz.com/tutoha-introduction-a-haproxy-sous-debian-7/)
* [MariaDB Galera Cluster : la réplication multi maitres](https://wiki.deimos.fr/MariaDB_Galera_Cluster_:_la_r%C3%A9plication_multi_maitres)
* [[TUTO] Installer prestashop 1.6 sur un Galera Cluster](https://www.prestashop.com/forums/topic/522632-tuto-installer-prestashop-16-sur-un-galera-cluster/)
* [CentOS 7: Installation de MariaDB Galera Cluster](http://www.pegasus45.lautre.net/index.php/CentOS_7:_Installation_de_MariaDB_Galera_Cluster)
* [WikipediaFR - Heartbeat (logiciel)](https://fr.wikipedia.org/wiki/Heartbeat_%28logiciel%29)
* [LinuxFR - Forum Linux.général Comment est sélectionné le noeud d'un cluster HAPROXY](https://linuxfr.org/forums/linux-general/posts/comment-est-selectionne-le-noeud-d-un-cluster-haproxy)
* [doc - Installing MariaDB Galera Cluster with apt-get](https://mariadb.com/kb/en/mariadb/installing-mariadb-deb-files/#installing-mariadb-galera-cluster-with-apt-get)
* [Node Failure and Recovery](http://galeracluster.com/documentation-webpages/recovery.html)
* [Monitoring Cluster Status](http://galeracluster.com/documentation-webpages/monitoringthecluster.html#monitoring-cluster)
* [Galera Cluster sur Twitter](https://twitter.com/codership)
* [Galera Cluster for MySQL - Tutorial](https://severalnines.com/resources/tutorials/galera-cluster-mysql-tutorial)
* [Automatisation installation de Galera Cluster + mariadb](https://www.0rion.netlib.re/forum4/viewtopic.php?f=92&t=658&p=1509#p1509)
* [Migrating to Galera Cluster](http://galeracluster.com/documentation-webpages/migration.html)
* [Ubuntu 15.10 mysql error 1524 - unix_socket](https://askubuntu.com/questions/705458/ubuntu-15-10-mysql-error-1524-unix-socket)