Executar crons em servidores espelhados em escala (lógica cron necessária) [fechada]

0

Eu tenho um cliente rodando na Rackspace, eles têm três servidores que são sincronizados juntos, eu adicionei um monte de crons no crontab usando o wget para o endereço da web do cron (que sincroniza com cada servidor). Quando você vai para o domínio do cliente, um balanceador de carga cuida de você.

Eu só quero executar o crons uma vez em um servidor específico (web01)

O problema é quando cada servidor executa os crontabs que ele executa x3 para cada servidor. Então eu coloco no PHP uma checagem se o nome do host é diferente de web01 para morrer, mas como estamos usando o WGET e eles estão rodando através do balanceador de carga, estamos descobrindo que o LB está enviando dois pedidos para o web01 e o outro para web02 ou web03.

Estou pensando que isso precisa ser feito inteiramente no crontab, verificando se o servidor atual é web01 e executar as tarefas agendadas dentro da instrução IF; caso contrário, não faça nada, mas não tenho certeza da melhor maneira de expressar isso com uma declaração IF.

    
por Braunson 12.11.2015 / 18:03

1 resposta

1

Você tem três servidores configurados de forma quase idêntica, mas deseja executar os trabalhos cron em apenas um deles?

Vamos seguir seu esquema de nomenclatura para os servidores: web01 , web02 e web03 . Estou usando o shell script, mas o princípio é exatamente o mesmo para o PHP. (Eu posso jogar PHP por aí, mas não me considero bem versado para codificá-lo em público.)

Perto da parte superior de cada script cron , você pode fazer algo assim, o que fará com que o script seja encerrado, a menos que o nome do servidor seja web01 .

[ web01 != "$(hostname)" ] && exit

Isso não é muito resiliente em face de uma indisponibilidade do servidor. Se web01 morrer, presumivelmente você deseja pegar os cron jobs em outro servidor. Supondo que você tenha acesso ao DNS, você pode criar um CNAME no servidor responsável por executar cron . Aqui está uma entrada de amostra para bind ; será semelhante para outros sistemas:

cron.contoso.com 300 IN CNAME web01.contoso.com

Você pode usar dig ou nslookup para comparar o nome do servidor com o alias e, em cinco minutos (300 segundos), você pode ter trocado as responsabilidades de cron por outro servidor:

myaddr="$(nslookup "$(hostname)" | awk '$1=="Address:"{a=$2} END{print a}')"
cronaddr="$(nslookup "$(hostname)" | awk '$1=="Address:"{a=$2} END{print a}')"
[ "$myaddr" != "$cronaddr" ] && exit

Ou:

myaddr="$(dig +short "$(hostname).contoso.com")"
cronaddr="$(dig +short cron.contoso.com)"
[ "$myaddr" != "$cronaddr" ] && exit
    
por 12.11.2015 / 22:00