Se avessi un'attività che desideri eseguire una sola volta su un cluster di server, a intervalli regolari quale sarebbe il modo migliore per raggiungere questo obiettivo? La definizione di cluster in questo caso è 2 o più server identici con sessioni distribuite dietro un bilanciamento del carico.
Caso di utilizzo: un'attività costosa da eseguire che deve essere eseguita una sola volta per X ore. Questo lavoro, ad esempio, può scorrere su un mucchio di record e aggiornare il loro stato.
- Lo scenario peggiore è che l'esecuzione del lavoro due volte invalida i dati.
- Lo scenario migliore è che il lavoro utilizza risorse su tutti i server.
Riepilogo dei requisiti:
- Il processo deve comunque essere eseguito anche se uno dei nodi è inattivo.
- Il lavoro deve essere eseguito una sola volta per pianificazione.
- Se sono pianificati più lavori contemporaneamente o in momenti sovrapposti, il numero di lavori in esecuzione viene distribuito equamente tra i server.
- Le macchine devono avere la stessa base di codice ed essere sincronizzate tramite NTP.
- La configurazione può differire tra nodo e nodo, in base alle variabili di ambiente.
- Il lavoro deve iniziare in tempo o entro un determinato intervallo del tempo assegnato. (ad esempio 5 minuti)
Possibili soluzioni
- Imposta un nodo come nodo principale, questo non funziona in quanto viola 1 sopra.
- Inviare una richiesta di bilanciamento del carico per avviare il lavoro. Sfortunatamente questo ha l'effetto collaterale che se si hanno più lavori in esecuzione contemporaneamente possono essere tutti eseguiti dalla stessa macchina.
Questo dovrebbe essere eseguito in Java, in un contenitore servlet. Tuttavia non sta codificando i lavori che sto cercando.
Sicuramente questo è un problema risolto con la migliore soluzione conosciuta.
Domanda correlata. /programming/5949038/schedule-job-executes-twice-on-cluster
Questo non è un duplicato in quanto la soluzione non è sufficiente secondo quei 5 requisiti indicati sopra. La soluzione più votata soffre di un problema di gara e la seconda soluzione viola il requisito 3