Как установить синхронизацию часов в облаке (AWS, heroku и т. Д.) На многих узлах?
Я хотел бы запустить большой кластер узлов в облаке (AWS, Heroku или, возможно, VMS с автономным управлением), часы которого должны быть синхронизированы с заранее заданным допуском. Я ищу допуск около 200 мс. Это означает, что если у меня 250 узлов, наибольшая разница тактов между любыми 250 узлами никогда не должна превышать 200 мс. Я действительно не забочусь о фактической дате / времени относительно мира. Решение должно быть отказоустойчивым и не должно полагаться на точность часов какой-либо одной системы - фактически, вероятно, что ни один из часов не будет очень точным.
Требование достаточно строго, если по какой-либо причине синхронизация часов определена как ненадежная для какого-либо конкретного узла, я бы предпочла удалить узел из кластера из-за десинхронизации часов - так что при любом предполагаемом сбое я бы хотел бы иметь возможность выполнить какой-то тип контролируемого отключения этого узла.
Я хотел бы использовать что-то вроде NTP, но в соответствии с известными проблемами NTP twiki:
NTP не был разработан для работы внутри виртуальной машины. Это требует системных часов с высоким разрешением, с временем отклика на прерывания тактового генератора, которые обслуживаются с высоким уровнем точности. Ни одна из известных виртуальных машин не отвечает этим требованиям.
И хотя тот же твик затем описывает различные способы решения ситуации (например, запуск ntp на операционной системе хоста), я не верю, что у меня будет возможность достаточно изменить среду, используя AWS или horoku, чтобы соответствовать обходные пути.
Даже если я не работал на виртуальных машинах, доверенный менеджер операций, имеющий многолетний опыт работы с ntp, говорит мне, что ntp может и будет сбрасывать синхронизацию (или просто неправильно указывать время) из-за плохого локального отклонения тактовой частоты время от времени. Это случается не часто, но это случается, и когда вы увеличиваете количество машин, вы увеличиваете свои шансы на это. AFAIK, определение того, насколько далеко вы находитесь, требует остановки ntpd, запуска команды режима запроса и повторного запуска его, и получение ответа может занять много времени.
Подводя итог - мне нужна синхронизация часов, основная цель которой заключается в следующем:
- Хорошо работает в виртуальных машинах, где ограничен оперативный контроль (например, "поставщики облачных услуг")
- Допуски по времени в кластере около 200 мс между всеми участниками
- Способность обнаруживать плохой узел и активно на него реагировать
- Отказоустойчивость (без единой точки отказа)
- Масштабируемость (вещь не может упасть, когда вы добавляете больше узлов - определенно избегайте n^2)
- Может поддерживать сотни узлов
- Ни один из узлов не должен рассматриваться как имеющий превосходящее представление о времени по сравнению с любым другим узлом
- Это нормально для всего кластера дрейфовать (в пределах разумного) - пока он дрейфует в унисон
Из описания кажется, что алгоритм Беркли может быть правильным выбором, но реализован ли он уже?
Приятно иметь:
- Минимальная конфигурация (узлы автоматически регистрируются для участия) - важно для раскрутки новых узлов
- Панель инструментов HTML или (REST?) API, который сообщает узлы, которые участвуют в синхронизации часов, и каковы относительные смещения времени
- Красивые графики?
2 ответа
Поскольку в разделе часто задаваемых вопросов для 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.
После многих месяцев борьбы с NTP на виртуальных машинах мы переключились с помощью хроники https://chrony.tuxfamily.org/. Я обнаружил, что он намного превосходит ntpd во многих отношениях (конфигурация, управление, документирование, проблемы с обработкой, когда часы vm часто и радикально дрейфуют).
Используй хронику и не оглядывайся назад:)