Load balancing sous Ubuntu

Résolu
Bonjour,
Je viens de configurer mes serveur avec MySQL cluster et c'est fonctionnel. Par contre la je bloque sur comment installer Heartbeat et comment faire la répartition des charges...
En bref, avec Heatbeat je veux créer un IP virtuelle qui pourra me permettre de faire la répartition des charges vers mes 2 serveurs MySQL.. Ça fait déjà quelques jours que j'essaie des tutoriels et recherche sur internet comment faire... Je ne trouve pas beaucoup d'information là dessus pour Ubuntu...

Quelqu'un pourrait m'aider ou m'indiquer de bon tutoriels ?

5 réponses

  1. Modérateur
    Pour la répartition de charge, personnellement j'utilisais dans ma jeunesse mysql-proxy et ça marchait plutôt pas mal. Dans mon cas j'avais 1 serveur maître et n serveurs esclaves. Le serveur maître servait principalement à gérer les opérations en écriture (insert, update...) et les esclaves les requêtes en lecture (select ...).

    L'idée c'est que le(s) client(s) se connectent au proxy comme si c'était une base, et en fonction de la nature de la requête (par exemple en lecture ou en écriture quand tu utilises le script rw-splitting.lua), tu peux envoyer la requête vers le serveur maître ou un de ses esclaves.

    Cet article explique ce qu'il faut faire
    http://www.dsivolant.com/articles/2010/07/22/configurer-mysql-proxy/

    En gros tu installes mysql-proxy sur la machine qui va héberger le proxy (ce peut être une machine hébergeant un esclave, le maître ou une autre, c'est toi qui voit, il faut juste que tes clients s'y connectent) :

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install mysql-proxy


    Ensuite tu configures /etc/default/mysql-proxy comme indiqué dans le lien et en veillant à ne pas utiliser le même port que ton serveur mysql s'il y en un sur cette machine. Tu peux vérifier le port en regardant dans /etc/mysql/my.cnf (par défaut 3306, si tu le corriges pense à relancer mysql) et avec la commande suivante si mysql tourne :

    sudo netstat -ntlp


    Dans /etc/default/mysql-proxy tu références notamment les IPs/ports du maître et du (des) esclave(s). Enfin il faut lancer mysql-proxy :

    sudo service mysql-proxy restart


    ... et vérifier qu'il écoute bien sur le port configuré dans /etc/default/mysql-proxy :

    sudo netstat -ntlp


    Enfin il ne reste plus qu'à faire un test en te connectant à ton proxy avec une commande du genre :

    mysql -u root -p -h ip_du_proxy -P port_du_proxy


    Bonne chance
    1. Merci, mais présentement je suis encore à configurer l'IP virtuelle... j'ai suivi ce tuto: http://blogs.dixcart.com/public/technology/2011/01/load-balancing-and-failover-for-replicated-mysql.html et jusqu'à présent c'est la première fois que je réussi a faire fonctionner heartbeat sans erreurs... là ou ça coince c'est dans la configuration de pacepaker...

      Voici la configuration de heartbeat qui fonctionne correctement:

      fichier /etc/heartbeat/ha.cf
      autojoin none 
      logfacility daemon 
      keepalive 2 
      deadtime 15 
      warntime 5 
      initdead 120 
      ucast eth1 192.168.0.201 
      node r415-2 
      node r415-3 
      use_logd yes 
      crm respawn 
      


      fichier /etc/heartbeat/haresources
      r415-2 IPaddr:192.168.0.111/24/eth1


      fichier /etc/heartbeat/authkeys
      1 sha1 heartbeatpassok 
      


      Mon IP virtuelle voulu etant 192.168.0.111 et le host du serveur étant r415-2 et j'utilise la carte réseau eth1:
      primitive shared_ip_one IPaddr params ip=192.168.0.111 cidr_netmask="255.255.255.0" nic="eth1" 
      property stonith-enabled="false" 
      location share_ip_one_master shared_ip_one 100: r415-2 
      

      Ça me fait une erreur lorsque je valide la dernière ligne ci-dessous:
      WARNING: share_ip_one_master: referenced node r415-2 does not exist


      une idée là dessus ?
      d'ailleurs je me demande aussi si faut absolument avoir pacemaker avec heartbeat pour créer l'IP virtuelle.... d'après ce que je comprend ensuite on fait la répartition des charger avec mysql-proxy ou haproxy... je suis un peut perdu là...
      1. Modérateur
        Par IP virtuelle je suppose que tu veux parler plutôt d'IP locale ? Ou tu parles d'une IP associée à une interface virtuelle ?

        Dans ton cas je pense que r415-2 doit désigner un hostname qui peut être résolu par DNS ou /etc/hosts, est-ce le cas ?

        nslookup r415-2


        Quel est le résultat des commandess "uname -a" sur les deux machines ?

        Bon sinon là tu pars sur une approche différente de celle dont j'ai parlé (et que je n'ai jamais testé) donc je ne sais pas si je pourrai vraiment t'aider, je découvre en même temps que je lis ton article :p
        1. Il s'agit d'un IP virtuelle localement... Si je fait un ping en local vers le hostname ça fonctionne bien. Malgré l'erreur ça fonctionne tout de même. Il me reste plus que la partie de la répartition des charges avec MySQL proxy... Merci pour les infos!
      2. Peut-être qu'on peut m'aider sur cela:
        Je bloque sur la configuration de haproxy...

        192.168.0.111 est mon IP virtuelle qui est ouvert sur le port 3306 pour mysql

        J'essaye de configurer haproxy pour la répartition des charges:
        Lorsque je le redémarre voila le message qui apparait:

        root@r415-2:/etc/haproxy# /etc/init.d/haproxy restart
         * Restarting haproxy haproxy                                                   [WARNING] 093/131348 (26457) : config : 'option httplog' not usable with proxy 'mysql' (needs 'mode http'). Falling back to 'option tcplog'.
        [ALERT] 093/131348 (26457) : Starting proxy mysql: cannot bind socket
        


        Mon fichier de configuration /etc/haproxy/haproxy.cfg:

        # this config needs haproxy-1.1.28 or haproxy-1.2.1
        
        global
                log 127.0.0.1   local0
                log 127.0.0.1   local1 notice
                #log loghost    local0 info
                maxconn 4096
                #chroot /usr/share/haproxy
                user haproxy
                group haproxy
                daemon
                #debug
                #quiet
        
        defaults
                log     global
                mode    http
                option  httplog
                option  dontlognull
                retries 3
                option redispatch
                maxconn 2000
                contimeout      5000
                clitimeout      50000
                srvtimeout      50000
        
        listen mysql 192.168.0.111:3306
        mode tcp
        balance roundrobin
        
        server r415-2 192.168.0.200:3306 check
        server r415-3 192.168.0.201:3306 check
        


        J'aimerais avoir votre avis sur l'erreur ou comment le résoudre, merci!
        1. Modérateur
          [WARNING] 093/131348 (26457) : config : 'option httplog' not usable with proxy 'mysql' (needs 'mode http'). Falling back to 'option tcplog'.


          Vu le message, j'ai l'impression que tu as une option (httplog) dans ta configuration qui ne marche pas, et où il devrait plutôt y avoir http (cf ligne option)

          [ALERT] 093/131348 (26457) : Starting proxy mysql: cannot bind socket


          Pour moi ton proxy mysql écoute sur le port 3306 (pour ne pas avoir à modifier le port sur lequel les clients se connectent). As-tu vérifier (1) que ton proxy mysql était installé (2) était lancé (3) écoutait sur le port 3306 ?

          Du coup, si tu as un proxy mysql il faut corriger le port sur lequel le serveur mysql présent sur cette machine (s'il y en a un) écoute sur un autre port. Mais bon, j'ai l'impression que chez toi il s'agit de 3 machines différentes (192.168.0.111, 192.168.0.200, et 192.168.0.201) ? En tout cas, si sur la machine sur laquelle tu mets le proxy il y a déjà un serveur mysql, veille à ce que ce dernier écoute sur le port 3307 (en corrigeant au besoin /etc/mysql/my.cnf) et relance ce serveur mysql :

          service mysql restart


          Ensuite pour revenir à ton erreur, tu références dans ton fichier 3 couples (ip, port). Vu que la connexion échoue vers l'un des 3 (je dirais 192.168.0.111 au feeling), tu devrais tester depuis la machine sur laquelle tu configures /etc/haproxy/haproxy.cfg si tu parviens à te connecter avec un client mysql vers chacun de ces 3 serveurs (ou proxies) :

          mysql -u root -p -h 192.168.0.111 -P 3306
          mysql -u root -p -h 192.168.0.200 -P 3306
          mysql -u root -p -h 192.168.0.201 -P 3306


          Bonne chance
          1. Oui la connexion se fait sur les trois ip. 192.168.0.111 c'est l'IP (geré par heatbeat et pacemaker) virtuelle qui redirige vers les deux machines réelle soit 192.168.0.200 et 192.168.0.201

            Il me restait juste la répartition des charges en se connectant sur l'IP virtuelle... Pour suivre la logique du tutoriel j'ai installer haproxy (j'avais essayer mysql-proxy mais je l'ai enlever avec un apt-get remove mysql-proxy)

            Pour l'erreur de http c'est réglé en commentant les options qui causait problème mais là reste le problème de port apparemment...

            Si faut changer un port je préfèrais changer le port de haproxy, d'ailleurs je sais pas quel port il utilise...
          2. Si je change la ligne pour
            listen mysql 192.168.0.111:3307
            ça passe et ça ouvre le port :
            Port Scanning host: 192.168.0.111 
              Open TCP Port:  3306     mysql 
              Open TCP Port:  3307     opsession-prxy 
            


            Mais on but c'est de pouvoir me connecter avec ce même ip (virtuelle) sur mysql avec un robin hood donc le but de haproxy... mais apparemment je comprend pas comment bien le configurer... et comment fonctionne exactement haproxy...
          3. Je ne suis pas sûr de ce que je doit mettre après le mot listen ... je crois que c'est le nom du service qui est ouvert sur l'ipvirtuelle que je spécifie... Une idée la dessus ?

            Si je met listen mysql 192.168.0.111:3307
            lorsque je tente de me connecter a mysql ça me dit:
            Host '192.168.0.200' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
            

            J'ai essayer la commande indiqué mais sans succès.
          4. Modérateur
            Aucune, jamais utilisé :-) Comme je t'ai dit, il faut déjà commencer par voir si tu arrives à ta connecter à tes différents serveur avec un bon vieux client mysql.
          5. Mon IP virtuelle était en conflit avec l'ip de la machine... J'ai résolue le problème installant le répartiteur de charge (haproxy) sur le serveur maître...