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

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » lun. août 21, 2017 1:46 pm

musique d'ambiance : Ultimate Glitch Hop Gaming Mix 2017

Clusteriser vos bases de données MariaDB avec Galera Cluster et HaProxy
Sommaire
  1. Présentation
  2. Installation des serveurs Galera Cluster
  3. Installation d'un répartiteur de charge HaProxy
  4. Ajout d'un d'un serveur à Galera (rien à faire à part l'ajouter dans les configs des différents nodes)
  5. Ouvrir le parefeu (firewall)
  6. Connecter un client au Cluster Galera
  7. Quelques commandes
  8. Foire Aux Questions

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.
    Les Bases de Données MariaDB d'une grappe Galera Cluster peuvent être sauvegardées via automysqlbackup.


    Note : afin d'éviter les coupures lorsqu'un node est absent, il est fortement conseillé d'utiliser au moins 3 nodes ou au moins 2 nodes + 1 arbitre. Si non Galera Cluster attendra que TOUT les nodes soient connecté avant d'autoriser l'accès à la BDD aux logiciels.

    Attention : Galera porte bien son nom, le logiciel est hyper capricieux et incapable de prendre la moindre décision :
    Si vous devez reboot une machine du cluster, vous devrez peut-être lancer cette commande sur un des Noeuds et relancer les autres.
    • Code : Tout sélectionner

      sed -ie '/safe_to/c\safe_to_bootstrap: 1' /var/lib/mysql/grastate.dat
      mysqld_safe --wsrep-new-cluster
    • Sur ce même node éditez le fichier /etc/mysql/conf.d/galera.cnf
      • Code : Tout sélectionner

        nano /etc/mysql/conf.d/galera.cnf
        Commentez ensuite la ligne concernant la liste de vos nodes "wsrep_cluster_address" puis ajoutez la ligne suivante
      Ensuite réinitialisez le cluster Relancez mariadb sur tout les Nodes


    Limitations
    source : MariaDB Galera Cluster : la réplication multi maitres
    Caractéristiques
    Source : mes propres essais
    • -ne fonctionne pas sur ARM
      -crash complètement si au moins deux nœuds de la grappe ne sont disponible
      -nécessite une latence faible (moins de 100ms)


Terminologie
  • root : administrateur
    Node : nœud, machine, membre de la grappe
    Grappe : cluster, groupe de machine
    Répartiteur de charge / load balancer : proxy chargé de mettre en relation les clients avec le serveur le plus rapide à un instant T.


Farm Link
Modifié en dernier par voxdemonix le mer. oct. 18, 2017 2:18 pm, modifié 15 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » lun. août 21, 2017 1:46 pm

[_alienOoups_] !!! FONCTIONNE !!! [_alienOoups_]
testé sur : Xubuntu 16.04.03, ubuntu-server 16.04

Mise en place de Galera Cluster + mariadb
  1. Passez en administrateur (root)
  2. Ajoutez clés et dépôts pour la dernière version (10.2.x)
    • Sur Ubuntu 16.xx
      • Code : Tout sélectionner

        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'
        Si vous voulez aussi ajouter le dépôts de la version 10.1.x
        • Code : Tout sélectionner

          add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirror.lstn.net/mariadb/repo/10.1/ubuntu xenial main'

      Sur Debian 9 (stretch)
      • Code : Tout sélectionner

        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 :)
  3. Installez la dernière version de mariadb-server et galera éventuellement l'Arbitrator (attention, ne réplique PAS les base de données mais reçoit autant de requête)
  4. Créez /etc/mysql/conf.d/galera.cnf Ensuite ajoutez dedans
    • Code : Tout sélectionner

      [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"
      1. Ajoutez à wsrep_cluster_address= les hostnames de vos machines séparés par des virgules par exemple
        • Code : Tout sélectionner

          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 dont vous ferez la correspondance soit dans votre serveur DNS, soit dans vos fichiers /etc/hosts.
      2. 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)
      3. Spécifiez éventuellement à innodb_buffer_pool_size= combien mémoire (RAM et Swap) InnoDB peut consommer
        • Code : Tout sélectionner

          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.
      4. Le nom du cluster (doit obligatoirement être identique sur chaque Node)
      5. L'adresse du Node
      6. Le nom du Node
      7. Le provider du Node (paramètre wsrep_provider)
        • Code : Tout sélectionner

          wsrep_provider=/usr/lib/libgalera_smm.so
          Au choix /usr/lib/libgalera_smm.so ou /usr/lib/galera/libgalera_smm.so
  5. Autoriser dans AppArmor le cluster à utiliser des ports non root (source)
    • Code : Tout sélectionner

      sudo ln -s /etc/apparmor.d/usr /etc/apparmor.d/disable/.sbin.mysqld
      sudo service apparmor restart
  6. 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 :
    • my.cnf
  7. [a vérifier] Si vous partez d'une base de données mysql/mariadb déjà existante, vous devez l'upgrade vers galera (source)
  8. Sur un des nodes (que nous considérerons comme le premier) arrêtez mariadb
  9. Sur ce même node éditez le fichier /etc/mysql/conf.d/galera.cnf
    • Code : Tout sélectionner

      nano /etc/mysql/conf.d/galera.cnf
      Commentez ensuite la ligne concernant la liste de vos nodes "wsrep_cluster_address" puis ajoutez la ligne suivante
  10. Ensuite initialisez le cluster
  11. Relancez mariadb sur tout les Nodes
  12. Testez si ça fonctionne
  13. Si ça fonctionne, replacez la liste de vos nodes dans /etc/mysql/conf.d/galera.cnf sur votre premier node (celui qui a initialisé le cluster) et supprimez "wsrep_cluster_address="gcomm://""
  14. Si vous avez l'erreur "ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded", sur tout les nodes, resetez les password admin :
    • Code : Tout sélectionner

      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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par voxdemonix le mar. oct. 03, 2017 3:53 pm, modifié 5 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » lun. août 21, 2017 1:47 pm

musique d'ambiance : Tomorrowland Belgium 2017 | W&W
testé sur : Ubuntu Minimal (odroid XU4)



Load Balancing
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.
  1. installez les pré-requis
  2. Éditez la valeur ENABLED=0 à ENABLED=1 dans les fichiers /etc/default/haproxy et /etc/init.d/haproxy
    • Code : Tout sélectionner

      sed -i "s/ENABLED=0/ENABLED=1/g" /etc/default/haproxy
      sed -i "s/ENABLED=0/ENABLED=1/g" /etc/init.d/haproxy
  3. Éditez /etc/haproxy/haproxy.cfg
    • Code : Tout sélectionner

      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, 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)
      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 ou Tor Hidden Service 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
  4. Commentez option httplog puis sauvez et quittez avec CTRL+X
  5. Sur le cluster Galera, créez l'utilisateur dédié à HaProxy
    • Code : Tout sélectionner

      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)
  6. Démarrez HaProxy


Farm Link
Modifié en dernier par voxdemonix le mar. sept. 26, 2017 6:16 pm, modifié 9 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » lun. août 21, 2017 1:47 pm

Ajouter un serveur à Galera Cluster
  1. Installez votre serveur en suivant la procédure ci-haut.
  2. 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"
  3. 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).
Modifié en dernier par voxdemonix le jeu. sept. 21, 2017 11:26 pm, modifié 1 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » lun. août 21, 2017 1:47 pm

Ouvrir le parefeu (firewall)

Pour Galera Cluster
(source)
Note : par défaut sur ubuntu le parefeu ne bloque pas. Vous n'aurez besoin de spécifier ce genre de règle que quand vous aurez restreint l'accès à vos machines.
  • Code : Tout sélectionner

    	# si on veut autoriser un node
    iptables --append INPUT --protocol tcp --source 64.57.102.34 --jump ACCEPT
    
    	# si on veut autoriser le LAN	
    iptables --append INPUT --protocol tcp --source 192.168.1.0/24 --jump ACCEPT
    
    	# si on veut autoriser le VPN
    iptables --append INPUT --protocol tcp --source 10.8.1.0/24 --jump ACCEPT
Modifié en dernier par voxdemonix le mar. août 22, 2017 3:29 pm, modifié 1 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » lun. août 21, 2017 1:48 pm

Testé avec succès avec : Nextcloud 12, ZoneMinder

Connecter un client au Cluster Galera
  1. Installez le client mysql/mariadb
    • Code : Tout sélectionner

      apt-get install -y mariadb-client
      Si vous souhaitez pouvoir 'l'utiliserdepuis php, installez le module php-mysql
  2. 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".
  3. 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.
Modifié en dernier par voxdemonix le mar. sept. 05, 2017 2:16 pm, modifié 2 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » lun. août 21, 2017 1:48 pm

Quelques commandes

Afficher des infos à propos du cluster (toutes les variables "wsrep_"). Afficher des infos à propos des utilisateurs de vos Base de Données.
  • Code : Tout sélectionner

    mysql -u root -p -e "select host, user, password from mysql.user;"
Créer un utilisateur et sa Base de Données
  • Code : Tout sélectionner

    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;"
    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
  • Code : Tout sélectionner

    mysql -uroot -p -e "UPDATE mysql.user SET Password=PASSWORD('monNouveauPASS') WHERE USER='monUSER';"
Changer Host accepté pour un utilisateur
  • Code : Tout sélectionner

    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é.
  • Code : Tout sélectionner

    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.png
Supprimer une Base de Données. Supprimer un utilisateur
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par voxdemonix le mer. sept. 13, 2017 1:18 am, modifié 8 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » lun. août 21, 2017 1:48 pm

[_chaton_]
Foire Aux Questions


Que se passe-t-il si une machine tombe en panne en cours de fonctionnement ?
  • Réponse : Avec 2 machines c'est kapout (plus rien ne fonctionne), avec 3 machines tout continue de fonctionner. (The show must go on)
Que se passe-t-il si une machine n'est pas présent lors du démarrage (des la ou les autres machines) ?
  • Réponse :
Modifié en dernier par voxdemonix le jeu. sept. 21, 2017 1:42 pm, modifié 1 fois.
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » mar. août 22, 2017 1:12 am

cat /var/lib/mysql/grastate.dat
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Avatar du membre
voxdemonix
Messages : 1237
Enregistré le : lun. févr. 02, 2015 7:28 pm

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

Message par voxdemonix » mar. août 22, 2017 1:51 am

@reboot sed -ie '/safe_to/c\safe_to_bootstarp: 1' /var/lib/mysql/grastate.dat && /etc/init.d/mysql start --wsrep-new-cluster

http://inside-out.xyz/technology/recove ... start.html
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Qui est en ligne

Utilisateurs parcourant ce forum : CommonCrawl [Bot] et 0 invité