Configure o NTP numa VM

Muitos sistemas de software que dependem de uma sequenciação cuidadosa de eventos baseiam-se num relógio do sistema estável e consistente. Os registos do sistema escritos pela maioria dos serviços incluem uma data/hora, o que ajuda a depurar problemas que ocorrem entre vários componentes do seu sistema. Para ajudar a manter os relógios do sistema sincronizados, as instâncias do Compute Engine são pré-configuradas para usar o protocolo NTP (Network Time Protocol).

Além de manter a hora do servidor sincronizada, o NTP é útil no caso raro de um segundo intercalar. Um segundo intercalar é um ajuste de um segundo feito à hora UTC para ter em conta as alterações na rotação da Terra. Os segundos intercalares não ocorrem a intervalos de rotina, porque a velocidade de rotação da Terra varia irregularmente em resposta a eventos climáticos e geológicos. Os segundos intercalares anteriores afetaram notavelmente uma variedade de serviços e aplicações na Web. Os servidores NTP ajudam a garantir que todos os servidores comunicam a mesma hora durante o evento de um segundo intercalar.

Este documento descreve como configurar os servidores NTP nas suas máquinas virtuais (VMs) para se comportarem corretamente no caso de um segundo intercalar.

Servidores NTP da Google e atraso de segundos intercalares

Os segundos intercalares para um sistema operativo Unix são normalmente implementados repetindo o último segundo do dia. Isto pode causar problemas com software que espera que as datas/horas aumentem sempre. Para contornar este problema, os servidores de tempo distribuem Google Cloud "smear" o segundo adicional ao longo de vinte e quatro horas, doze antes e doze depois do evento de segundo intercalar, para que os computadores não vejam o segundo adicional de uma só vez como uma data/hora repetida. Isto reduz o risco em sistemas que dependem de uma data/hora consistente. Recomendamos que todas as instâncias de máquinas virtuais (VMs) do Compute Engine sejam configuradas para usar os serviços NTP da Google internos.

Configure o NTP para as suas instâncias

Google Cloud não consegue prever como os serviços NTP externos, como o pool.ntp.org, vão processar o segundo intercalar. Se possível, recomendamos que não use origens NTP externas com VMs do Compute Engine. Pior ainda, a utilização do serviço NTP da Google e de um serviço externo pode resultar em alterações imprevisíveis na hora do sistema. A utilização de apenas uma única fonte NTP externa é preferível à utilização de uma combinação, mas os serviços NTP externos, como o pool.ntp.org, vão provavelmente usar o ajuste para processar o segundo intercalar. Como resultado, as suas VMs podem ver uma data/hora repetida.

A abordagem mais segura é configurar as VMs do Compute Engine para usar um único servidor NTP, o servidor NTP interno fornecido pela Google. Não misture servidores NTP externos e servidores NTP da Google, uma vez que isto pode resultar num comportamento inesperado. Para mais informações acerca do servidor NTP interno fornecido pela Google, consulte as Perguntas frequentes sobre o NTP público da Google.

Para garantir que as VMs estão configuradas corretamente, siga estas instruções.

Linux (chrony)

Por predefinição, a maioria das novas versões do Linux usa o chrony para gerir as respetivas definições de NTP e sincronização de tempo. Para se certificar de que o chrony usa apenas o serviço NTP interno, verifique a configuração do chrony e remova os servidores NTP externos.

  1. Use ssh para estabelecer ligação à sua instância.

    Consola

    Para usar a consola para estabelecer ligação à VM através de SSH, siga estes passos:

    1. Aceda à página Instâncias de VM na Google Cloud consola.

      Aceder às instâncias de VM

    2. Clique no botão SSH para a VM que quer configurar.

      Botão SSH.

    gcloud

    Para usar a Google Cloud CLI para estabelecer ligação à VM através de SSH, execute o seguinte comando:

    gcloud compute instances ssh VM_NAME
    

    Substitua VM_NAME pelo nome da VM à qual se está a ligar.

  2. Na sua instância, execute chronyc sources para verificar o estado atual da configuração do NTP:

    $ chronyc sources
    

    O resultado tem um aspeto semelhante ao seguinte:

     210 Number of sources = 2
     MS Name/IP address         Stratum Poll Reach LastRx Last sample
     ===============================================================================
     ^* metadata.google.internal      2   6   377     4    -14us[  -28us] +/-  257us
     ^- 38.229.53.9                   2   6    37     4   -283us[ -297us] +/-   28ms
    

    Se vir um único registo a apontar para metadata.google ou metadata.google.internal, não tem de fazer alterações. Se vir várias origens, misturadas entre metadata.google e uma origem pública, como pool.ntp.org, atualize as suas origens para remover quaisquer servidores NTP externos.

    No resultado de exemplo, existem dois registos, um a apontar para metadata.google.internal e outro a apontar para um endereço externo. Como existem várias origens, atualizaria os servidores NTP para remover o endereço 38.229.53.9, conforme descrito no passo seguinte.

  3. Configure os seus servidores NTP para remover servidores NTP externos.

    Para remover o servidor NTP adicional da lista, edite o ficheiro /etc/chrony/chrony.conf com o seu editor de texto favorito. Encontre todas as linhas que começam com server external_source_ip_or_name e remova-as.

    Depois de editar o ficheiro /etc/chrony/chrony.conf, reinicie o serviço chrony. O comando para reiniciar pode variar consoante a distribuição do Linux, como mostrado nos exemplos seguintes:

    sudo service chrony restart
    
    sudo systemctl restart chrony
    
  4. Valide a configuração executando novamente o comando chronyc sources:

    $ chronyc sources
    

    O resultado deve ser semelhante ao seguinte:

     210 Number of sources = 1
     MS Name/IP address         Stratum Poll Reach LastRx Last sample
     ===============================================================================
     ^* metadata.google.internal      2   7   377    98  -1343ns[-1588ns] +/-  396us
    

Linux (ntpd)

A maioria das distribuições Linux mais antigas usa o ntpd para gerir as respetivas definições de NTP e sincronização de tempo. Para se certificar de que o ntpd usa apenas o serviço NTP interno, verifique a configuração do ntpd e remova os servidores NTP externos.

  1. Use ssh para estabelecer ligação à sua instância.

    Consola

    Para usar a consola para estabelecer ligação à VM através de SSH, siga estes passos:

    1. Aceda à página Instâncias de VM na Google Cloud consola.

      Aceder às instâncias de VM

    2. Clique no botão SSH para a VM que quer configurar.

      Botão SSH.

    gcloud

    Para usar a Google Cloud CLI para estabelecer ligação à VM através de SSH, execute o seguinte comando:

    gcloud compute instances ssh VM_NAME
    

    Substitua VM_NAME pelo nome da VM à qual se está a ligar.

  2. Na sua instância, execute ntpq -p para verificar o estado atual da sua configuração de NTP:

    $ ntpq -p
    

    O resultado tem um aspeto semelhante ao seguinte:

    remote           refid           st t when poll reach   delay   offset  jitter
    
    ==============================================================================
    *metadata.google 255.28.23.83     2 u   27   64    1    0.634   -2.537   2.285
    *217.162.232.173 130.149.17.8     2 u  191 1024  176   79.245    3.589  27.454
    

    Se vir um único registo a apontar para metadata.google ou metadata.google.internal, não tem de fazer alterações. Se vir várias fontes, misturadas entre metadata.google e uma fonte pública, como pool.ntp.org, tem de atualizar as suas fontes para remover todos os servidores NTP externos.

    No resultado de exemplo, existem dois registos, um a apontar para metadata.google e outro a apontar para um endereço externo. Uma vez que existem várias origens, tem de atualizar os servidores NTP para remover o endereço *217.162.232.173, conforme descrito no passo seguinte.

  3. Configure os seus servidores NTP para remover origens externas.

    Para configurar os seus servidores NTP, edite o ficheiro /etc/ntp.conf com o seu editor de texto favorito. Encontre a secção servers da configuração e remova todas as origens de NTP não pertencentes à Google, por exemplo:

    vim /etc/ntp.conf
    
    # You do need to talk to an NTP server or two (or three).
    #server ntp.your-provider.example
    ...
    server metadata.google.internal iburst
    

    Depois de editar o ficheiro /etc/ntp.conf, reinicie o serviço NTP. O comando para reiniciar pode variar consoante a distribuição do Linux:

    sudo service ntp reload
    
  4. Valide a configuração executando novamente o comando ntpq -p:

    ntpq -p
    
    remote           refid           st t when poll reach   delay   offset  jitter
    ==============================================================================
    *metadata.google 255.28.23.83     2 u   27   64    1    0.634   -2.537   2.285
    

Windows

  1. Aceda à página Instâncias de VM na Google Cloud consola.

    Aceder às instâncias de VM

  2. Clique no botão RDP junto à instância do Windows à qual quer estabelecer ligação.

    Botão SSH.

  3. Depois de iniciar sessão, clique com o botão direito do rato no ícone do PowerShell e selecione Executar como administrador.

    O ícone do PowerShell.

  4. Quando a linha de comandos for carregada, execute o seguinte comando para ver a configuração NTP atual:

    w32tm /query /configuration
    
    [Configuration]
    ...
    Type: NTP (Local)
    NtpServer: metadata.google.internal,
    ...
    

    Se vir um único registo a apontar para metadata.google ou metadata.google.internal, não tem de fazer alterações. Se vir várias origens, misturadas entre metadata.google e uma origem pública, tem de remover o servidor externo. Siga o guia do Windows para configurar o servidor NTP.

  5. Para garantir a compatibilidade de software mais abrangente nas VMs do Windows, a Google recomenda que use o controlador gVNIC para garantir a precisão do NTP inferior a um milissegundo com o metadata.google.

    Se tiver de usar o VirtIO com a sua VM do Windows, para obter uma precisão inferior a um milissegundo com os servidores NTP, a Google recomenda que não use o Windows Time Service (pare e anule o registo de w32tm).

    1. Pare o serviço de hora do Windows:

      net stop w32time
      
    2. Remova o serviço de hora do Windows do registo:

      w32tm /unregister
      
    3. Depois de o serviço de tempo do Windows ter sido parado e removido do registo, instale o cliente NTP da Meinberg.

      Siga as instruções de configuração conforme indicado na documentação da Meinberg.

    4. Configure o servidor NTP para o cliente NTP Meinberg como metadata.google.internal.

      Depois de terminar a configuração do NTP, aguarde entre 5 e 15 minutos para que o relógio do sistema na VM se estabilize com o servidor NTP.

      Para obter informações sobre o motivo pelo qual não é recomendado usar o w32tm, consulte a documentação de problemas conhecidos.

Usar a distorção de saltos com sistemas externos ao Google Cloud

A funcionalidade de extensão do salto dos servidores NTP da Google é uma forma conveniente de gerir o risco envolvido na repetição de um segundo em sistemas sensíveis ao tempo. Outros serviços NTP podem fornecer uma solução alternativa aceitável para a maioria dos sistemas de software. No entanto, é importante que não misture os serviços NTP de propagação de anos bissextos da Google com os serviços NTP de ajuste de tempo públicos.

Para sincronizar dispositivos fora Google Cloud com a hora alterada, pode usar o NTP público da Google para esses dispositivos. O NTP público da Google usa a mesma dispersão de segundos intercalares que é fornecida às VMs do Compute Engine.

O que se segue?