Minuto aleatório para entradas de crontab entre servidores

2

Eu tenho uma receita comum de fantoche para um conjunto de nossos servidores. Um dos arquivos gerenciados por bonecos é /etc/crontab , que contém as entradas originais cron.daily , cron.weekly e cron.monthly .

O problema do arquivo comum /etc/crontab aqui é que todos os cronjobs são executados exatamente ao mesmo tempo em todos os nossos servidores. Por exemplo, os backups diários consumiam todos os recursos do nosso servidor de backup, já que todos os servidores o estão alimentando ao mesmo tempo.

Qual é a maneira preferida de randomizar o minuto exato das execuções diárias / semanais / mensais entre servidores, mantendo a receita de fantoches entre todos os servidores?

Eu estive pensando em algumas opções diferentes:

  • executando sleep & $RANDOM antes do trabalho real. Dessa forma, o crontab seria semelhante em todos os hosts, mas o tempo exato de execução dos trabalhos diários / semanais variaria. Haveria variação mesmo dentro do mesmo servidor (por exemplo, o intervalo de execução diária pode variar entre 23 e 25 horas).
  • Calculando um valor inteiro a partir do nome do host e executando todos os trabalhos com at + "o inteiro baseado em nome do host" minutos. Um pouco hacky, mas pode funcionar ...
  • Algum outro método, mas o que?
por Ville Mattila 27.03.2013 / 22:37

4 respostas

5

O Puppet tem uma função fqdn_rand que você pode usar para isso:

minute => fqdn_rand(60)
    
por 27.03.2013 / 22:52
4

Em vez de randomizar os cronjobs, você deve randomizar seus scripts para sleep .

Eu costumo fazer esse tipo de coisa com:

sleep $((RANDOM%120)) && /bin/sh -c /path/to/my/cronjob

Desta forma, todos os cronjobs podem iniciar ao mesmo tempo, mas aleatoriamente dormirão entre 0 and 120 .

    
por 27.03.2013 / 22:51
1

Sim, você pode obter um número inteiro "aleatório" ao fazer o hash do FQDN. Em erb-template:

<%= Time.at( fqdn.hash % 10000 ).strftime('%M')  %> * * * * myuser /bin/mycommand

Mas o fantoche pode fazer isso de maneira mais elegante. Em manifesto:

$minute = inline_template("<%= Time.at( fqdn.hash % 10000 ).strftime('%M')  %>")
cron { my-cron:
    minute => $minute,
    ...
}
    
por 27.03.2013 / 22:53
1

Aqui estão vários tipos diferentes de exemplos de implementação: link

    
por 29.03.2013 / 00:21