Синхронизация времени между серверами - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть веб-сервер, который обрабатывает события из нескольких источников / машин.Для каждого события я даю метку времени и сохраняю ее в БД.Таким образом, даже если не все часы в исходных машинах имеют точное время - это не имеет значения.порядок событий будет сохранен, поскольку сервер отвечает за метку времени.

Теперь я хочу добавить еще один сервер, который может обрабатывать эти события, и сохранить их в той же БД.Каков наилучший способ синхронизации часов между серверами?серверы развернуты на сайте заказчика, и хотя я могу проинструктировать его, что часы должны синхронизироваться, я хочу убедиться в этом.

Есть ли способ решить эту проблему без обмена данными между серверами?Есть ли способ использовать машинные часы БД в выражении SQL?(Я должен поддерживать mysql, sqlserver и oracle. Мое отображение O / R находится в спящем режиме).

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012
  1. Синхронизация времени серверов приложений (NTP и т. Д.) Не гарантирует «идеального» упорядочения событий между ними. Два сервера имеют разные временные рамки, и они никак не могут самостоятельно определить «порядок», в котором происходят события на обоих. Это довольно хорошо известно: http://en.wikipedia.org/wiki/Lamport_timestamps

  2. Вы сказали «тот же» DB => Это хорошее место, чтобы определить «порядок» событий. Но «событием» будет «поступление запроса INSERT в БД». Это приемлемо для вас?

  3. Если # 1 является приемлемым, и «порядок» вхождения имеет значение, вам лучше использовать поле автоматического приращения: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

Вы все еще можете хранить временную метку, но не используйте ее для определения «порядка».

0 голосов
/ 23 февраля 2012

NTP Утилиты имеют 2 типа синхронизации времени.

  1. Получите время и отметьте его сейчас. (Ntpdate)
  2. Получите время и постепенно синхронизируйте время между вашим поставщиком времени и потребителем. (Xntpd)

ntpdate нужен параметр командной строки, ip-адрес сервера времени. xntpd необходимо настроить (тот же IP-адрес) в ntp.conf. Затем необходимо запустить xntpd как демон. Он связывается с поставщиком времени и постепенно корректирует время и постоянно синхронизирует потребителя времени с сервером с точностью до наносекунд.

Хорошей практикой является настройка и использование xntpd. xntpd также вызывает ntpdate, когда он начинает приближаться к серверу в первый раз.

Таким образом, в зависимости от ваших требований, вы можете либо вызывать ntpdate через регулярные интервалы (используя cron, это может быть 1 раз в день, поскольку время не дрейфует более нескольких миллисекунд), либо просто настроить xntpd и покончить с этим.

Если вы выберете xntpd, вам может понадобиться способ узнать, синхронизированы ли вы. Для этого вам нужно запустить интерактивный инструмент командной строки под названием ntpq. Это поможет вам получить статус синхронизации.

Чтобы понять ntpq более подробно, обратитесь к http://www.novell.com/coolsolutions/trench/5730.html (Обратите внимание, что в этом техническом замечании команда rvi относится только к netware, в unix есть только команда rv)

0 голосов
/ 23 февраля 2012

Мне кажется, что вы пытаетесь сбалансировать нагрузку, чтобы у вас было два сервера, которые могут обрабатывать события.Как упоминалось в комментариях, использование NTP на сервере было бы наилучшим способом.

Если вы не можете этого гарантировать, почему бы не заставить свой код вызывать NTP-сервер ваш выбор?Если все соответствующие серверы обращаются к одному и тому же NTP-серверу, вы можете быть уверены, что время соответствует.Время от NTP-сервера затем может быть сохранено в БД или как угодно, что вы хотите с ним сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...