Si vous aviez une tâche que vous ne vouliez exécuter qu'une seule fois sur un cluster de serveurs, à intervalles réguliers quelle serait la meilleure façon d'y parvenir? La définition de cluster dans ce cas est de 2 serveurs identiques ou plus avec des sessions distribuées situées derrière un équilibreur de charge.
Cas d'utilisation: vous avez une tâche coûteuse à exécuter qui ne doit être exécutée qu'une fois toutes les X heures. Ce travail pourrait par exemple parcourir un tas d'enregistrements et mettre à jour leur statut.
- Le pire scénario est que l'exécution du travail à deux reprises invalide vos données.
- Dans le meilleur des cas, le travail utilise des ressources sur tous vos serveurs.
Résumé des exigences:
- Le travail doit toujours s'exécuter même si l'un des nœuds est en panne.
- Le travail ne doit être exécuté qu'une seule fois par planification.
- Si plusieurs travaux sont planifiés en même temps ou à des heures qui se chevauchent, le nombre de travaux en cours d'exécution est réparti également entre les serveurs.
- Les machines doivent avoir la même base de code et être synchronisées via NTP.
- La configuration peut différer d'un nœud à l'autre, selon les variables d'environnement.
- Le travail doit commencer à l'heure ou dans un intervalle donné de l'heure assignée. (disons 5 minutes par exemple)
Solutions possibles
- Définissez un nœud comme nœud maître, cela ne fonctionne pas car il viole 1 ci-dessus.
- Demandez à l'équilibreur de charge d'équilibrer le démarrage du travail. Malheureusement, cela a pour effet secondaire que si plusieurs tâches s'exécutent en même temps, elles peuvent toutes être exécutées par la même machine.
Cela devrait s'exécuter en Java, dans un conteneur de servlet. Cependant, il ne code pas les emplois que je recherche.
C'est sûrement un problème résolu avec la meilleure solution connue.
Question connexe. /programming/5949038/schedule-job-executes-twice-on-cluster
Ce n'est pas un doublon car la solution est insuffisante selon ces 5 exigences données ci-dessus. La solution la plus votée souffre d'un problème de race et la deuxième solution viole l'exigence 3