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):

optionsvaleur
clone-maxle 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-maxle 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.
notifypré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-uniqueest-ce que les clones ont un fonctionnement différent ? true/[false]
orderedest-ce qu’il faut démarrer les clones en série (true) ou en parallèle [false].
interleavepermet 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é.

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 : curl -s