20 nov 2009

Linux NTP Server + SO Time Zone + Oracle Time Zone.

Tengo el siguiente dilema

Tengo un servidor Linux con DB Oracle 10g en el cual la fecha y hora son extremadamente criticas. Debido a algunas inconsistencias ( entre el soft de virtualización, la bios virtual y el server virtual) he decidido conectarlo a un NTP server de internet. Otro factor que afecta, es el cambio horario de forma no uniforme en distintas regiones de Argentina.

La pregunta es:

¿ Existe un método para cambiar el time zone del sistema operativo mediante NTP ?
¿ Como afecta el cambio de time zone del sistema operativo a Oracle ?

Después de investigar un rato encuentro este FAQ el cual explica que el protocolo NTP es independiente de la zona horaria (time zone); brinda siempre la hora en UTC/GTM +00:00. Por lo que la hora del equipo depende no solamente del servicio NTP sino tambien del time zone que le setemos al equipo. Decido a comprobar esto armo mi propio servidor NTP.

 #>apt-get install ntpd ntpdate

El archivo de configuracion del servicio esta en /etc/ntp.conf y queda asi

#> vi /etc/ntp.conf


# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift


# Enable this if you want statistics to be logged.
statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable


# You do need to talk to an NTP server or two (or three).
#server ntp.ubuntu.com
server time.sinectis.com.ar iburst
server tock.nap.com.ar iburst
server 0.ar.pool.ntp.org iburst
server 1.south-america.pool.ntp.org iburst
server 0.south-america.pool.ntp.org iburst

Un articulo muy lindo de como configurar esto, esta en este link, aqui obvie las configuraciones de seguridad. Los pools en mi caso Argentina los saque de aqui y de aquí, esto es por que la selección del servidor a utilizar por NTP viene dada por varios factores entre ellos la distancia. Reiniciamos el daemon para actualizar las configuraciones:

#>/etc/init.d/ntp restart

Luego chequeamos si nuestro servidor esta sincronizando con los que les detallamos en su configuración:

#> ntpq -np

     remote              refid                  st t when poll reach   delay   offset  jitter
==========   ===============================
+216.244.192.3   62.117.76.142    2  u  167  512  377   26.525   33.572   2.619
-200.10.140.1       192.5.41.41        2   u  122  512  377   26.534   44.511  45.921
-200.63.112.9       192.43.244.18    2 u  655  512  376   44.753   48.853  55.039
*187.49.33.13       200.20.186.75   2 u  162  512  377  326.558   35.854   4.766
+190.202.98.221  150.214.94.5     2 u  145  512  377  241.681   33.767  11.175
 192.168.65.255   .BCST.               16 u    -   64    0    0.000    0.000   0.002

Aqui solamente destaco, que el asterisco (*) indica el servidor al cual estamos sincronizando y con signo más (+) los servidores candidatos a sincronizar en caso del que el preferido falle.
Otras opciones interesantes para debugear en ntpq son:



ntpq> as

ind assID status  conf reach auth condition  last_event cnt
====================================
  1 57640  9144   yes   yes  none falsetick   reachable  4
  2 57641  9444   yes   yes  none  candidat   reachable  4
  3 57642  9444   yes   yes  none  candidat   reachable  4
  4 57643  8053   yes   yes  none    reject  lost reach  5
  5 57644  9644   yes   yes  none  sys.peer   reachable  4
  6 57645  9344   yes   yes  none   outlyer   reachable  4
  7 57646  8000   yes   yes  none    reject

ntpq> rv
assID=0 status=06f4 leap_none, sync_ntp, 15 events, event_peer/strat_chg,
version="ntpd 4.2.4p4@1.1520-o Wed May 13 21:05:42 UTC 2009 (1)",
processor="i686", system="Linux/2.6.28-16-generic", leap=00, stratum=3,
precision=-19, rootdelay=351.872, rootdispersion=56.283, peer=57644,
refid=187.49.33.13,
reftime=ceb188e9.25b15a51  Sat, Nov 21 2009  2:00:17.147, poll=10,
clock=ceb18b4f.39f3287e  Sat, Nov 21 2009  2:10:31.226, state=4,
offset=-4.565, frequency=9.125, jitter=4.385, noise=16.777,
stability=0.047, tai=0

ntpq> pe
     remote           refid      st t when poll reach   delay   offset  jitter
========================================
 xtime.windows.co 0.0.0.0          2 u  593 1024  377    0.530  32852.8   0.073
+ns2.sinectis.co 62.117.76.142    2 u  105 1024  277   26.006   -4.959   4.634
+200.10.140.1.ad 192.5.41.41      2 u  576 1024  377   26.477    0.399   6.288
 willie.norfe.ne 192.43.244.18    2 u 104m  512    0   44.753   48.853   0.000
*srv6.spbrasil.c 200.20.186.75    2 u  615 1024  377  329.167   -3.810   3.481
-190.202.98.221  150.214.94.5     2 u  599 1024  377  246.638  -18.083  25.978
 192.168.65.255  .BCST.          16 u    -   64    0    0.000    0.000   0.002

Bueno mi servidor NTP ya esta sincronizado y es stratum=3. Para demostrar que NTP solo provee UTC/GTM 00:00 sincronizo un cliente windows 2003 a este y cambio el time zone de mi server de -03:00 a -04:30. Y efectivamente mi server marca la 1am mientras que el cliente Windows dependiente de mi server NTP se mantiene en la misma hora, mas alla de haberse sincronizado manualmente y automáticamente. Lo que concluye que NTP brinda siempre la hora en UTC 00:00, independiente de donde estemos geográficamente, por lo que no es posible setear el time zone del sistema operativo mediante opciones o comandos del protocolo NTP. En este punto me doy cuenta que tendre que configurar en los cambios de horario invierno-verano la posición geográfica ( UTC/GTM) de cada uno de los servidores. Aunque lei que existe la opcion DTS para manejar las zonas horarias, la cual no me da mucha confianza ya que puede implicar cambios automaticos de time zone, pero la siguere analizando.