ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: вопрос - offtopic



On 02.12.2007 0:33, Nikolay Grebnev wrote:

Или только складывать логи локально, и ежесуточно их автоматом переливать в другое место?


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

Подозреваю что syslog-ng даже в premium edition может потерять часть данных в момент потери связи с удаленным сервером, поскольку в его протоколе AFAIK нет ACK на прикладном уровне. А там где его нет, возникает такая проблема:

Отправитель просит ОС отправить данные по сети сделав write().
ОС помещает эти данные в буфер tcp-стека и возвращает размер записанных в буфер 
данных.
Некоторые приложения (включая syslog-ng) думают что раз write() не вернул ошибок можно считать что данные успешно отправлены и о них можно забыть.

Но если после того как данные были записаны в буфер но до того как были переданы, хост получателя вдруг станет недоступен, то данные будут потеряны. ОС будет чесно пытаться доставить данные (tcp retransmit) но делать вечно она этого не может. Да и в случае перезагрузки удаленного хоста это не поможет.

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

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

--
WBR,
 Anton Yuzhaninov



 




Copyright © Lexa Software, 1996-2009.