Cron agrupado com apenas um servidor sobreposto permitido

2

Configurei os balanceadores de carga: lb1 (ativo) e lb2 (passivo), servidores da Web com gluster: web1 (ativo), web2 (backup) e alguns bancos de dados em cluster. Os servidores e bancos de dados da Web são A apontados para o VIP dos balanceadores de carga.

Ambos os servidores da web têm sua cópia dos trabalhos cron. Assumindo as seguintes tarefas:

* * * * * echo $(hostname) >> crontab.txt
0 0 1 * * ~/bin/another/task 2>&1

Com algum algoritmo de bloqueio aleatório:

lock_dir=~/.cronlock
pid_file=~/.cronlock/pid

if ( mkdir ${lock_dir} ) 2> /dev/null; then
    echo $$ > $pid_file
    trap 'rm -rf "$lock_dir"; exit $?' INT TERM EXIT

    # Crons

    rm -rf "$lock_dir"
    trap - INT TERM EXIT
fi

É seguro ter algo como

* * * * * ./lock_algorithm -f LOCK_FILE1 -c "echo $(hostname) >> crontab.txt"
0 0 1 * * ./lock_algorithm -f LOCK_FILE2 -c "~/bin/another/task 2>&1"

Onde envio um nome de arquivo de bloqueio exclusivo "per-cron-command" e um comando a ser executado?

Por "segura", quero dizer que web1 OR web2 será executado, não ambos.

E se eu precisar de uma sobreposição de cron (por exemplo: a cada minuto eu realizo uma tarefa longa limitada ao minuto atual)? Como fazer com que o cron de web1 seja executado novamente, assumindo que web1 é o "cron cronômetro ativo"?

    
por Gabriel Santos 15.11.2015 / 00:35

2 respostas

1

Não tenho certeza se o seguinte é possível para você, mas eis uma ideia minha:

  • Não tenho certeza de qual pilha de clusters / software você está usando, mas você pode introduzir o marca-passo e o corosync em web1 e web2 , e use agentes de recurso ocf para isso. Para você ter uma ideia, sobre o que é isso:

    primitive p_postfix ocf:heartbeat:postfix \
      params config_dir="/etc/postfix" \
      op monitor interval="10"
    primitive p_symlink ocf:heartbeat:symlink \
      params target="/srv/postfix/cron" \
        link="/etc/cron.d/postfix" \
        backup_suffix=".disabled" \
      op monitor interval="10"
    primitive p_cron lsb:cron \
      op monitor interval=10
    order o_symlink_before_cron inf: p_symlink p_cron
    colocation c_cron_on_symlink inf: p_cron p_symlink
    colocation c_symlink_on_postfix inf: p_symlink p_postfix
    
  • O que isso fará é o seguinte:

    • Verifique se um arquivo chamado postfix já existe em /etc/cron.d .
    • Em caso afirmativo, renomeie-o para postfix.disabled (lembre-se, cron ignora as definições de tarefa com pontos no nome do arquivo).
    • (Re-) Crie a definição de trabalho postfix como um link simbólico para /srv/postfix/cron .
    • Reinicie o cron quando terminar.
  • Este exemplo está fora de um cluster ativo / passivo executando postfix . Cron get é executado apenas no nó postfix ativo.

  • Você pode alterar isso para remover postfix e incluir seu servidor da Web.

Editar: Se o acima for "muito" para você, aqui está outra ideia: você pode configurar HAProxy stats, obter esse website em seu script, analisá-lo e agir de acordo, dependendo no nome do host e no status emitido por HAProxy .

    
por 15.11.2015 / 09:12
1

Parece que você está tentando criar um semáforo que funciona nos servidores. Enquanto alguém tentou construir isso eu não vejo isso sendo produção -pronto. Em vez de empurrar o envelope tecnológico, seria bom refatorar seu problema em algo que se encaixe na tecnologia disponível.

O seu site tem um banco de dados? Você poderia usar isso para coordenação.

Se não, que tal usar um sistema de enfileiramento distribuído como kafka ou 0mq?

    
por 15.11.2015 / 17:24