로그 서버 개발 관련

lovemyin의 이미지

안녕하세요... 개발에 들어가기에 앞서 다른 분들의 의견을 알고 싶어 이렇게 글을 올립니다.

여러 장치들의 로그를 수집하는 로그 서버를 개발하려고 합니다. 대략 500대 가량의 장치에서 로그를 수집하기 때문에 엄청나게 많은 데이터를 계속 수신하여 파일에 저장합니다.

혹시 비슷한 경험이 있으신 분의 조언 부탁드립니다.

데이터양도 많고 파일도 굉장히 커질것 같고 설계부분에서 제대로 하지 못하면 많이 고생할 것 같에요...

부탁드립니다.

bugiii의 이미지

DB 적용을 조심스럽게 추천해봅니다.

lovemyin의 이미지

기본적으로 DB를 쓸 수 없는 상황입니다. 로그는 모두 텍스트 파일 형식으로 저장되어야 하는 상황이라....
어쨋든 답변 감사드립니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

IsExist의 이미지

글에서 말한 장치란 어떤걸 말하는 겁니까?

규모로 봐서는 네트웍 장비 같군요.

단순한 호기심 발동입니다. :-)

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

preisner의 이미지

어떤 부분에 대해 질문을 하시는 건지 잘 모르겠네요.
로그 파일을 어떻게 수집하느냐?
수집된 로그 파일을 어떻게 관리하는가?
수집된 로그에서 어떤 데이터를 추출하시려는 건지..

예전 ESM 개발 때 경험으로 보면,
장비별, OS 별로 로그를 가져 올수 있는 방법은 많이 있습니다.
syslog 원격으로 보내는 방법 도 있고,
Windows event 로그도 원격에서 가져오는 방법도 있고,
snmp나 snmp trap 을 이용하는 방법도 있고,
직접 agent를 설치하여 가져오는 방법도 있고..

좀 더 자세히 질문해 주세요.

pynoos의 이미지

500대 정도면 유실 문제가 있으므로 UDP보다는 TCP를 추천하고,
TCP의 Receive Buffer를 늘여놓고,
Client는 Non-block I/O를 사용하여 전송시 block이 생기지 않도록하고,
Server는 수신하는 녀석과 파일에 쓰는 것을 쓰레드로 분리하여서,
수신하는 녀석은 최대한 수신에 온 신경을 다 쓰도록 하여 버퍼비우기에 최선을 다하는 모습을 보이게 합니다.
파일에 쓰는 놈은 write(2) 보다는 fwrite(3) 계열을 쓰도록하여 쓰기버퍼링이 일어나도록 하면 좋을 것 같네요

lovemyin의 이미지

생각보다 많은 분들이 답변 주셔서 진심으로 감사하게 생각합니다.
여기서 말한 장치라는 것은 프로토콜 변화기라고 생각하시면 가장 쉬울것 같네요..
프로토콜을 변환하는 과정을 로그로 전송하는데 그 로그를 어떻게 받아야할지 고민하고 있는 것입니다.

어디서 듣던 얘기중에 로그 서버를 개발하는데 파일 쓰기 작업과 데이터 수신작업이 너무 많이 동작하다보니 CPU 사용률이 100%까지 치솟아 시스템이 멈춰버리는 현상이 발생했다고 해서 질문드린겁니다.

답변 주신 분들 진심으로 감사드립니다.

질문을 요약하면
1. 파일 쓰기 작업이 무수히 많을 때 가장 효율적인 저장방법은 무엇인가?
2. 장치마다 각각의 로그 파일을 생성해야 할지 아니면 하나의 파일에 모든 장치를 저장하고 별도의 필터 프로그램을 만들어야 하는가?
3. 무수히 많은 데이터를 수신할 수 있는 가장 효율적인 방법은 무엇인가?
4. 전체적으로 로그 서버의 성능을 올리기 위해서는 어떤 아키텍쳐가 좋은가?

대략 이런겁니다. 벌써 좋은 대답이 많이 나왔네요.. 감사합니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

spacelee의 이미지

lovemyin wrote:

질문을 요약하면
1. 파일 쓰기 작업이 무수히 많을 때 가장 효율적인 저장방법은 무엇인가?
2. 장치마다 각각의 로그 파일을 생성해야 할지 아니면 하나의 파일에 모든 장치를 저장하고 별도의 필터 프로그램을 만들어야 하는가?
3. 무수히 많은 데이터를 수신할 수 있는 가장 효율적인 방법은 무엇인가?
4. 전체적으로 로그 서버의 성능을 올리기 위해서는 어떤 아키텍쳐가 좋은가?

대략 이런겁니다. 벌써 좋은 대답이 많이 나왔네요.. 감사합니다.

바틀넥이 되는 부분이 상대적으로 어느 부분이 더 심한지 모르겠지만,
만약 로그 서버쪽이 장치모듈에 비해 바틀넥이 심하다면
장치 모듈이 직접 tcp를 써서 로그를 쌓을 경우
실제 장치 모듈의 코어 액션까지 느려질 확률이 큽니다.
(제 개인적인 생각에 이 부분은 non-blocking 과는 상관이 업을것 같은데요..서버 구조에 따라 다르긴 하지만 일반적으로 cascade module에서는 queueing이 근본적인 문제이기 때문에 multiplex 구조를 쓴다해도 비슷한 문제에 봉착하게 됩니다.)

만약 그렇다면
장치 모듈에서는 별도 파일로 로그를 각각 쌓고,
이들을 취합하는 모듈을 별도로 구성하시는게 낫지 않을까 싶습니다. 물론 별도 모듈도 tcp를 통해서 취합해야 할테구요.

tcp 커넥션은 커넥션 풀을써서 매번 재접속하지 않도록 하는게 매우 유용할 것 같구요.

로그 서버의 성능을 위해서는
네트웍보다는 저장장치 구성에 많은 신경을 쓰셔야 하지 않을까 싶습니다. 일단 저장장치를 빠른 걸로 쓰시고 가능만 하다면
장비에 멀티 저장장치를 구성하여 로그를 각 멀티 저장장치에
분산하여 IO를 분산시키는 것이 매우 좋습니다.
어떤 알고리즘이나 다른 고민보다 IO쪽에서 기초적인 것들을
신경써주는 것이 상당히 도움이 됩니다.

버퍼링 IO는 기본이구요. (log의 적확성이 문제라면 이 부분도 포기하셔야 겠죠.) OS는 리눅스가 약간의 reliability는 포기하고
IO쪽을 빠르게 처리해주니 리눅스가 좋을 것 같구요.

그리고 제일 중요한 핵심은
로그 자체를 짧고 심플하게 만들어서
네트웍 traffic이나 저장장치 write 양을 줄이는 것이 아닐까 싶습니다.

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

쌀밥의 이미지

저는 syslog로 왠만한 경우 커버가 되지 않나 생각합니다...

혹시 직접 만들게 되신다면...

로그 파일의 최대 사이즈가 2.xxG 라는 사실을 유념하세요..;

예전에 이 문제로 로그를 많이 날려 먹은 경험이 있답니다;;

일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.