2017-04-07 4 views
0

Actuellement, j'ai une application fonctionnant sur un serveur. Il y a un crontab mis en place donc selon des règles spécifiées, il y a des tâches qui sont exécutées à certains moments.Quelle est la meilleure approche pour planifier des tâches sur un cluster docker?

Maintenant, je pense à migrer mon application dans le conteneur docker pour pouvoir exécuter plusieurs instances de mon application de manière indépendante. La chose que je me demande comment faire est Comment planifier des tâches sur plusieurs conteneurs docker. Disons que j'ai une commande php qui récupère toutes les heures de nouvelles données d'une application tierce via l'API. Actuellement, j'utiliserais un cron pour le programmer comme ceci: 0 */1 * * * php /some/path/index.php mycommand. Il peut y avoir plusieurs commandes similaires lancées à différentes fréquences.

Je ne peux pas simplement placer crontab dans mon image de docker que la commande serait lancée 5 fois quand il y a 5 conteneurs en cours d'exécution. Je veux le lancer seulement une fois de façon indépendante sur le nombre de conteneurs en cours d'exécution.

Quelle serait la solution idéale pour y parvenir?

Répondre

2

Vous pouvez utiliser un mécanisme de verrouillage, en utilisant quelque chose comme redis. Fondamentalement, cela fonctionnerait comme ça. Le script se réveille, la première chose à faire est d'essayer et d'obtenir le verrou. S'il obtient le verrou, alors il avance, si quelque chose d'autre a le verrou, puis quitte. Faites ce que le script fait, puis relâchez le verrou.

Puisqu'un seul script peut obtenir le verrou à la fois, il ne permettra que l'exécution du script une seule fois.

Il est important de retirer le verrou une fois le script terminé et d'ajouter également un TTL au verrou de sorte que si le script meurt avant de libérer le verrou, le verrou s'ouvrira automatiquement après l'expiration de la durée de vie.

Voici quelques documents sur l'utilisation de Redis en tant que verrou distribué.

+0

Je suppose que consul sera candidat idéal pour ce scénario. –

+0

Merci pour la solution, surtout pour avoir suggéré comment l'atteindre avec Redis! @ f-society Pourquoi pensez-vous que le consul est idéal? – simPod

1

Une stratégie simple dans votre cas serait d'utiliser des conteneurs avec des rôles distincts. Par exemple, au lieu d'utiliser 5 conteneurs répondant à des demandes HTTP ET exécutant cron, vous pouvez avoir 4 conteneurs exécutant votre application uniquement et un exclusivement pour les tâches cron.

Si vous avez besoin d'augmenter vos tâches cron en ajoutant plus de nœuds, vous aurez besoin d'une solution de file d'attente/verrou distribuée comme décrit par @Ken Cochrane.

+0

Merci pour la solution. Comme cela semble très viable, j'accepterai la solution de Ken car, comme vous l'avez dit, elle est évolutive et nécessite probablement une configuration de déploiement moins sophistiquée. Mais à coup sûr, votez pour ça! – simPod