Bonjour,

Pour la répartition de charge sur MySQL, nous sommes partis sur plusieurs choses :

Côté applicatif, séparation des requêtes lecture / écriture au niveau de notre framework de connexion à la base de données avec deux handlers, un pour les écritures et un pour les lectures.

Côté infrastructure :
- Un master avec une VIP de réplication, du heartbeat et un script de bascule de la réplication en cas de crash du master.
- Un load balancer avec une VIP pour la lecture, avec heartbeat + haproxy
* des slaves derrière le haproxy
* un script qui check le seconds_behind_master du show slave status et retire les slaves de la grappe en cas de seconds_behind_master > 0
* le master en backup si aucun slave n'est disponible

Comme nous sommes tributaires d'un délai de réplication de l'ordre de la seconde, nous gérons en plus les retards de réplication au niveau applicatif quand celui-ci tente d'accéder à un objet qui n'existe pas encore sur le slave, en postposant la requête d'une seconde.

Hope it helps

Le 9 sept. 2013 à 15:10, Thomas Pedoussaut <thomas@pedoussaut.com> a écrit :

Pour la partie repartition de charge entre les slaves, j'utilise depuis des années (2006) du LVS géré par keepalived.

En particulier une partie intéressante:
        MISC_CHECK {                # MISC healthchecker
            misc_path <STRING>|<QUOTED-STRING>    # External system script or program
            misc_timeout <INTEGER>        # Script execution timeout

            # If set, exit code from healthchecker is used
            # to dynamically adjust the weight as follows:
            #   exit status 0: svc check success, weight
            #     unchanged.
            #   exit status 1: svc check failed.
            #   exit status 2-255: svc check success, weight
            #     changed to 2 less than exit status.
            #   (for example: exit status of 255 would set
            #     weight to 253)
            misc_dynamic

Donc en jouant bien sur ton script de monitoring, tu peux ejecter les serveurs trop en retard, et alterer le poids de chaque serveur en fonction de la charge.

En faisant du lvs-dr ca depotte pas mal, meme avec une dizaine de slaves, sans SPOF.


On 2013-09-09 09:45, Greg wrote:
Bonjour,

pour l'instant je n'ai pas trouvé mieux qu'une gestion coté applicatif pour répartir les requêtes de lecture (SELECT...) sur les slaves MySQL, et les requêtes d'écritures sur le master, avec gestion un peu plus intelligente qu'un simple load-balancer :
- regex sur la requête pour pouvoir l'orienter
- gestion des slaves down, spares
- exclusion des slaves ayant trop de délais de réplication

Pour tout ça MySQL Proxy semblait tout faire sur le papier, à l'aide de scripts LUA : http://dev.mysql.com/doc/relnotes/mysql-proxy/en/index.html

Avez vous des retours sur cet outil ? Où sur d'autres outils ?

Greg


_______________________________________________
Liste de diffusion du FRsAG
http://www.frsag.org/

_______________________________________________
Liste de diffusion du FRsAG
http://www.frsag.org/

-- 
Frédéric de Villamil / @fdevillamil
I'm not strange, weird, off, nor crazy, my reality is just different from yours.
Le Rayon UX – http://t37.net