Un R/W splitting doit prendre en compte enormement de parametres. Comment traiter un last insert id ? Comment traiter une transaction ? De plus, MySQL-proxy a un defaut dans la gestion des sessions. Je ne sais pas s'il a été corrigé mais cela avait provoqué un gros NOGO sur un gros projet pour nous.
En gros : un user U1 qui n'a le droit que d'acceder au schema A se connecte au proxy, le proxy ouvre une sessions avec l'instance et transmet l'auth du user U1 un user U2 qui n'a le droit que d'acceder au schema B se connecte au proxy, le proxy peut reutiliser la session ouverte precedemment pour U1 sauf que la requete va etre rejetée car l'auth a deja été faite par U1 et que celui-ci n'a pas acces au schema B. Deuxieme probleme. Un java hibernate se connecte et créé un pool de connexions vers mysql-proxy, mysql-proxy créé des connections vers l'instance. pour une raison ou une autre les connexions entre mysql-proxy et l'instance sont coupées. Hibernate n'est pas informée et donc ses requetes sont mortes. Ce sont deux cas rencontrés il y a plus d'un an et depuis nous avons abandonné l'idée d'utiliser Mysql-proxy. Nos clients qui font de l'usage intensif (plus de 5000hits/s) utilisent un LB au niveau du code pour determiner s'ils attaquent le master ou le slave et les slaves sont derriere un LB software genre lvs. My 2 cents. Le 26 août 2011 15:15, Gregory Duchatelet <greg-fr...@duchatelet.net> a écrit : > Le 25/08/2011 17:56, Wallace a écrit : > > Le 25/08/11 16:58, Gregory Duchatelet a écrit : > > Va falloir que je me mette au LUA ! :) > Si tu as un script qui marche, ou une version modifié de celui fournit avec > MySQL Proxy, je suis preneur ! > > Je n'ai utilisé que le script livré dans les docs de mysql proxy, pas eu > besoin d'aller plus loin pour le moment mais tes recherches m'intéressent > pour comprendre ce qui cloche dans son script. > > Je reste quand même persuadé que tu auras de meilleurs résultats avec la > première idée. Seul l'appli sait si elle a besoin de faire un read juste > après un update et c'est clairement le problème du split des requêtes. > > Notre appli utilise cette regexp pour savoir s'il faut taper sur un slave ou > pas : > > preg_match("/^([\r\n\t ]+)?(SELECT|USE|SET|CALL > (stats)?|DESCRIBE|(CREATE|DROP) TEMPORARY TABLE|\()/i", trim($query), $r); > > Avec ça l'appli n'a pas besoin de "savoir". > > Dans mon code de mon projet quand j'execute une requête sql la fonction > d'appel a une variable pour forcer > à être sur le master. Si elle est présente alors peut importe si la requête > ne comporte qu'un select elle sera quand même passer sur le master et pas > sur les slaves. Ca le mysql proxy ne le saura jamais. > Quand les devs jouent à ce genre de mise à jour puis get tu peux pas trop te > permettre d'attendre 1 ou plusieurs secondes que ca se synchronise. > > Si, dans le script LUA on peut faire ce qu'on veut ! Imagines, tu peux faire > un simple > SET forcemaster=1 > Et dans le script LUA, catcher ce SET, stocker dans une variable un peu > comme la variable is_in_transaction de ce même script, et voilà :) > > Pour info, le script LUA en question est visible ici : > http://paste.frsag.net/TAWVp > > -- > Greg > > _______________________________________________ > Liste de diffusion du FRsAG > http://www.frsag.org/ > > _______________________________________________ Liste de diffusion du FRsAG http://www.frsag.org/