Как установить синхронизацию часов в облаке (AWS, heroku и т.д.) На многих узлах?

Я хотел бы запустить большой кластер узлов в облаке (AWS, Heroku или, возможно, самоуправляемый VMS), чьи часы должны синхронизироваться с предопределенным допуском. Я ищу терпение, возможно, 200 мс. Это означает, что если у меня 250 узлов, наибольшая разница между часами между любым из 250 узлов не должна превышать 200 мс. Меня не волнует фактическая дата/время по отношению к миру. Решение должно быть отказоустойчивым и не должно полагаться на точность часов в любой системе - на самом деле, вероятно, что ни один из часов не будет ужасно точным.

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

Я бы хотел использовать что-то вроде NTP, но в соответствии с NTP известные проблемы twiki:

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

И хотя один и тот же twiki затем описывает различные способы решения ситуации (например, запуск ntp на ОС хоста), я не верю, что у меня будет возможность достаточно модифицировать среду с помощью AWS или на horoku для соблюдения обходных решений.

Даже если бы я не работал в виртуальных машинах, надежный менеджер операций, у которого есть многолетний опыт работы с ntp, говорит мне, что ntp может и может отказаться от синхронизации (или просто получить время неправильно) из-за плохого локального дрейфа часов каждый раз в в то время как. Это происходит не часто, но это происходит, и по мере увеличения количества машин вы увеличиваете свои шансы на это. AFAIK, обнаруживая, как далеко от вас требуется остановить ntpd, запустить команду режима запроса и снова запустить ее обратно, и может потребоваться много времени, чтобы получить ответ.

Подводя итог - мне нужна синхронизация часов, основной задачей которой является следующее:

  • Хорошо работает на виртуальной машине, где операционный контроль ограничен (т.е. "поставщики облачных услуг" )
  • Допуски по времени в кластере около 200 мс между всеми участниками.
  • Возможность обнаруживать плохие node и реагировать на это активным способом
  • Отказоустойчивость (без единой точки отказа)
  • Масштабируемость (вещь не может упасть, когда вы добавляете больше узлов - обязательно избегайте n ^ 2)
  • Может поддерживать сотни узлов
  • Ни один из узлов не должен считаться превосходным понятием времени над любым другим node
  • Это нормально, чтобы весь кластер дрейфовал (в пределах разумного) - до тех пор, пока он дрейфует в унисон

Из описания кажется, что алгоритм Berkeley Algorithm может быть правильным выбором, но он уже реализован?

Приятно пользоваться имуществом:

  • Минимальная конфигурация (узлы автоматической регистрации для участия) - важно для вращения новых узлов
  • API-интерфейс HTML или (REST?) API, который сообщает узлам, участвующим в синхронизации часов, и относительные смещения времени
  • Довольно графы?

Ответ 1

Поскольку FAQ для NTP, конкретно указывает, почему синхронизация времени NTP не работает "справа" в виртуальных машинах, это, вероятно, непреодолимая проблема.

Большинство машин имеют в них RTC (часы реального времени), на компьютерах - то, как вы храните время, так что у вас есть "грубая" догадка о том, что такое время, если ntp недоступен, как только система загружена есть часы "тика", которые имеют более высокое разрешение - это то, что устанавливает NTP.

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

Вероятно, субоптимальный дизайн попытается обеспечить синхронизацию ntp на виртуальных машинах, если машины A и B имеют дельта 200 мс, а машина B и C имеют дельта 200 мс, C может в 400 мс от A. Вы не можете контролируйте это.

Вам лучше использовать централизованную систему обмена сообщениями, такую ​​как zeromq, чтобы держать всех в синхронизации с очередью заданий, и это будет больше накладных расходов, но полагаться на время тика системы - это, в лучшем случае, хитрое дело. Существует множество решений для кластеризации, которые учитывают кластерное участие, используя всевозможные надежные механизмы, обеспечивающие синхронизацию каждого пользователя, взгляд на corosync или распространение - они уже решили это для вещей, таких как двухфазные коммиты.

Кстати, 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.