Поскольку в разделе часто задаваемых вопросов для NTP конкретно указывается, почему синхронизация времени NTP не работает «правильно» на виртуальных машинах, это, вероятно, непреодолимая проблема.
Большинство машин имеют RTC (реальныйчасы на них, на ПК это то, как вы сохраняете время, чтобы у вас было «грубое» предположение о том, какое время, если ntp недоступен, после загрузки системы есть «тиковые» часы с более высоким разрешением- это то, что устанавливает NTP.
Эти тактовые часы подвержены дрейфу виртуальной машины, поскольку тики могут происходить или не происходить с правильными интервалами - любой механизм времени, который вы пытаетесь использовать, будет подвержен этому дрейфу.
Вероятно, неоптимальный дизайн - попытаться применить синхронизацию ntp на виртуальных машинах, если дельта машины A и B равна 200 мс, а дельта компьютеров B и C равна 200 мс, а C может находиться на расстоянии 400 мс от A. Вы не можете контролироватьтот.
Вам лучше использовать централизованную систему обмена сообщениями, например, zeromq, чтобы синхронизировать всех с очередью заданий, это будет более затратно, но полагаться на время системного тика в лучшем случае непросто.Существует много кластерных решений, в которых учитывается участие кластера с использованием всевозможных надежных механизмов, обеспечивающих синхронизацию всех, взгляд на коросинхронизацию или распространение. Они уже решили это для таких вещей, как двухфазные фиксации.
Между прочим, ntp «сдаваться», когда дрейф слишком велик, можно обойти, дав ему команду «хлопать» время до нового значения, а не «убивать».По умолчанию ntp будет постепенно обновлять системное время, чтобы учесть его отклонение от «реального времени».Я забыл, как настроить это в ntpd, но если вы используете ntpdate, флаг -B
-B Force the time to always be slewed using the adjtime(2) system call, even if the measured
offset is greater than +-128 ms. The default is to step the time using settimeofday(2) if the offset
is greater than +-128 ms. Note that, if the offset is much greater than +-128 ms in this case, it
can take a long time (hours) to slew the clock to the correct value. During this time, the host
should not be used to synchronize clients.