Cluster Pacemaker Apache actif/actif avec partage de charge simple



  • Dans un article précédent, je vous ai présenté un cluster Apache en actif/passif. Nous allons voir ici comment le transformer rapidement en actif/actif avec un partage de charge simple. Je ne vais pas refaire tous les rappels de l’article précédent : si vous arrivez directement sur cet article et que vous souhaitez en savoir plus sur la configuration qui sera présentée dans cet article (ou sur le stonith, le quorum…), jetez un oeil à l’article Cluster Pacemaker Apache actif/passif.

    La configuration de base

    Je reprends pour les besoins de cet article cette configuration :

    property no-quorum-policy="ignore"
    property stonith-enabled="false"
    property default-resource-stickiness="10"
    
    primitive VIP1 ocf:heartbeat:IPaddr2 \
        params ip="192.168.0.10" broadcast="192.168.0.255" \
        nic="eth1" cidr_netmask="24" iflabel="VIP1" \
        op monitor interval="30s" timeout="20s"
    
    primitive APACHE ocf:heartbeat:apache \
        params configfile="/etc/apache2/apache2.conf" \
        op monitor interval="30s" timeout="20s" \
        op start interval="0" timeout="40s" \
        op stop interval="0" timeout="60s"
    

    On obtient quelque chose comme :

    ============
    Last updated: Thu Nov 17 20:28:22 2011
    Stack: openais
    Current DC: ha-test1 - partition with quorum
    Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
    2 Nodes configured, 2 expected votes
    2 Resources configured.
    ============
    
    Online: [ ha-test2 ha-test1 ]
    
    VIP1    (ocf::heartbeat:IPaddr2):       Started ha-test2
    APACHE  (ocf::heartbeat:apache):        Started ha-test1
    

    Apache en mode actif/actif

    On va maintenant passer Apache en mode actif/actif : Apache sera démarré, supervisé sur tous les noeuds qui composent le clusteur. Pour passer une ressource en mode actif/actif, c’est très simple : il faut utiliser la fonction “clone”. Il y a 3 types de clones :

    • Le clone “Anonymous” : des ressources identiques sur chaque noeud, c’est le clone classique que je vais utiliser ici. La ressource fonctionnera de façon identique sur chaque noeud. Si un noeud est indisponible, il n’y a pas de bascule de cette ressource puisqu’elle est déjà fonctionnelle et identique sur l’autre noeud. Dans ce fonctionnement, il n’y aura donc qu’un clone “actif” par noeud.
    • Le clone avec l’option “globally-unique=true” : contrairement au cas précédent, les ressources ne sont pas identiques d’un noeud à l’autre. Elles peuvent par exemple, avoir des données différentes. Dans ce cas, on peut avoir plus d’un clone par noeud : s’il y a une bascule, la ressource clonée sera alors reprise par un autre noeud.
    • Le “multi-state” : c’est une ressource qui peut être dans 2 états différents : “master” ou “slave”. J’y reviendrais dans un prochain article.

    Pour transformer notre Apache actif/passif en actif/actif, on clone la ressource APACHE :

    clone cAPACHE APACHE
    

    La syntaxe est : clone identifiant ressource. On obtient :

    ============
    Last updated: Thu Nov 17 20:36:31 2011
    Stack: openais
    Current DC: ha-test1 - partition with quorum
    Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
    2 Nodes configured, 2 expected votes
    2 Resources configured.
    ============
    
    Online: [ ha-test2 ha-test1 ]
    
    VIP1    (ocf::heartbeat:IPaddr2):       Started ha-test2
     Clone Set: cAPACHE
         Started: [ ha-test1 ha-test2 ]
    

    On voit que la ressource Apache est démarrée sur les deux noeuds : ha-test1 et ha-test2. Clone peut avoir les options suivantes (options par défaut entre “[ ]” pour la version 1.0.9):

    options valeur
    clone-max le nombre de copies de votre ressource. Par défaut, il y a autant de copies que de noeuds dans votre cluster. Dans mon exemple, clone-max est à 2.
    clone-node-max le nombre de copies qui peuvent être démarrées sur un seul noeud. Dans le cas d’un clone “Anonymous”, cette valeur vaut automatiquement 1. Si vous utilisez un clone avec “globally-unique=true”, vous pouvez avoir une valeur supérieure à 1.
    notify prévenir les autres noeuds des actions en cours sur le clone de la ressource. Cela permet d’interagir avec des scripts OCF en fonction de l’état du clone. [true]/false.
    globally-unique est-ce que les clones ont un fonctionnement différent ? true/[false]
    ordered est-ce qu’il faut démarrer les clones en série (true) ou en parallèle [false].
    interleave permet de changer le comportement de l’ordre de démarrage des ressources. Si vous demandez à une ressource A de démarrer après votre clone B, la ressource A démarrera sur votre noeud quand tous les clones seront lancés avec [false] ou sans attendre les autres clones avec true.

    La VIP

    Il est également possible de cloner la VIP grâce à iptables et à la cible CLUSTERIP. Cela permet de créer un ensemble de serveurs qui vont répondre à la même adresse IP/MAC : chaque serveur recevra alors le paquet mais seul l’un d’entre eux y répondra. C’est une solution très simple et rapide pour faire un partage de charge basique. Ce partage de charge à trois algorithmes différents :

    • sourceip : les clients ayant la même IP source seront toujours envoyés sur le même serveur. C’est utile quand il est important de garder une session.
    • sourceip-sourceport : le partage sur les noeuds se fait en fonction du couple IP source, port source. Le partage est donc un peu plus équitable. Les sessions ne sont plus conservées.
    • sourceip-sourceport-destport : rajoute à l’algorithme précédent le port destination. Cela permet un partage de charge différent en fonction du service utilisé.

    Le clonage de VIP n’est pas une solution que je vous recommande dans un contexte de production. Cette solution est proposée ici pour vous présenter ce qu’il est possible de faire avec pacemaker. Le multicast MAC n’est généralement pas aimé des routeurs. Pour un partage de charge performant : HAProxy.

    Pour cloner la VIP : (l’algorithme par défaut est sourceip-sourceport si vous ne spécifiez rien) :

    clone cVIP VIP1
    

    Pour changer l’algorithme :

    clone cVIP VIP1 meta clusterip_hash="sourceip"
    

    On obtient :

    ============
    Last updated: Thu Nov 17 20:45:03 2011
    Stack: openais
    Current DC: ha-test1 - partition with quorum
    Version: 1.0.9-74392a28b7f31d7ddc86689598bd23114f58978b
    2 Nodes configured, 2 expected votes
    2 Resources configured.
    ============
    
    Online: [ ha-test2 ha-test1 ]
    
     Clone Set: cAPACHE
         Started: [ ha-test1 ha-test2 ]
     Clone Set: cVIP
         Started: [ ha-test2 ha-test1 ]
    

    Chaque Apache sert une page basique sur laquelle il affiche son hostname. On vérifie que le partage de charge fonctionne correctement :

    0_1522745516531_curl.gif

    Si vous rencontrez un problème quand vous clonez votre VIP (une erreur sur le “monitor”), testez cette version du script IPaddr2. Le problème vient du motif pour valider que l’adresse mac utilisée est correcte. Il sera corrigé dans une future version de pacemaker. J’ai trouvé dans la mailing-list la future version du script sur lequel j’ai récupéré le nouveau motif. A suivre… Bons tests !