Salut Grégory,
Clairement l'idéal c'est de le gérer au niveau du code, l'applicatif est mieux placé pour savoir si il fait des modifications suivi d'un read (qui devrait être que sur le master dans ce cas là) par ex.
Mysql proxy permet quand même de palier les applicatifs non prévus pour mais effectivement le script rw split n'est pas parfait. Néanmoins il s'utilise en production, j'ai vu pas mal de personne l'utiliser que ca soit sur des petites structures ou des plus grosses, du coup je le met en place aussi lorsqu'un client a du code qui ne gère pas le split de son côté.
A mon sens voilà les deux solutions qui se présentent à toi dans l'ordre de simplicité et temps passé :
- améliorer ton mécanisme actuel en mettant la liste des serveurs et leur poids dans un fichier de configuration. Normalement tes fichiers de configurations sont propres à chaque environnement (prod / preprod / dev) et c'est uniquement les sys adm qui y ont accès, les fichiers ne devraient pas se trouver dans le repository. Ainsi pour effectuer une maintenance tu n'as qu'à changer le poids et le mettre null ou une variable off au choix. Pour le remettre en activité, il suffirait d'un poids faible que tu changes au fur et à mesure. C'est à mon sens le plus simple.
- améliorer le rw split ou en écrire un autre. Je n'ai pas eu l'occasion et le temps de me pencher sur ce point vu que les requêtes en lecture qui passent sur le master n'étaient pas gênantes pour les différentes plateformes que j'ai rencontré et que il y a avait pas mal de lecture déléguée aux slaves. Après à voir le temps nécessaire pour appréhender les mécanismes des scripts lua disponibles et le langage lua.
A bientôt
Pierre-Henry Muller
Le 25/08/11 11:54, Gregory Duchatelet a écrit :
Bonjour,
actuellement nous gérons la répartition de charge sur les serveurs MySQL en PHP, avec un preg_match sur la requête pour l'envoyer soit sur le master, soit sur un slave pondéré.
Ca fonctionne bien, et le random sur la pondération répartit la charge équitablement.
Mais quand je dois intervenir sur un serveur, je dois travailler avec les développeurs pour supprimer temporairement un slave, puis l'ajouter petit à petit lorsque j'ai terminé, le temps qu'il charge ses index en mémoire...
J'aimerais gérer cette répartition de A à Z, et que ce soit fait plus élégamment qu'un preg_match + random dans un tableau PHP ... C'est là qu'intervient MySQL Proxy : avec son script rw-splitting.lua il est sensé gérer tout ça.
Mais ce script est loin d'être complet, en plus je constate que la majorité des requêtes de lecture (SELECT) vont sur le master... Sur son site http://forge.mysql.com/wiki/MySQL_Proxy_RW_Splitting Jan précise bien que /Yes, we know that RW-Splitting is not for production use yet, it is a Proof of Concept./
Malgré tout j'aime l'idée, donc je me demandais si je pouvais avoir des retours d'expériences sur MySQL Proxy et particulièrement sur ce script lua !
Et si non, si vous connaissiez un système qui analyse les requêtes et load-balance sur les slaves et le master de manière automatique. Il faudrait que les développeurs n'aient qu'une IP par database et ce système se charge du reste. -- Greg
Liste de diffusion du FRsAG http://www.frsag.org/