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 :
(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 :
Merci pour votre aide !
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 :
- Dans le fichier configuration.php j'ai mis :
Code PHP:public $host = 'mariadb-server1,mariadb-server2,mariadb-server3';
- 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 !
Commentaire