4h4-auto.ru

4х4 Авто
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Синхронизацию времени с удаленным сервером

Синхронизацию времени с удаленным сервером

> * напротив LOCAL говорит о том что синхронизация происходит с самим собой.
> И никаким боком он синхронизировать время с 10.38.0.9.

Добавить:
server 127.127.1.0
restrict 127.127.1.0 mask 255.255.255.255 nomodify noquery notrap
fudge 127.127.1.0 stratum 10 refid LCL

restrict default ignore
restrict -6 default ignore

> server 10.38.0.9
> driftfile /var/lib/ntp/drift
> logfile /var/log/ntpd.log

Классику жанра надо почитать и конфиг дописать:
https://wiki.archlinux.org/index.php/Network_Time_Protocol_d. (п═я┐я│я│п╨п╦п╧)

> Добавить:
> server 127.127.1.0
> restrict 127.127.1.0 mask 255.255.255.255 nomodify noquery notrap
> fudge 127.127.1.0 stratum 10 refid LCL
> restrict default ignore
> restrict -6 default ignore

Добавил, в итоге получился вот такой конфиг

С ним ntpq вообще ничего не возвращает

> Классику жанра надо почитать и конфиг дописать:
> https://wiki.archlinux.org/index.php/Network_Time_Protocol_d. (п═я┐я│я│п╨п╦п╧)

Все так говорят, читал, все делал и по готовым конфигам и сам составлял только все равно не работает.

>> Классику жанра надо почитать и конфиг дописать:
>> https://wiki.archlinux.org/index.php/Network_Time_Protocol_d. (п═я┐я│я│п╨п╦п╧)
> Все так говорят, читал, все делал и по готовым конфигам и сам
> составлял только все равно не работает.

Подозреваю, что работает, просто ты попался с переводом слова «clock».

«synchronize the software clock» совсем не означает, что часы будут показывать одно и то же время. ntpd синхронизирует частоту «программного таймера», а не текущее значение счётчика.

Ты непрерывно вычисляешь дрейф своего таймера, чтобы поправлять его и его частота совпадала с вышестоящим. Когда получаешь достаточную точность частоты, подводишь стрелки (с помощью ntpdate), чтобы совпало значение текущего времени.

Продолжаешь вычислять дрейф.

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details. The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
# might also be helpful.
#
# Note that «restrict» applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

restrict 10.38.0.9 default kod notrap nomodify nopeer noquery

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

> restrict 10.38.0.9 default kod notrap nomodify nopeer noquery
> restrict 127.0.0.1
> restrict ::1

Добавил Ваше замечание в свой конфиг, в итоге получилось следующее:

С таким конфигом вообще не получает ответ от сервера времени. ntpq -p показывает следующее:

# ntpq -p
> remote refid st t when poll reach delay offset jitter
> ==============================================================================
> 10.38.0.9 .INIT. 16 u — 64 0 0.000 0.000 0.000

^^^^^^
Этот сервер не доступен . Если через некоторое время значение reach увеличиться до 377 ,
то этого будет достаточно для синхронизации. Вернее статистических данных для
синхронизации.

> LOCAL(0) .LCL. 10 l 22 64 3 0.000 0.000 0.001

^^^^^
Сервер доступен, но мало статистики, надо подождать.

>[оверквотинг удален]
> увеличиться до 377 ,
> то этого будет достаточно для синхронизации. Вернее статистических данных для
> синхронизации.
>> LOCAL(0) .LCL. 10 l 22 64 3 0.000 0.000 0.001
>
>
>
>
> ^^^^^
> Сервер доступен, но мало статистики, надо подождать.

Сервер не доступен только с этим конфигом, в первом посте привожу что сервер как раз доступен но синхронизация по какой то причине не проходит.

> Сервер не доступен только с этим конфигом, в первом посте привожу что
> сервер как раз доступен но синхронизация по какой то причине не
> проходит.

1. Посмотрите tcpdump’ом обмен пакетами по протоколу ntp между компьютерами.
2. В конфиге по умолчанию все запрещено
restrict default ignore
restrict -6 default ignore

Необходимо настроить access control для IP адресов в ntp.conf , например:
restrict 10.38.0.9 mask 255.255.255.255 kod notrap nomodify noquery

Посмотрите пост 8 и почитайте man ntp.conf

server 10.38.0.9 prefer iburst maxpoll 9

> 1. Посмотрите tcpdump’ом обмен пакетами по протоколу ntp между компьютерами.

Я новичек, что именно я должен там увидеть?

> 2. В конфиге по умолчанию все запрещено
> restrict default ignore
> restrict -6 default ignore
> Необходимо настроить access control для IP адресов в ntp.conf , например:
> restrict 10.38.0.9 mask 255.255.255.255 kod notrap nomodify noquery

Я делал конфиг с единсвтенной строкой server 10.38.0.9 это работает на другой, соверщенно сторонней машине. Мне ненадо что бы этот сервер сам потом раздавал время, мненадо только что бы он сам синхронизировался.

>> 1. Посмотрите tcpdump’ом обмен пакетами по протоколу ntp между компьютерами.
> Я новичек, что именно я должен там увидеть?

🙁
Пакеты должно ходить между компьютерами.
# tcpdump -n -i «имя сетевого интерфейса» ‘port 123’

>> 2. В конфиге по умолчанию все запрещено
>> restrict default ignore
>> restrict -6 default ignore
>> Необходимо настроить access control для IP адресов в ntp.conf , например:
>> restrict 10.38.0.9 mask 255.255.255.255 kod notrap nomodify noquery
> Я делал конфиг с единсвтенной строкой server 10.38.0.9 это работает на другой,
> соверщенно сторонней машине.

Повторите конфигурацию на нужной машине и закройте тему.
Если не получиться, то еще раз читайте man ntp.conf и посты.
Вам всё неоднократно написали.

> Мне ненадо что бы этот сервер сам потом
> раздавал время, мненадо только что бы он сам синхронизировался.

Используйте для этого restrict xxx.yyy.zzz.mmm mask .

> 🙁
> Пакеты должно ходить между компьютерами.
> # tcpdump -n -i «имя сетевого интерфейса» ‘port 123’

Вы издеваетесь? ntpdate спокойно синхронизиурет время, ntpd видит сервер и показывает разницу с ним. Это не подтверждение того, что пакеты ходят? Что еще мне покажет tcpdump?

> Повторите конфигурацию на нужной машине и закройте тему.
> Если не получиться, то еще раз читайте man ntp.conf и посты.
> Вам всё неоднократно написали.

Очень жаль что Вы так и не удосужились прочитать суть моего самого первого поста, или не можете себе представить что и на линуксе могут быть не «типичные проблемы».
На свежеставленом редхате для того что бы работала синхронизация достаточно в конфиге 1 единсвтенно стороки server IP_ADR и синхронизация будет работать. В моем случае не работает, и именно по этому я создал эту тему, что бы местные гуру помогли мне с АНАЛИЗОМ проблеммы, как правильно докопаться до сути. А по итогу Вы мне потыкали шаблонными фразами ну и разумеется «читайте ман». Да почитали уж, не дурнее паровоза.

> Вы издеваетесь? ntpdate спокойно синхронизиурет время, ntpd видит сервер и показывает разницу
> с ним.

Читайте man ntpd
.
-g Normally, ntpd exits with a message to the system log if the off-
set exceeds the panic threshold, which is 1000 s by default.
.
-q Exit the ntpd just after the first time the clock is set. This
behavior mimics that of the ntpdate(8) program, which is to be
retired. The -g and -x options can be used with this option.
Note: The kernel time discipline is disabled with this option.
.

Читайте man ntp.conf
.
iburst When the server is unreachable, send a burst of eight packets
instead of the usual one. The packet spacing is normally 2 s;
however, the spacing between the first two packets can be changed
with the calldelay command to allow additional time for a modem
or ISDN call to complete. This is designed to speed the initial
synchronization acquisition with the server command and s
addresses and when ntpd(8) is started with the -q option.

server 10.38.0.9 prefer iburst maxpoll 9

> Это не подтверждение того, что пакеты ходят? Что еще
> мне покажет tcpdump?

Полагаю, что недостаточное подтверждение.
ntpdate и ntpd разные программы, реакция последней на
пришедшие пакеты зависит от конфига.

> Очень жаль что Вы так и не удосужились прочитать суть моего самого
> первого поста, или не можете себе представить что и на линуксе
> могут быть не «типичные проблемы».

Проблема типичная для «новичков» — это нежелание внимательно читать посты и man.
В посте 14 приведен рабочий конфиг, Вам только необходимо было подправить под свои нужды.

> На свежеставленом редхате для того что бы работала синхронизация достаточно в конфиге
> 1 единсвтенно стороки server IP_ADR и синхронизация будет работать. В моем
> случае не работает, и именно по этому я создал эту тему,
> что бы местные гуру помогли мне с АНАЛИЗОМ проблеммы, как правильно
> докопаться до сути. А по итогу Вы мне потыкали шаблонными фразами
> ну и разумеется «читайте ман». Да почитали уж, не дурнее паровоза.

Плохо читали.
Я Вам уже писал, что параметры в ntp.conf меняли свой функционал в зависимости
от версии ntpd. Хотелось бы посмотреть версию ntpd, опции запуска ntpd, ntp.conf ,
время в CMOS, лог ntpd. Включите логирование (см. пост 14).
Записываете Вы хотя бы раз в сутки правильно время в CMOS?
Иначе часы в CMOS могут сильно убежать.

> А что дает ntpdate -q 10.38.0.9 на выходе? Какой стратум?

root@s3800r12

# ntpdate -q 10.38.0.9
server 10.38.0.9, stratum 1, offset -53.888388, delay 0.04138
10 Mar 12:00:27 ntpdate[26150]: step time server 10.38.0.9 offset -53.888388 sec

# ntpq -p
> offset
>=======
>-47136.
> По итогу время так и не синхронизируется автоматом.
> Куда копать ребята, что проверять?

Может, разница слишком велика на вкус ntpd?
Сделай сначала установку с ntpdate (или как тамм, ntpqd -gqx ?), потом запускай ntpd.

> Может, разница слишком велика на вкус ntpd?
> Сделай сначала установку с ntpdate (или как тамм, ntpqd -gqx ?), потом
> запускай ntpd.

Строго говоря у меня 2 одинаковых сервера, 1 сервер приложений, 2 БД.
На сервере приложений совершенно аналогичная проблема и там я предварительно делал ntpdate 10.38.0.9 синхронизация прошла успешно, однако все равно после этого ntpd синхронизироваться не хочет.

> однако все равно после этого ntpd синхронизироваться не хочет.

Фаервол выруби, или настрой правильно.

Ах да, после того как стартанёшь сервер, покури минут 15-20
и только потом запускай ntpq -p.

>> однако все равно после этого ntpd синхронизироваться не хочет.
> Фаервол выруби, или настрой правильно.
> Ах да, после того как стартанёшь сервер, покури минут 15-20
> и только потом запускай ntpq -p.

Фаервол не используется.

У меня так, раздаёт 172.16/ сети без проблем, время берёт с ntp.org

# ntpdate -q 172.16.0.1
server 172.16.0.1, stratum 3, offset 0.000020, delay 0.02573
10 Mar 12:20:38 ntpdate[8277]: adjust time server 172.16.0.1 offset 0.000020 sec

# ntpdate -q 127.0.0.1
server 127.0.0.1, stratum 3, offset -0.000017, delay 0.02579
10 Mar 12:20:46 ntpdate[9255]: adjust time server 127.0.0.1 offset -0.000017 sec

> jitter
> 20.632
> Куда копать ребята, что проверять?

jitter что-то великоват для первого stratum

Столкнулся с той-же проблемой на виртуалке с FreeBSD 8.1-RELEASE (ядро пересобранное). До этого не одну машину и сеть с ntpd настроил. Пока копаю. Думаю где-то в сторону кода 9014 в столбце status вывода ntpq -c as
Ну и раньше использовал в конфиге sync_on_start, а теперь выключил. Может это как-то влияет. Сейчас проверяю версию, что за время набора демоном статистики (reach) по пиру offset успевает превысить умолчальный порог в 1000 секунд. Возможно при старте с немедленной синхронизацией скачком пир выбирается сразу без набора статистики и потом уже не отпускается.

А от советов некоторых советчиков (похожих на бездумных копипастеров конфигов) хочется поржать. Хоть бы вникли, что дают restrict и fudge с локалсорцем и каким боком они сюда относятся. И ладно бы вели себя скромнее или правы были. А так гонору как у «академиков», а объективности и связи с темой — ноль без палочки.

Ну вот, пока писал, вариант «не успевает набрать статистику» проверил. Reach уже давно и стабильно 377 (максимум), offset за это время стал около 200 секунд (пятая часть от трешолда). Т. е. причина реджекта не в оффсете, а в чём-то другом.

> Столкнулся с той-же проблемой на виртуалке с FreeBSD 8.1-RELEASE (ядро пересобранное).

Нашёл у себя причину в VBoxService из пакета (или порта — не помню) дополнений VirtualBox’а для гостевых ОС. Если его запустить без ключа —disable-timesync, то он что-то где-то ломает или под себя перестраивает. После этого его можно остановить, запустить ntpd и получить описанную проблему. Перезагрузка это лечит. Для железных машин в инете рекомендуют попробовать смену таймеров. Их обычно в системе несколько и можно выбирать через sysctl или ещё где-то. Бывает часть таймеров подглючивает и ntpd не может что-то типа подстроиться под частоту.

Код 9014 искать не надо. Это составное шестнадцатиричное слово предоставляет информацию, которую видно и так (пир взят из конфига и находится в состоянии reject). Т.е. для диагностики этот статус бесполезен, а алгоритм его расшифровки не интуитивен.

Синхронизация времени с NTP сервером через GSM модем

Суть получения времени с NTP сервера сводится к посылки на него пустого(любого) UDP пакета. В ответ удаленный сервер вернет количество секунд, начиная с 1 января 1900года. Реализация отправки пакета на GSM модуле SIM сводится к нескольким этапам. Вначале необходимо зарегистрироваться в GPRS сети АТ командой, далее открыть соединение с удаленным сервером, затем послать сообщение, принять данные о времени и закрыть соединение. Полученные данные(четыре байта) необходимо преобразовать в формат хотя бы ЧЧ/ММ/СС, хотелось бы и дни и месяцы с годами определять, но мне достаточно знать часы, минуты и секунды. Время полученное с сервера пишем прямо в часы реального времени, которые есть в том же GSM модуле.

АТ команды работы GPRS в порядке их работы:

1)AT+CGATT=1 — команда регистрации в сети GPRS. Вернет ОК в случае успешной регистрации.
Реализующий её макрос:

Константы необходимые макросу:

Аналогично вычисляются остальные настройки.

3) Далее необходимо указать в каком виде будет вводится имя сервера:
AT+CDNSORIP=1-доменное имя сервера.
AT+CDNSORIP=0- имя сервера в виде IP адреса.
Будем использовать AT+CDNSORIP=1 так как IP адреса могут меняться.

Константа для макроса:

4) Открываем соединение.
AT+CIPSTART=”mode”,”domain name”,”port”
Здесь mode тип нашего протокола TCP либо UDP. NTP сервер поддержует UDP протокол.
domain name – адрес НТП сервера. Вот список известных мне НТП серверов:
ntp1.vniiftri.ru
ntp1.vniiftri.ru

port – порт по которому хотим послать запрос. Здесь я наткнулся на проблему. В описания везде указуют порт 123, но по нему ответ не приходит. Отвечает порт 37. Поэтому не удивляйтесь, что у меня не стандартный порт 123 а порт 37(!). Если Ты сможешь разобраться в этой заморочке, расскажи, я писал в несколько фирм, но некто мне не дал четкого ответа. Вообще NTP протокол разный, есть старые версии и есть более новые, вот по 37 порту идет старая версия протокола, вроде бы по 123 порту другой формат протокола, но при попытке послать пустой UDP пакет на 123 порт, в ответ нечего не приходит((. Поэтому я пользуюсь 37.

Команду открытия соединения реализуют два макроса:

Длина строки с НТП именем сервера также хранится в EEPROM и вычисляется аналогично настройкам GPRS.

Следует сказать, что у Нас два НТП сервера и в случае не удачи с первым можно попробовать со вторым.

После всех настроек можно попробовать коннект.

5) Прежде всего регистрируемся в сети GPRS командой AT+CGATT.

В последних трех строках Мы пробуем открыть соединение с NTP сервером по протоколу UDP на 37 порт.

6)Теперь если соединение удастся Нам вернется «0», это ОК (так как мы отключили текстовый информационный ответ от модуля командой ATV=0).
Проверяем ответ от модуля.

Далее если сервер готов к обмену данными он возвращает «8», это CONNECT OK

Если соединение не получится вернется:
4 – ERROR обычно этот ответ говорит о неверном адресе, порте и протоколе.
3 или 9 возвращается, если сервер занят.

Проверяем ответ от сервера.

Если все нормально попробуем послать UDP пакет.
7) Для передачи сообщений удаленному серверу существует команда

Реализуем её макросом

После ввода команды нужно дождаться приглашения для ввода сообщения.
Это знак > .

Чтобы получит овеет от NTP сервера необходимо отправить пустой UDP пакет.

usart0_write(0x1A); //Отправляем пустое сообщение.

В ответ от удаленного сервера могут вернуться следующие сообщения:

SEND OK -сообщение отправлено(но может не доставлено UDP же);
ERROR – соединение не установлено или отключено;
SEND FAIL – передача сообщения не прошла.

Причем эти сообщения будут в текстовом виде, в независимости от формата ответа модема (ATV=1 или ATV=0).

Проверяем ответ от сервера.

Проверка ответа реализована проверкой символа не встречающихся в этих сообщениях
SEND OK
SEND FAIL
ERROR

После получение подтверждения об отправке сообщения необходимо дождаться ответа от NTP сервера. Ответ прейдет четырьмя байтами, это количество секунд, начиная от 1 января 1900 года. Может случится что ответ будет приходит в течении секунды, может в течении часа, а может и вообще не прейти, так как используется UDP протокол, который не гарантирует доставку сообщения.

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

8) Получаем время от сервера.

Теперь как ответ получен в виде четырех байт, его необходимо расшифровать. Я не заморачивался с вычислением года, месяца и дня. Достаточно занести эти настройки в RTC и периодически обновлять час, минуту и секунду RTC.

9) Для преобразования времени к формату ЧЧ/ММ/СС нужно целочисленно разделить полученный код на 86400. Это количество секунд в сутках, далее целочислено умножить этот ответ на 86400 и вычисть из полученного кода полученный ответ. В результате проделанной операции мы получим остаток секунд от полуночи, а далее вычисляем минуты и часы.

В переменных isec, ihours и imin находится время прямом формате.
Для того чтобы занести время в RTC модуля необходимо преобразовать его в BCD формат. Для чего я написал функцию делающее это преобразование BCDFormat(uint8_t hex) и обратное преобразование HEXFormat(uint8_t bcd). Я также прилагаю файл BCD.h.

В конце программы встречается макрос закрывающий соединение.
CIPSHUT
Вот его описание

Макрос завершает соединение и после его выполнения придет ответ
”0” — SHUT OK — соединение закрыто успешно
или
“4” – ERROR – соединение и не открывалось.

Синхронизация (часов) между двумя удаленными компьютерами

Я изучаю возможность записи простой синхронизации в мое приложение, и одна из проблем, которая возникла, — это синхронизация времени между двумя удаленными компьютерами, каждый со своими часами (в частности, в отношении дат изменения файлов/объектов).

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

например, начало всегда использовать универсальное время (UTC), что позволяет избежать проблем с часовыми поясами, но нет никакой гарантии, что два компьютера будут иметь точно такое же системное время. К счастью, работа, которую я делаю, не очень тонкая, так что это не очень важная проблема, но мне все равно любопытно.

одним из решений было бы всегда использовать одни и те же часы на обоих концах, такие, как глобальное время сервера, а не локальные системные часы. Предположительно, это (в сочетании с блокировками общих ресурсов) не может гарантировать случайное перекрытие синхронизированного времени, но это не очень практично.

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

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

9 ответов

полагаться на NTP для вашего применения по мере того как другие рекомендовали легкая помадка. Правильный подход — использовать алгоритм распределенной синхронизации часов Lamport. Это объясняется в его классической статье 1978 года время, часы и порядок событий в распределенной системе.

вы можете попробовать PTP, протокол точного времени (PTP) — это протокол, используемый для синхронизации часов по всей компьютерной сети. На локальной сети оно достигает точности часов в ряде sub-микросекунды, делая его соответствующим для измерения и систем управления. http://en.wikipedia.org/wiki/Precision_Time_Protocol

вместо написания кода для синхронизации часов, не было бы возможно просто запустить клиент ntp на обеих машинах?

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

синхронизировать их с NTP Протокол Сетевого Времени.

на какой платформе ты?

с NTP вы можете синхронизировать время ваших компьютеров с атомными часами и использовать официальное время мира.

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

1) не хватает вычислительных знаний, чтобы иметь возможность настроить синхронизацию времени ntp

2) установите свои часы компьютерного времени на домашние часы или часы мобильного телефона, которые неверны

3) в Windows XP случайно отключить синхронизацию времени ntp и не знать, как включить его снова, или их дата компьютера установлена неправильно, в этом случае Windows ntp не работает

4) Аккумулятор bios компьютера разрядился, поэтому ПК всегда запускается в 1970 году!

5) пользователь берет свой ноутбук за границу и временно устанавливает часы ноутбука в местное время, но не меняет часовой пояс, поэтому теперь ПК вернет неправильное время utc.

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

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

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

1) Когда ваше приложение запускается, оно синхронизирует свое собственное внутреннее время utc с ntp через soap-вызов третьему сервер партии или к вашему собственному серверу времени (который вы можете сами держать на времени с ntp).

2) После этого он добавляет истекшее время от системных часов для поддержания времени. Если требования строги, то вы можете повторить синхронизацию ntp на интервалах.

3) затем приложение просматривает список будущих заданий, которые ему нужно сделать вовремя. Он должен знать самую раннюю работу.

4) Затем он создает поток, который он помещает в спящий режим для длины время впереди самой ранней работы, меньше запаса прочности, который в зависимости от ваших требований может быть 10 минут заранее, час или два заранее и т. д.

5) когда поток просыпается, он перепроверяет абсолютное время с дальнейшим вызовом soap, а затем полагается на системные часы времени, чтобы добавить истекшее время, пока он не достигнет времени, когда первое задание должно быть выполнено.

6) Как только задание запускается (запустите его в другом потоке), поток мониторинга времени вычисляет следующее время задачи вперед и снова засыпает на время.

1) пользователь может закрыть приложение до выполнения задания, поэтому вам может понадобиться фоновый процесс или служба, которая использует ту же схему синхронизации выше, чтобы независимо отслеживать списки заданий, хранящиеся в базе данных или файле, и вовремя запускать приложение. (В Windows, spawn процесс приложения)

2) приложения возможно добавление новых, более ранних заданий на лету или удаление заданий, поэтому ваш спящий поток, вероятно, должен быть пробужден для пересчета для нового более раннего задания или для задания, следующего за удаленным заданием. В Win32 вы бы сделали это, ожидая поток с таймаутом на событие, которое вы установили, чтобы заставить его пересчитать время сна. В Linux, без сомнения, есть аналогичный механизм.

3) для вызова Soap, чтобы получить время, обратите внимание, когда отправляется Soap и когда ответ получаемый. Если время оборота слишком велико, вы не можете полагаться на время и, возможно, потребуется повторить вызов, или вы можете пойти на компромисс. Например, если Soap говорит, что компьютерные часы 5 минут быстро, но сам вызов Soap занял минуту, чтобы ответить, то вы можете только сказать наверняка, что компьютерные часы по крайней мере 4 минуты быстро.

одна вещь, которую мы делаем, это, по существу, разгрузить все операции синхронизации на «хост-машину». Например, если у вас есть 20 серверов, которые все разделяют БД, используйте время БД. Если у вас есть центральный сервер и миллион клиентских машин, то клиентские машины не должны отвечать за синхронизацию чего-либо; выполняйте всю синхронизацию на стороне сервера. В действительно «распределенной» среде, такой как сеть P2P или что-то еще, используйте машину, которая наиболее непосредственно «владеет» данным ресурсом (фактический ПК файл вы хотите написать) для синхронизации/управления доступом к файлу.

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

Не используйте NTP. NTP предназначен только для получения даты/времени.

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

для приложений, которые имеют прямую связь, общий доступ к ресурсу, используйте часы lamport или векторные часы, как сказал Диомидис. Часы Lamport отлично работают для достижения частичного порядка между событиями, векторные часы отлично подходят, когда вам нужно идентифицировать параллельные события.

Настройка синхронизации времени между серверами.

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

Начнём с того, что время между серверами синхронизировать не просто можно, но и нужно. Практически в обязательном порядке. В том случае, если время на серверах (логических разделах) сильно разнится, то вы рискуете получить огромное количество проблем. И что самое забавное, не всегда источник этих проблем можно будет определить. Самый простой пример — Kerberos. В случае рассинхронизации времени между клиентом, сервером Kerberos, и сервером приложений, вполне вероятна ситуация, когда клиент не сможет получить сервис у сервера приложений. И это не смотря на то, что тикет с Kerberos сервера будет успешно получен. Почему? Да потому что, серверу приложений может показаться что тикет клиента устарел ещё пол-часа назад. А всё из-за разницы во времени. И это самый простой пример. Можно упомянуть и HACMP c delay timers. И стандартные системы аутентификации AIX (начиная с compat и заканчивая LDAP). И многое, многое другое… Будем считать, что в необходимости синхронизации времени мы вас убедили. 🙂

Роли серверов:
Сервер(server) – по запросу дает точное время клиентам. Роль могут брать на себя сервера различного уровня (stratum).
Пир(peer) – берет время с сервера и по запросу может его отдавать. Обычно эта роль может применяться для серверов с уровнем 1 или 2.
Клиент – компьютеры, которые получают время от серверов с низким уровнем(обычно 1 или 2), но никогда его не отдает.

Несколько слов о безопасности NTP. NTP при работе использует UDP и TCP. Порт 123. Очень важно правильно настроить firewall в вашей сети. В противном случае вы рискуете нарваться на атаку «компрометация сервера времени». Что чревато отказом в обслуживании со стороны серверов приложений и серверов аутентификации. Да и внешний источник времени надо выбирать аккуратно. По тем же причинам.
Для повышения уровня безопасности можно в конфигурационный файл добавить строку:
restrict default noserve noquery
Наличие такой строки запрещает узлу отвечать на внешние запросы связанные со временем.

Уровень(stratum) – все сервера времени распределены на уровни. Сервер уровня 1 берет время из внешнего источника(уровень 0). Сервера уровня 2 берут время от сервера уровня 1 и так далее. Максимальный уровень сервера может быть 15, т.е уровней всего 16.

В качестве источника точного времени можно использовать всё что угодно. Вы можете определить источником точного времени сервер в Internet, можете получать время с подключенного GPS приёмника. Да хоть солнечные часы. Главное что бы вы смогли с них данные снять.

ntp.jpg

Итак начнем настраивать AIX в соответствии с выбраной схемой.
На каждом сервере необходимо выполнить несколько действий:
1.Настройка файла конфигурации NTP /etc/ntp.conf
2.Синхронизация с источником времени предыдущего уровня.
3.Старт xntpd демона. Команда smitty xntpd -> выбрать «both» (запустить сейчас и после перезагрузки).
4.Проверить синхронизацию командой ntpq -p

Настройка /etc/ntp.conf для сервера(уровень 1)

server 127.127.1.0
fudge 127.127.1.5 stratum 1

server pool.ntp.org # пул серверов точного времени в интернете или какой-нибудь другой источник времени
driftfile /etc/ntp.drift
tracefile /etc/ntp.trace

Настройка /etc/ntp.conf для серверов 2го уровня.
server 127.127.1.0
fudge 127.127.1.5 stratum 2
server 10.1.1.100 # ip адрес или имя сервера более низкого уровня в локальной сети
peer 10.1.1.150 # ip адрес пира, находящегося на том же уровне
driftfile /etc/ntp.drift
tracefile /etc/ntp.trace

Настройка /etc/ntp.conf для клиентов:

server 127.127.1.0
fudge 127.127.1.0 stratum 3
server 10.1.1.150 # ip адрес или имя сервера более низкого уровня в локальной сети
server 10.1.1.151 # ip адрес или имя сервера более низкого уровня в локальной сети
driftfile /etc/ntp.drift
tracefile /etc/ntp.trace

Для упрощения можно оставить только уровень сервера верхнего уровня и уровень клиентов.

голоса
Рейтинг статьи
Читайте так же:
Видеосервер domination синхронизация времени
Ссылка на основную публикацию
Adblock
detector