Como projetar um agendador de trabalho distribuído?

eu quero desenhar um conjunto de agenda de tarefas, que contém vários hosts para fazer a programação de tarefas de cron. Por exemplo, um trabalho que precisa run every 5 minutes é submetido ao aglomerado, o aglomerado deve apontar qual host para disparar a próxima execução, certificando-se:

    Tolerância a desastres: se nem todos os anfitriões estão em baixo, o trabalho deve ser despedido com sucesso.
  1. validade: apenas um hospedeiro para despedir o próximo trabalho.
Devido à tolerância a desastres, job Não pode ligar-se a um hospedeiro específico. Uma maneira é que todos os anfitriões votando uma tabela DB (certamente com lock), Esta garantia de que apenas um host recebe o próximo trabalho executado. Uma vez que muitas vezes bloqueia a mesa, há algum design melhor?

Author: starkeen, 2014-11-12

7 answers

Eu precisava de algo assim há muito tempo, quando a sincronização era feita com disquetes. Você deve ser claro sobre três coisas, que parecem ser simples, mas em ambiente distribuído a arent: -)

"Secções De Sincronização" Se você obter uma divisão de rede, o que significa que o seu conjunto é dividido em duas seções separadas que podem se comunicar dentro das seções, mas não entre as duas seções, o "disparar o trabalho exatamente uma vez" só pode adquirir por seção de sincronização.

"Desastre" Se quase todos os momentos, todos os computadores estão funcionando, e só muito raramente uma falha e a falha dos dois é quase impensável, é uma coisa completamente diferente, que cada host está executando apenas parte do tempo, as conexões são instáveis, ou a sincronização é feita através de ligações de acesso telefónico ou por floppys. Se você quer mesmo lidar com uma divisão de rede, torna-se realmente muito complicado. Se você quer lidar com hosts maliciosos, você tem outro Problema.

"validade" Despede todos os trabalhos exactamente uma vez... tens de sincronizar mais depressa do que o intervalo de disparo do trabalho.

Editar: dica para o desenho das tarefas de escalonamento. Tenho um grande ficheiro de texto, que contém linhas. Cada linha é uma tarefa de trabalho, começando com o tipo de trabalho, em seguida, o tempo para executar, em seguida, comando e por último, mas não menos importante, um intervalo de reapresentação opcional para tarefas repetitivas. Sincronizar significa fundir. As tarefas executadas são apagadas. Se a reapresentação estiver ligada, então uma nova tarefa é inserida ou acrescentar.

Num mundo ideal, cada hospedeiro está sempre ligado aos outros, eu implementaria algo como um anel simbólico. Se não há mestre, um é selecionado pelos anfitriões, e o mestre é esperado para agendar tudo até que ele não está enviando heardbeats por algum tempo. Se houver dois mestres, eles negociam para que um deles se torne mestre(talvez MAC-Adress mais baixo... seja o que for). Se você tem que lidar com hostes maliciosos, você pode usar alguns gerenais bizantinos-problema solucao. A seleção do mestre já está bem protegida contra hosts maliciosos. Com um pouco de RSA-krypto, o mestre selecionado pode assinar cada comando, os ataques de resend podem ser tratados com datas ou índices de crescimento... pronto.

Apenas como uma história de um programador onld, não destinado para hoje tudo está sempre ligado ao mundo da internet: O meu grande problema há 20 anos era que os anfitriões eram sincronizados uma vez por hora e uma vez por dia. a uma vez por semana ou uma vez por mês. Então a solução era ter comandos diferentes: 1. executar em cada máquina numa dada data (o que é suficiente no futuro para a sincronização) 2. execute em um host, onde "whoami" contém uma determinada substring. 3. execute em um host Aleatório com pouca probabilidade, e envie um reconhecimento para todos os outros, que ele está pronto para ser executado.

O terceiro tipo de comando faz algo como "disparar apenas uma vez", se a sincronização for muito mais rápida do que a probabilidade de execução. Não precisa de arquitetura master-slave e funciona muito bem, se você conhece as intervalações de sincronização.

 2
Author: Marco Haschka, 2016-12-16 17:41:56
Pesquisei no Google o Dkron (sistema de programação de tarefas distribuídas). Tem api de descanso e parece bom. Planeio tentar usá-lo. Local de Dkron
 2
Author: shcherbak, 2017-11-08 13:31:10

Considere a utilização deAWS serviço de fluxo de trabalho simples Se estiver de acordo com a utilização de serviços web AWS. O benefício sobre algo como quartzo é que ele não depende do banco de dados que você tem que hospedar e ele pode fornecer muito mais do que agendamento. Por exemplo, ele pode executar algumas atividades que corrigem o seu cluster ou página você se a programação não é possível por qualquer razão. Aqui está um exemplo de um fluxo de trabalho de cron.

 1
Author: Maxim Fateev, 2015-05-08 18:32:33

Confira Chronos ( https://mesos.github.io/chronos/ que corre sobre Mesos- ( https://mesos.apache.org / ) escalonador de recursos.

 1
Author: gnurik, 2016-07-27 21:17:01

Https://github.com/jhuckaby/Cronicle

É fácil de configurar e pode executar o nó JS, PHP, ficheiros Python com a ajuda do Plugin

 0
Author: Sivailango, 2018-05-23 19:16:10

Não sei como desenhar um, mas existem produtos de código aberto que fazem aquilo que pode servir como exemplo. Um é Escalonador de quartzo que é mencionado acima.

Mas, aparentemente, WallmartLabs avaliaram o quartzo, acharam que não era bom o suficiente, e assim criaram e abriram uma alternativa melhor (na sua opinião) a ele chamado BigBen. Talvez também possa olhar para esse.

 0
Author: mvmn, 2018-09-08 21:09:23