En utilisant deux serveurs Debian, j'ai besoin de configurer un environnement de basculement solide pour les tâches cron qui ne peuvent être appelées que sur un serveur à la fois.
Le déplacement d'un fichier dans /etc/cron.d devrait faire l'affaire, mais existe-t-il une solution HA simple pour exécuter une telle action? Et si possible pas avec le rythme cardiaque;)
Réponses:
Je pense que le rythme cardiaque / pacemaker serait la meilleure solution, car ils peuvent prendre en charge beaucoup de conditions de course, d'escrime, etc. pour vous afin de garantir que le travail ne fonctionne que sur un hôte à la fois. Il est possible de concevoir quelque chose vous-même, mais cela ne tiendra probablement pas compte de tous les scénarios de ces packages, et vous finirez par remplacer la plupart, sinon la totalité, de la roue.
Si vous ne vous souciez pas vraiment de ces choses et que vous souhaitez une configuration plus simple. Je suggère d'échelonner les tâches cron sur les serveurs de quelques minutes. Ensuite, lorsque le travail démarre sur le primaire, il peut en quelque sorte laisser un marqueur sur la ressource partagée sur laquelle les travaux opèrent (vous ne le spécifiez pas, donc je suis intentionnellement vague). S'il s'agit d'une base de données, ils peuvent mettre à jour un champ dans une table ou si c'est sur un système de fichiers partagé verrouiller un fichier.
Lorsque le travail s'exécute sur le deuxième serveur, il peut vérifier la présence du marqueur et abandonner s'il est là.
la source
Nous utilisons deux approches en fonction des besoins. Les deux impliquent que les crons soient présents et exécutés sur toutes les machines, mais avec un peu de vérification de l'intégrité:
Si les machines sont dans une relation primaire et secondaire (il peut y avoir plus d'un secondaire), les scripts sont modifiés pour vérifier si la machine sur laquelle ils s'exécutent est un état principal. Sinon, ils sortent simplement tranquillement. Je n'ai pas de configuration HB à portée de main pour le moment mais je pense que vous pouvez interroger HB pour ces informations.
Si toutes les machines sont des primaires éligibles (comme dans un cluster), un certain verrouillage est utilisé. Au moyen d'une base de données partagée ou d'un fichier PID. Une seule machine obtient le statut de verrouillage et celles qui ne sortent pas tranquillement.
la source
Pour faire court, vous devez transformer vos scripts cron en une sorte d'applications compatibles avec les clusters. Étant donné que l'implémentation est aussi légère ou lourde que vous le souhaitez, ils ont encore besoin d'une chose - être en mesure de reprendre / redémarrer correctement l'action (ou de récupérer leur état) après le basculement du nœud principal. Le cas trivial est que ce sont des programmes sans état (ou des programmes "assez sans état"), qui peuvent être simplement redémarrés à tout moment et feront très bien l'affaire. Ce n'est probablement pas votre cas. Notez que pour les programmes sans état, vous n'avez pas besoin de basculement car vous pouvez simplement les exécuter en parallèle sur tous les nœuds.
Dans un cas normalement compliqué, vos scripts doivent se trouver sur le stockage partagé du cluster, doivent y stocker leur état dans des fichiers, ne doivent changer l'état stocké sur le disque que de manière atomique, et devraient être en mesure de poursuivre leur action à partir de tout état transitoire qu'ils détecteront au démarrage.
la source
En fait, il n'y a pas de solution satisfaisante dans ce domaine. Nous les avons tous essayés. solutions de script, cron avec rythme cardiaque / stimulateur cardiaque et plus encore. La seule solution, jusqu'à récemment, était une solution de réseau. naturellement, ce n'est pas ce que nous voulons voir, car une solution de grille est un peu plus que excessive pour le scénario.
C'est pourquoi j'ai commencé le projet CronBalancer. fonctionne exactement comme un serveur cron normal, sauf qu'il est distribué, à charge équilibrée et HA (une fois terminé). Actuellement, les 2 premiers points sont terminés (bêta) et fonctionne avec un fichier crontab standard.
le cadre HA est en place. il ne reste que la signalisation nécessaire pour déterminer les actions de basculement et de récupération.
http://sourceforge.net/projects/cronbalancer/
mandrin
la source
J'avais utilisé le gestionnaire d'événements Nagios comme une solution simple.
Sur le serveur NRPE:
N'oubliez pas d'ajouter l'
nagios
utilisateur au groupe sudoers:et désactiver
requiretty
:Sur le serveur Nagios:
services.cfg
commandes.cfg
autostart_crond.sh
mais j'ai changé pour utiliser Pacemaker et Corosync car c'est la meilleure solution pour s'assurer que la ressource ne s'exécute que sur un nœud à la fois.
Voici les étapes que j'ai faites:
Vérifiez que le script crond init est compatible LSB . Sur mon CentOS, je dois changer le statut de sortie de 1 à 0 (si démarrer une course ou arrêter une arrêtée) pour correspondre aux exigences:
il peut ensuite être ajouté au stimulateur cardiaque en utilisant:
crm configure show
statut GRC
Test du basculement en arrêtant Pacemaker et Corosync sur 3.145:
puis vérifiez l'état du cluster sur le 2.93:
la source
Le faire exécuter / ne pas exécuter sur une machine particulière est trivial. Soit un script place un travail cron dans /etc/cron.d, comme vous le suggérez, soit un script permanent dans /etc/cron.d, mais laissez le script lui-même effectuer la vérification de basculement et décider s'il doit s'exécuter.
La partie commune (manquante) dans ces deux cas est la façon dont le script vérifie si le script sur l'autre machine est en cours d'exécution.
Sans plus d'informations sur ce que vous essayez de faire, il est difficile de répondre.
la source
Je préfère Rcron pour ce problème particulier. Vous avez un fichier d'état, qui dit simplement "actif" ou "passif", et s'il est actif, votre cron s'exécutera sur une certaine machine. Si le fichier d'état est défini sur passif, il ne s'exécutera pas. Aussi simple que cela.
Maintenant, vous pouvez utiliser RedHat Cluster Suite ou tout autre middleware de clustering pour gérer les fichiers d'état sur votre cluster, ou vous pouvez définir manuellement actif sur un certain nœud et c'est tout.
la source