Я хотел бы запустить большой кластер узлов в облаке (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, который сообщает узлам, участвующим в синхронизации часов, и относительные смещения времени
- Довольно графы?