Риск запуска NTP на сервере базы данных?

27

Я слышал слухи о плохих вещах, происходящих с базами данных и почтовыми серверами, если вы меняете системное время во время их работы. Однако мне трудно найти конкретную информацию о реальных рисках.

У меня есть рабочий сервер Postgres 9.3, работающий на хосте Debian Wheezy, и время отключено на 367 секунд. Могу ли я просто запустить ntpdateили запустить openntp во время работы Postgres, или это может вызвать проблемы? Если да, то какой метод коррекции времени безопаснее?

Существуют ли другие службы, которые более чувствительны к изменению системного времени? Может быть, почтовые серверы (exim, sendmail и т. Д.) Или очереди сообщений (activemq, rabbitmq, zeromq и т. Д.)?

vastlysuperiorman
источник

Ответы:

23

Базы данных не любят обратные шаги во времени, поэтому вы не хотите начинать с поведения по умолчанию, определяющего время. Добавление -xопции в командную строку приведет к уменьшению времени, если смещение меньше 600 секунд (10 минут). При максимальной скорости нарастания потребуется около полутора дней, чтобы настроить часы на минуту. Это медленный, но безопасный способ скорректировать время.

Прежде чем приступить ntpк настройке времени, вы можете начать ntpс такой опции, как -g 2проверка того, насколько велико обнаруженное смещение. Это установит смещение паники на 2 секунды, что должно быть относительно безопасно.

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

Распространенным вариантом является отключение сервера достаточно долго, чтобы не было обратного хода часов. ntpили ntpdateможет быть настроен для перехода на правильное время при запуске. Это должно быть сделано до запуска базы данных.

BillThor
источник
8

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

Как указывает Джоффри, гораздо чаще приложение сталкивается с проблемами при резких скачках времени, чем сама база данных. Самый безопасный способ исправить время - закрыть приложение на N + 1 минуту (где N - количество минут, которое опережают ваши системные часы), а затем синхронизировать время, запустить NTP и перезапустить приложение. Если вы не можете сократить время простоя приложения, я могу только предложить вам сделать резервную копию базы данных перед синхронизацией времени, а затем предложить мертвую белку лету компьютера и просто нажать на курок. Хорошо, я немного шутливый, но я не могу думать о каком-либо другом "безопасном" способе, кроме отключения приложения.

Джон
источник
Я впереди и мне нужно прыгнуть назад примерно на 6 минут. У меня есть много, много внутренних записей, которые были установлены now(). Можете ли вы добавить какой-либо безопасный метод изменения времени в вашем ответе?
суперспособенец
6
Если ntpd установлен и настроен правильно, он сможет постепенно корректировать системное время, замедляя время. Как только правильное время достигнуто, дрейф корректируется для поддержания времени. Возможно, вам придется указать максимальное исправление сверх вашей ошибки. По крайней мере, я так понимаю, но я не эксперт по NTP.
Джонатан Джей
@JonathanJ - NTP испытывает трудности с исправлением перекосов времени, превышающих 5 минут, и при настройке для «стандартного» документооборота (из которых, по общему признанию, имеется несколько наборов) сначала синхронизирует время за один скачок, а затем поддерживает синхронизацию путем регулировки дрейфа.
Джон
@ Джон у меня кончились белки много лет назад;)
Джоффри,
4

Обычно не сервер базы данных подвержен ошибкам при мгновенном скачке времени: это приложения, которые используют время.

Обычно существует два способа отслеживания времени: отслеживание собственного времени или сравнение системного времени. Оба имеют некоторые положительные и отрицательные компромиссы.

Собственное время отслеживания

Я вижу, что это используется в некоторых встроенных программах и системах, где точное время не так критично. В основном цикле приложения используется способ отслеживания «галочки». Это может быть сигнал тревоги, выданный ядром, сном или выбором, который показывает количество прошедшего времени. Когда вы знаете, сколько времени прошло, вы знаете, что можете прибавить или вычесть это время к счетчику. Этот счетчик - то, что заставляет Ваше приложение времени происходить. Например, если счетчик больше 10 секунд, вы можете что-то отменить или вам нужно что-то сделать.

Если приложение не отслеживает время, счетчик не изменится. Это может быть желательно в зависимости от дизайна вашего приложения. Например, отследить, сколько времени занимает длительный процесс, что-то обрабатывается, легче с помощью счетчика, чем список отметок времени запуска / остановки.

Pro:

  • Не зависит от системных часов
  • Не сломается на большой перекошенный момент
  • Нет дорогостоящего системного вызова
  • Маленькие счетчики будут стоить меньше памяти, чем полная отметка времени

Против:

  • Время не очень точное
  • Изменение системного времени может сделать его еще более неточным
  • Сроки относительно запуска приложения, не сохраняется

Сравнение системного времени

Эта система используется чаще: сохраняйте временную метку и сравнивайте ее с временной меткой, используя системный вызов времени. Огромные перекосы в системном времени могут поставить под угрозу целостность вашего приложения, задача в несколько секунд может занять часы или завершиться немедленно, в зависимости от направления часов.

Pro:

  • Точное сравнение времени
  • Сохраняется после перезапусков и длительных отключений

Против:

  • Делает системный вызов, чтобы получить новую временную метку для сравнения с другими временными метками
  • Приложение должно быть осведомлено о перекосах или может сломаться

Затронутые системы

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

Все приложения, которые используют базу данных и функции времени вызова на языке запросов, будут подвержены перекосам, если приложение не обнаружит и не обработает соответствующим образом. Приложения никогда не могут прекратить работу или разрешить неопределенные периоды входа в зависимости от его цели.

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

Я не думаю (не исследовал), что аварийные сигналы ядра сработают при изменении системного времени. Системы, которые их используют, могут быть безопасными.

Решения

Осторожно двигайте время. Это можно найти в документации вашего любимого решения времени.

Джоффри
источник
1
Это отличный ответ, и я ценю узнать больше о хранении времени. Я не выбрал его, потому что он не дал четкого решения моей нынешней задачи по настройке времени на моем производственном сервере баз данных. +1 для обучения меня вещам.
суперспирант