database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7636 게시물 읽기
No. 7636
최근 삽질 이야기
작성자
신기배(소타)
작성일
2009-03-08 09:03ⓒ
2009-03-08 09:12ⓜ
조회수
10,002

최근 1달 간 너무 고민이 많았습니다;;;

pgsql빠이자 DB에 대해 잘 아는 사람이 저 밖에 없어서 당연히 프로젝트는 pgsql

처음에 프로토타이핑 할 때야 데이터가 몇 건 없으니까 별 문제가 없었습니다.

크롤러 계열인데 프로토타입이 완성되어서 시운전을 하는데 크롤러의 성능이 낮을 때는 데이터가 슬슬 들어와서 체감을 못했습니다.

근데 데이터가 천만건을 넘어가니까 여기저기 걸린 FK와 트리거들 때문에 성능이 나오지 않기 시작했습니다 =_=

 

크롤이라지만 웹문서를 다 긁어서 넣는게 아니라 메타데이터만 넣기 때문에 한 레코드 크기가 작은데도 양이 워낙 많으니까 데이터 클러스터 크기가 너무 큽니다.

 

이리저리 튜닝해보고 하다가 초당 500레코드 정도는 쌓게 되었는데 문제는 이 장비의 메모리가 15기가 뿐이라는거;

디스크는 RAID 0으로 4개 붙여서 IO 확보는 되어 있는데 데이터 클러스터가 60기가를 넘어서니 입력은 그럭저럭 되지만 조회가 너무 느렸습니다.

인덱스 파일만도 수십 기가가 되니까 이걸 읽어서 뭘 한다는 것이 너무 부담이 가더군요 =_=

 

이 시스템의 목표는 크롤 속도도 중요하지만 조회가 번개 같아야 합니다.

그래서 서버 3대를 올려서 LDAP를 세팅하고 분산되게 referral 걸고.. 크롤러를 LDAP로 되게 바꿔서 돌렸는데 LDAP가 읽기는 그럭저럭 괜찮은데 극악의 쓰기 성능을 보여줘서 3일만에 GG

 

pgsql로 다시 해보려고 서버 세팅을 한 대 더 해서 slony-I을 올려서 한 대는 쓰기만, 한대는 읽기만 하도록 했습니다.

근데 이게 문제가 slony-I이 master에서 일어나는 쿼리를 로깅해서 slave에서 그대로 다시 쓰는 방식입니다.(세련되지 못 한..)

master에서 일어난 변경이 slave까지 도달하는데 몇 시간이 걸립니다 -_-;;

데이터가 억단위가 되니까 밀린 로그가 천만건 단위가 되더군요..

이 때 가장 문제가 되는게 master에서 일어나는 autovacuum이야 전체가 지연되니까 그런갑다 하는데 slave에서 일어나는 autovacuum은 리플리케이션 지연을 일으켜 버립니다.. ㅠㅠㅠㅠㅠㅠ

그래서 이것도 철수.....

 

결국 구조를 병렬화 하기로 하고 역할별로 pgsql 서버를 분산했습니다.

DB는 3개로 하고 장비 2대에 나눠 담았습니다. 각각 DB는 xxx1, yyy1, xxx2, yyy2 처럼 incremental하게 늘어날 수 있도록 어플도 병렬로 async하게 쿼리하도록 바꾸고요.

이 중 DB 2개는 insert만 일어나고 DB 1개는 대량의 update가 일어납니다.

이렇게 해서 돌리는데 처음에는 신나게 돌아가더라구요. 크롤러 성능도 좋아져서 초당 1500 이상의 레코드를 쌓고 있었습니다.

이제 되었구나 ㅠㅠㅠㅠㅠ 싶어서 하루 자고 일어났는데 아침에 보니 대량의 update가 일어나는 놈이 하염없이 vacuum을 돌리고 있더군요. 수많은 update waiting..... 크롤러는 임시 휴업 상태..

 

그래서 이 대량의 update가 일어나는 DB를 mysql myisam 테이블로 옮겼습니다.

지금은 pgsql 2대 에서 DB 한 개 씩, mysql에 DB 한 개.

그럭저럭 데이터가 잘 들어갑니다.

pgsql에서는 전혀 join이 일어나지 않고 key-value 처럼만 동작하는데 이것도 문제가 생겨났습니다.

select * from 테이블 where id in (0, 1, 3, 4, 5, 6, 7, ... ) 처럼 데이터를 가져오는데 이 PK값으로 접근하는 것도 데이터 파일을 랜덤 엑세스 하니까 몇 초씩 걸립니다.. 수십기가의 파일을 읽었다 놨다 하느라 그러는 거지요.

쿼리 플랜을 보면 예상 코스트, 실제 코스트는 0.000... 단위인데도 OS 레벨의 파일 열기 등에 대한 계산은 여기에 포함 안되더군요 =_=

 

게다가 크롤러 데몬이 300개 정도가 도는데 각 서버로 세션을 하나씩 맺습니다. 그럼 pgsql 세션이 300개가 되고요. 이것들이 엄청난 속도로 레코드를 쌓으니까 조회하려고 연결하는 웹서버의 세션이 생성되는 시간이 오래 걸립니다 ㅠㅠㅠㅠㅠㅠ

그래서 DB서버의 포트를 localhost:5433으로 바꾸고 DB서버에 pgpool을 띄웠습니다.

그리고 크롤러에서는 연결을 맺었다 끊었다 하게 하고요. pgpool이 없으면 이렇게 못하겠죠;

그랬더니 세션이 2/3으로 줄어서 그나마 조회를 할 수가 있게 되었습니다..

pgsql 서버의 시스템 로드가 140 쯤 되더군요 -_-; 이런 수치는 처음 봤음..

 

그래도 목표 품질이 나오지 않아서.. 지금은 pgsql을 완전히 걷어내려고 하고 있습니다.

파일 DB엔진을 하나 들고 와서 C로 pgsql 역할을 할 놈을 만들고 있습니다.

어차피 대량의 데이터로 가니까 mysql은 정렬 인덱스로만 쓰이고 데이터는 key-value 베이스로 갈 수 밖에 없더군요 ㅠ

 

어쩔수 없이 pgsql을 버리고 있습니다 ㅠ;

pgsql은 좋지만 현재 프로젝트의 용도에는 맞지 않는 것 같아서..

그 동안 거의 10년간 웹서비스를 개발했지만 수억 단위의 양을 넣어본 적은 없어서 DB책들에 있는 인덱스에 의한 random disk seek, disk IO, OS level cache 등등의 내용이 뭘 의미하는지, vacuum이 왜 치명적인지 이제야 알 것 같습니다.

 

ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

 

이 글에 대한 댓글이 총 8건 있습니다.

안녕하세요,


크롤링된 데이터라면 웹페이지나 특정 도메인에 묶일 수 있는(블로그나 RSS) 컨텐츠라 생각됩니다. 내용 전부를 저장하는 것이 아니라 메타데이터만 저장한다고 하셨는데...


이런 류의 응용을 처리하기엔 shard개수가 작은 것 같습니다. 즉 특정 키로 분산을 하는데 2-3대의 데이터베이스가 위에서 말씀하신 로드를 감당하기엔 무리가 있어보입니다.


한 대가 감당할 수 있는 사이즈를 고려해보시고, 익숙한 DBMS로 튜닝을 진행하시는 것도 도움이 되리라 생각합니다.


부디 좋은 결과 있으시길 바랍니다.

김영우님이 2009-03-08 16:01에 작성한 댓글입니다. Edit

크롤러가 신나게 쏟아붓지만 않는다면 대당 억단위 이상까지 할 수는 있을 것 같습니다.

문제는 엄청난 입력, 갱신과 조회가 한꺼번에 일어나는 것이 문제입니다..

지금 DBM계열의 DB 라이브러리로 데이터 저장소를 만들어서 돌려보는 중인데 DB역할을 최대한 단순화 시키니 그나마 버티는 것 같네요 =_=

신기배(소타)님이 2009-03-08 16:12에 작성한 댓글입니다.

일하고 있는 곳도 결국 DB 분산이 괴물같이 되어가고 있습니다.


가끔 이런 생각을 합니다.

맨날 정보 쓰레기를 욕하면서

내가 그 정보 쓰레기를 만들고 있는 것은 아닌가하는.


세상 모든게 다 제 역할이 있을터인데, 가끔 우리는

조장(助長)과 기우(杞憂)로 그 역할 이상을 꿈꾸는 것은 아닐까하는 생각을 해봅니다.


그리고는 주변에서 열심히 부추기죠.

'니가 그렇게 살아야 더 잘 살 수 있어!' 하면서 말이죠.


엉뚱한 댓글이었습니다.


그래서 열심히 해서 돈 많이 벌면 술 한 잔 사시오!


김상기(ioseph)님이 2009-03-09 11:04에 작성한 댓글입니다.

신기배님의 글을 다시 보다가 든 생각은......


그래도 PgSQL로 자유롭게(?) 테스트 및 프로젝트에 사용하고 계신 환경이 부럽습니다. ㅡ.ㅡ;


제가 있는 조직은 이미 사용하던 제품 아니면 배척/기피(?)하는 분위기인지라... 큰 업무에 적용해보지도 못 하고 있습니다. 제가 100% 책임이 있는 시스템에 대해서 2-3대의 PgSQL 인스턴스를 유지하고는 있지만......


용도에 맞게 제품을 선택하고 그 제품을 잘 활용할 수 있는 노하우와 분위기를 만드는게 성공적인 시스템 구축의 시작이 아닌가 생각해봅니다.

김영우님이 2009-03-09 11:45에 작성한 댓글입니다. Edit

장비 들이고 할 여력은 안되서 ^^;

아마존 EC2를 이용하고 있습니다. 가상 머신이라서 아무때나 올렸다 내렸다 할 수 있고 테스트 목적이니까 트래픽이 발생 안해서 요금도 저렴하고요.

상위 스펙 서버는 실 서비스에도 하자가 없는것 같습니다 ㅎ

신기배(소타)님이 2009-03-09 12:27에 작성한 댓글입니다.

작년에 저도 비슷한 작업으로 고생했는데  pgsql로는 답 안나오더라구요. 

그랴서 tokyocabinet 같은 key-value 스토어 이용해서 대응하고 있어요.

훈희님이 2009-03-12 13:31에 작성한 댓글입니다. Edit

Tokyo Cabinet 좋더라구요. 처음엔 그 성능에 반해서 삽질하다가 ㅠ

메모리의 한계 때문에 결국 접었네요 ㅠ

신기배(소타)님이 2009-03-12 16:01에 작성한 댓글입니다.

저희도 32기가 쓰다가 넉넉하게 128기가로 업글했는디;;

15기가면.. 좀 빡시것네요;

 

SSD가 성능업, 가격다운 돼기만 기다릴뿐...

훈희님이 2009-03-12 20:53에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
7639새로운 에러에 대한 질문 좀 드립니다. 도와주세요. ㅠㅠ [3]
이진영
2009-03-09
7945
7638Pgsql 에서 데이터는 어디에? [2]
souler
2009-03-08
7733
76378.3 버전에 대해서 [1]
souler
2009-03-08
7141
7636최근 삽질 이야기 [8]
신기배
2009-03-08
10002
7635"쓰기 성능"이 훌륭한 / 괜찮은 DBMS제품 추천부탁드립니다. [1]
궁금이
2009-03-08
7463
7634bytea 를 blob 처럼 쓸 수 있을까요? [3]
송효진
2009-03-06
8439
7633텍스트 가공에 대하여.. [2]
성제호
2009-03-06
7736
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다