Execução de scripts sincronizados em vários servidores

0

Eu estou olhando para executar uma tarefa automatizada (um script shell) em vários servidores Ubuntu ao mesmo tempo com o máximo de precisão de tempo possível. Idealmente, gostaria que a discrepância de tempo entre o início das execuções de script fosse menor que um segundo em todos os servidores. Os servidores estão todos em locais diferentes e a maioria está em fusos horários diferentes. No entanto, as tarefas que pretendo executar serão em intervalos regulares, portanto, os fusos horários não devem ser um problema.

Atualmente, estou pensando em usar cron para agendar a tarefa recorrente em cada servidor, mas estou preocupado com o fato de que talvez ela não seja precisa o suficiente por si só. Para compensar, eu estava pensando em usar o protocolo de tempo de rede para garantir que todos os servidores tenham relógios que permaneçam em sincronia (mais ou menos fusos horários).

Então, minha pergunta é em duas partes:

  1. O uso de cron e ntp será preciso o suficiente para atender às minhas necessidades?
  2. Existe uma maneira melhor de fazer isso?
por Mr. Llama 24.09.2014 / 19:26

2 respostas

1

É difícil responder com precisão, pois há versões diferentes do cron com uma precisão potencialmente variável.

O NTP será definitivamente uma obrigação para uma solução como essa, e usará o ntpd ao invés do ntpdate, já que o ntpd ajustará constantemente o "comprimento de um segundo" ao comprimento correto de um segundo ao contrário do ntpdate que apenas ajusta o tempo e permite que ele se desloque novamente. Uma vez que o sistema inicializa, ele não usa mais o clock RTC suportado por bateria, mas usa interrupções geradas pela CPU, que são muito mais precisas, mas podem precisar ser ajustadas ligeiramente.

ligado ao cron:

Da página man do cron:

cron then wakes up every minute, examining all stored crontabs, checking each command to see if it should be run in the current minute. When executing commands, any output is mailed to the owner of the crontab (or to the user named in the MAILTO environment variable in the crontab, if such exists). The children copies of cron run‐ ning these processes have their name coerced to uppercase, as will be seen in the syslog and ps output.

A menos que o cron acorde a cada minuto no minuto , você não tem garantia de precisão, mas eu recomendo que você não considere isso como certo e teste-o. Sincronize os servidores usando o NTP, programe uma tarefa cron para tocar em arquivos durante um período de tempo e os registre.

Depois de tocar em arquivos suficientes, você deve ter uma idéia do tipo de precisão que seu cron tem.

Se o seu aplicativo tiver que ser sincronizado dentro do segundo, ou se o seu cron estiver muito impreciso, será melhor iniciar os scripts alguns segundos antes e, usando o relógio sincronizado NTP, faça com que os scripts esperem o momento certo. hora de prosseguir com o seu pedido.

Editar: um script rápido para dormir até o minuto especificado:

#!/bin/bash
minute_to_start=$1
minute_now='date +%M'
minutes_to_wait='echo $minute_to_start - $minute_now -1 | bc -l'
now='date +%S.%N'
to_sleep='echo 60 - $now + \( $minutes_to_wait \* 60 \) | bc -l'
sleep $to_sleep
$2

Você pode executá-lo no cron como:

29 7 * * * /path/to/above/script.sh 30 'the real script'

E o trabalho começará às 07:30:00

No meu teste, ele se moveu dentro de 10-20 milissegundos, e não funciona se você quiser começar em X: 00: 00.00 (na hora), então não é algo que eu realmente use na produção.

    
por 24.09.2014 / 23:14
0

O NTP é capaz de sincronizar o tempo de seus servidores em alguns microssegundos. Se o relógio do hardware estiver muito ruim, você pode alterná-lo a cada hora para evitar uma lacuna maior. O cron está tomando apenas horas e minutos como horários de início, mas irá iniciar os trabalhos em hh: mm: 00, então, do meu ponto de vista, você está economizando com sua solução.

    
por 24.09.2014 / 22:16