déclarer plusieurs bases de données mariadb (cluster galera)

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • déclarer plusieurs bases de données mariadb (cluster galera)

    Bonjour,
    J'ai un joomla 5 (fraichement mis à jour depuis la version 3) qui se base sur une base de données mariadb.
    Cette même base est en fait un cluster galera (https://mariadb.com/kb/en/galera-cluster/)

    J'ai donc plusieurs noeuds qui contiennent exactement les mêmes data, synchronisées en temps réel.

    Mon problème : il peut m'arriver d'éteindre un des noeuds du cluster pour maintenance (patches/mises à jour, etc), ou de le perdre de façon non prévue (panne).
    je voudrais pouvoir indiquer à Joomla tous les noeuds du cluster pour qu'il puisse les essayer un par un jusqu'à ce qu'il y en ait un qui répondre.

    J'ai réussi, mais en modifiant le core de Joomla, et je n'aime pas trop ça, parce que je vais perdre mes modifs à la prochaine mise à jour.

    Pour info, voici comment je m'y suis pris :
    1. Dans le fichier configuration.php j'ai mis :
      Code PHP:
      public $host 'mariadb-server1,mariadb-server2,mariadb-server3'
    2. Puis dans le fichier libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php, à la ligne 244 :
      Code PHP:
              elseif(preg_match('/,/',$this->options['host'])) {
                  
      $hosts explode(',',$this->options['host']);
                  for(
      $i=0;$i<count($hosts);$i++) {
                      if(
      $this->healthCheck($hosts[$i],$port,/*initialWaitInSeconds*/ 0/* intervalWaitInSeconds */ 0.5/* timeoutInSeconds */ 1/* retries */ 3)) {
                          
      $this->options['host'] = $hosts[$i];
                          break;
                      }
                  }
              }
      ​ 

    (en gros, je regarde si j'ai une virgule dans le champ host, et si oui, je boucle sur chaque élément entre les virgules, et je test avec la méthode healthCheck fournie par la classe)
    on pourrait peut-être améliorer en gérant les ports ou autre, mais je voulais garder ça simple.

    Donc... ça marche en l'état, mais ma modification peut sauter à n'importe quelle mise à jour, et à ce moment là le site ne marchera plus du tout puisque le joomla par défaut ne comprendra pas ma syntaxe de host avec des virgules.

    Donc... est ce qu'il y a un moyen propre (et pas trop complexe) de gérer ça ?


    Je précise :
    • Je ne peux pas utiliser un load-balancer type HAProxy (ce n'est pas proposé dans ma structure).
    • Je n'ai pas trouvé de moyen de faire un "override" de ce fichier, comme on peut le faire avec un template. Je ne pense pas que ça soit prévu (et c'est probablement mieux comme ça)
    • J'accepte le délai de connection entre chaque host. Perdre mon serveur de base est une situation exceptionnelle.
    • Pour l'instant, je gère le cas avec un script une crontab qui tourne toutes les minutes, pour voir quel noeud du cluster est disponible, et met le fichier configuration.php à jour en fonction des réultats. Ca fonctionne mais j'aimerais éviter ma crontab...

    Merci pour votre aide !
    Dernière édition par nabbo à 28/08/2024, 15h25

  • #2
    Salut
    Je t'avoue que ton pb m'a intrigué.
    J'ai reflechi dessus toute l'apres midi et voici les conclusions de mes 3h de reflexions.

    1. J'ai elimine tout plugin composant, module, car pour pouvoir s'en servir, il faut avoir acces a la base de données.
    La solution pour moi se fait neanmoins dans un fichier en dur.
    2. Tu veux que ta solution soit update proof, du coup, les fichiers de joomla ne doivent pas etre touchés.
    3. Le temps du test t'importe peu.

    Voici ce que j'en conclu.
    Il me faut 4 fichiers de configurations.
    configuration.php ( celui de joomla)
    configuration1.php => il est egal a configuration.php a la connexion host pret.
    configuration2.php
    configuration3.php


    Je cree une fonction testBaseDeDonnee qui aura pour role de tester le serveur.
    1er role. Test de l'efficacite de la configuration.php
    Si le serveur repond, arret du traitement.
    Sinon, on teste le serveur1, Si il repond, on copie configuration1.php sur configuration.php et on recharge la page.
    Sinon on teste le serveur2
    Sinon on teste le serveur 3

    Pour moi, le seul fichier capable de faire ca est le fichier index.php de ton template.

    Voila ce qui est ressorti. Maintenant, je n'ai pas testé et je ne peux pas te dire si ca peut marcher. Mais c'est la piste que j'explorerai avec les conditions mis au dessus.

    ++
    Wis

    Commentaire


    • #3
      Hello

      merci pour ta réponse. Mais je ne pense pas que ça marchera, parce que si la base est pas disponible, le index.php du template ne sera pas appelé. Ca plantera avant (puisqu'il a besoin de se connecter à la base notamment pour savoir quel template utiliser).

      Je me demande s'il n'y a pas la possibilité d'écrire un plugin pour ça. mais Ca dépasse un peu mes capacités... quoi qu'avec un bon tuto...

      Commentaire


      • #4
        tu as raison pour l'index du template.

        Du coup, tu prends l'index.php de la racine, lui il repondra et tu rajoutes
        require_once dirname(__FILE__) . '/includes/choixServeur.php';
        Et tu mets la fonction dans ce fichier.
        Du coup, en cas de mise a jour, tu n'auras qu'a rajouté cette ligne.




        Commentaire


        • #5
          oui mais du coup on en revient à la problématique de départ... je touche au core de Joomla, et donc je suis susceptible de perdre les modifs à la moindre mise à jour. Ca revient à ce que j'avais pensé au départ, sauf que c'est peut-être plus simple d'identifier le fichier index.php que libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php ... mais ça reste bancal comme solution, je trouve

          En attendant je regardais un peu le système de plugins. mais apparemment les plugins se basent sur des events émis par Joomla. et j'ai pas l'impression qu'il y ait d'event dans la connexion à la base (ou avant).
          (Je me base sur la liste ici : https://docs.joomla.org/Plugin/Events)

          Commentaire


          • #6
            Bonjour,

            Une idée comme une autre : gérer l'ordre d'ouverture des fichiers pour passer d'abord sur celui de test avant de passer à index.php de Joomla!, possible ?
            "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
            MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

            Commentaire

            Annonce

            Réduire
            Aucune annonce pour le moment.

            Partenaire de l'association

            Réduire

            Hébergeur Web PlanetHoster
            Travaille ...
            X