Я хотел бы запустить большой кластер узлов в облаке (AWS, Heroku или, может быть, самоуправляемая VMS), чьи часы должны быть синхронизированы с учетом предопределенного допуска. Я ищу допуск, может быть, 200 мс. Это означает, что если у меня 250 узлов, наибольшая разница в часах между любым из 250 узлов никогда не должна превышать 200 мс. Меня не волнует фактическая дата/время по отношению к миру. Решение должно быть отказоустойчивым и не должно полагаться на точность часов какой-либо одной системы — на самом деле вполне вероятно, что ни одно из часов не будет ужасно точным.
Требование достаточно сильное, когда, если по какой-либо причине синхронизация часов будет определена как ненадежная для какого-либо конкретного узла, я бы предпочел удалить узел из кластера из-за десинхронизации часов, поэтому при любом подозрении на сбой я бы например, чтобы иметь возможность выполнять некоторый тип контролируемого отключения этого узла.
Я хотел бы использовать что-то вроде NTP, но согласно известным проблемам twiki:
NTP не предназначен для работы внутри виртуальной машины. Для этого требуются системные часы с высоким разрешением и временем отклика на прерывания часов, которые обслуживаются с высокой точностью. Ни одна известная виртуальная машина не способна удовлетворить этим требованиям.
И хотя в той же вики затем описываются различные способы решения ситуации (например, запуск ntp на хост-ОС), я не верю, что у меня будет возможность достаточно изменить среду с помощью AWS или на хороку, чтобы соответствовать требованиям. обходные пути.
Даже если бы я не работал на виртуальных машинах, доверенный операционный менеджер, имеющий многолетний опыт работы с ntp, сказал мне, что ntp может и будет прерывать синхронизацию (или просто ошибаться во времени) из-за плохого дрейфа локальных часов время от времени. Это случается нечасто, но случается, и по мере увеличения количества машин вы увеличиваете свои шансы на это. Насколько я знаю, для определения того, насколько далеко вы находитесь, требуется остановить ntpd, запустить команду режима запроса и снова запустить ее, и получение ответа может занять много времени.
Подводя итог - мне нужна синхронизация часов, основная цель которой заключается в следующем:
- Хорошо работает в виртуальных машинах, где операционный контроль ограничен (например, «поставщики облачных услуг»)
- Допуски по времени в кластере около 200 мс между всеми участниками
- Способность обнаруживать плохой узел и активно реагировать на это
- Отказоустойчивость (отсутствие единой точки отказа)
- Масштабируемость (вещь не может упасть, когда вы добавите больше узлов - определенно избегайте n ^ 2)
- Может поддерживать сотни узлов
- Ни один из узлов не следует рассматривать как обладающий превосходным представлением о времени по сравнению с любым другим узлом.
- Это нормально, если весь кластер дрейфует (в разумных пределах) — пока он дрейфует в унисон.
Судя по описанию, алгоритм Беркли может быть здесь правильным выбором, но реализовано?
Приятно иметь:
- Минимальная конфигурация (узлы автоматически регистрируются для участия) — важно для запуска новых узлов.
- Панель инструментов HTML или (REST?) API, который сообщает об узлах, которые участвуют в синхронизации часов, и каковы относительные смещения времени.
- Красивые графики?