Q.

우선 제가 하고 있는 내용은 라우터로부터 Netflow data가 저희 시스템에 오면 이 데이터를 Mysql DB에 저장하는 것이 목적입니다.
그런데 실제 Mysql DB에 insert 되는 양이 분당 15만회정도가 발생하고 있으며 이로 인해서 Netflow data의 일부가 처리되지 못하고 패킷 드랍되고 있는것 같습니다. 
그래서 이를 해결할수 있는 방법이 없을까요?

다시 정리 하자면 라우터에서 Netflow data가 UDP 패킷에 실려서 저희 서버에 도착하면 Netflow2Mysql이라는 프로그램이 이것을 받아 mysql DB에 저장하게 되어있습니다.
문제는 라우터에서 서버까지의 UDP 패킷 드랍은 없었습니다.
그렇다면 Netflow2Mysql에서 DB로 insert 처리가 늦어지면서 Netflow2mysql 프로그램의 버퍼가 오버되면서 패킷을 처리 하지 못하고 드랍되는것 같습니다.


A.

DB가 바틀넥이면 
데이터 들을 임시 flat 파일로 저장하고 
flat 파일의 데이터를 DB로 넣는 작업은 
별도의 데먼이나 유틸로 진행하는 것이 어떨까 싶은데요.
atie님이 얘기하신 메세지큐미들웨어가 그런 구조를 말씀하신 건지 모르겠네요.

여러 모듈이 단방향 커뮤니케이션인 경우에는,
뒤쪽 모듈의 속도가 앞 모듈의 속도보다 빠르다는 보장이 없는 경우
뒤쪽 모듈의 옵티마이징만으로는 별 효과가 없습니다.
일반적으로 DB처리가 네트웍의 데이터 유입보다 빠를 것 같지는 않네요.

임시 flat 파일을 메모리로 대체해서 생각해볼 수도 있지만,
그 중간 구조는 파일이던 메모리던간에 
앞쪽 모듈이 상대적으로 빠른 경우에는
속도 차에 의해 거의 무한대로 늘어나는 경우도
있다고 가정해야 합니다.

모듈간의 flow control이 불가능 하다면 
무한대 크기 큐를 가정하는 것이 가장 낫지 않을까 싶습니다.
그나마 flat file이 그에 가장 근접하니까 가장 낫지 않을까 싶습니다. 그리고 flat file도 여러 하드 디스크에 분산해서 처리하면
IO의 효율상 아주 좋습니다.
그리고 IO를 아주 효율적으로 사용할 수 있도록 버퍼링등도
잘 고려하셔야 겠죠. 데이터 크기를 줄이는 것도 중요하구요.

그리고 뒤쪽 모듈의 옵티마이징은 이와 병행해서 진행해야 되겠죠.

얘기해놓고 보니 atie님의 얘기를 풀어쓴 꼴이 됏네요.^^;;


출처 - http://kldp.org/node/61655


'DB > Common' 카테고리의 다른 글

Sharding & Query Off Loading  (0) 2013.04.29
SELECT문 순서와 처리순서  (0) 2012.08.29
데이터 입력과 db insert 사이에 버퍼링 방법  (0) 2012.07.13
dbms - join  (0) 2012.07.06
sql - 서브(하위) 쿼리  (0) 2012.06.20
NoSQL 소개  (0) 2012.05.18
Posted by linuxism

댓글을 달아 주세요