Talend ESB: Déployer des routes maître/esclave avec ZooKeeper

La haute disponibilité est importante lorsque l’on parle d’intégration, les routes Camel qui consomment et traitent vos données doivent toujours être disponibles même en cas de crash de votre serveur applicatif Karaf. Nous allons voir comment ZooKeeper permet au travers des Route Policy de basculer dans un mode maître/esclave automatiquement.

Apache ZooKeeper

Apache ZooKeeper est un outil issu du monde bigdata notamment pour créer un cluster hadoop, il permet de gérer et centraliser la configuration pour des applications distribuées. Le service ZooKeeper est donc lui-même installé sur plusieurs machines physiques afin d’être en permanence fiable et disponible. Il est évident que virtualiser ZooKeeper même avec l’image officielle de Docker n’a d’intérêt que pour des tests.

Remarque: J’avais prévu de m’appuyer sur Docker pour la démo de ce billet mais tous les outils sont disponibles avec le package Talend ESB en libre téléchargement, elle sera simplifiée au maximum.

Fonctionnement de ZooKeeper

Avant de démarrer la démo, il faut savoir plusieurs choses importantes sur ZooKeeper

  • Il faut un nombre impair de serveurs avec un minimum de 3, afin de former un quorum pour qu’une majorité soit encore disponible et pouvoir élire un leader en cas de crash d’un seul des serveurs.

  • Le stockage des informations se fait tel un système de fichiers et de manière hiérarchique, il se trouve en mémoire pour plus de débit et une faible latence, le stockage d’informations est naturellement minime.

  • Chaque nœud est appelé Znodes pour « ZooKeeper data node » et commence par un slash (/), ces nœuds sont à la fois des fichiers et des répertoires qui contiennent des méta informations, informations qui permettront de définir si une route est lancée ou non et son mode de fonctionnement.

Route policy et élection d’un leader

La documentation concernant ZooKeeper se trouve sur cette page, le principe est simple, à chaque lancement d’une route, on va créer un flag de séquence éphémère sur le même znode, l’incrément le plus petit sera considéré comme le leader.

En ce qui concerne Camel, la configuration repose sur une politique de routage qui définit quelle route va fonctionner et laquelle va démarrer si une panne survient garantissant toujours la disponibilité de votre développement et de l’échange en cours.

Plusieurs routes identiques sont déployées et une seule est définie comme étant la route maître, en cas de problème, une autre route est élue par le quorum ZooKeeper comme maître et démarre automatiquement pour prendre le relai.

Démo

Pour la démo, je vais volontairement réduire au maximum les éléments nécessaires afin que vous puissiez facilement la reproduire sans installer 3 serveurs Zookeeper et 2 serveurs karaf 😉

Comme dit précédemment, tout est inclus dans le package d’installation de la version ESB que vous pouvez trouver sur cette page, Karaf et ZooKeepeer sont dans le répertoire Runtime_ESBSE

Lancer les commandes suivantes

Pour le serveur ZooKeeper

 TALEND_INSTALLDIR\Runtime_ESBSE\zookeeper\bin\zkServer.cmd start

Pour le serveur Karaf

 TALEND_INSTALLDIR\Runtime_ESBSE\container\bin\trun.bat

Pour le client Zookeeper

Le client va nous permettre de visualiser l’état du Znode et de voir ce que Camel va créer comme informations

 TALEND_INSTALLDIR\Runtime_ESBSE\zookeeper\bin\zkCli.cmd

La route

Lancer Talend et créer la route suivante

Voici le détail de chaque composants importants, le reste étant configuré par défaut

CConfig

 import org.apache.camel.component.zookeeper.policy.*;
ZooKeeperRoutePolicy policy = 
new ZooKeeperRoutePolicy("zookeeper:localhost:2181/zk_demo/camel", 1);

Dans la documentation de la classe ZooKeeperRoutePolicy, et que vous regardez le constructeur: ZooKeeperRoutePolicy(String uri, int enabledCount)

On peut voir le paramètre enabledCount, c’est ce paramètre qui définit le nombre de route en fonctionnement simultané., l’URI étant le chemin du Znode.

cJavaDSLProcessor

.routePolicy(policy)

Lorsque l’on démarre cette route, un WARN apparait, vous signifiant que le Znode a bien été créé, le nom est généré basé sur le nom de votre machine ainsi qu’un UUID.

Laisser la fonctionner et déployez cette route une seconde fois sur le serveur Karaf en passant par le menu contextuel, clic droit sur la route puis Build Route

Indiquer directement le répertoire deploy de Karaf

 TALEND_INSTALLDIR\Runtime_ESBSE\container\deploy

Aller sur le serveur Karaf (voir trun) et lancer la commande log:tail, un nouveau WARN devrait apparaitre vous signifiant cette fois que la route à été déployée mais doit être stoppée suite à la politique de routage mise en place.

Faisons un petit tour par le client ZooKeeper et lançons les commandes ls et stat

On remarque que deux nœuds ont été créés pour chacune des routes

La commande stat nous donne le nombre d’enfants ainsi que la version, nous pouvons maintenant tuer le job directement dans le studio.

… et constater que la route a bien démarré sur le serveur Karaf

Coté client ZooKeepeer, nous avons maintenant un seul enfant pour le nœud et une version qui s’est incrémentée

 

Conclusion

Voici un moyen plutôt simple et efficace de créer de la redondance ainsi qu’un basculement automatique de vos routes. ZooKeeper étant un outil devenu un projet à part entière et plus un sous projet de hadoop, sa réputation n’est plus à démontrer.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Petit calcul pour valider votre commentaire! merci * Time limit is exhausted. Please reload CAPTCHA.