PostgreSQL 게시판에 이전 글들이 있는데.. 점점 pgsql과 얘기가 멀어져서..
이후의 이야기입니다..
그렇게 여차저차 multi key-value data store가 만들어졌고 지금은 10억건이 좀 넘는 데이터가 들어가 있습니다. 데이터 용량은 1.2테라입니다.
초당 200~500개 정도의 새 데이터가 쌓이고 있습니다.
1k 이하의 IO요청이 거의 10k에 가깝게 일어납니다. 넘어갈 때도 있고요.
디스크 IO는 도저히 해결하지 못해서 SSD 1.5테라(256GB x 6개 RAID 0)를 달아줬고 장애를 대비해서 2테라의 SAS disk에 복제하고 있습니다.
메모리도 무려 96GB...
돈으로 scale-up 한 케이스입니다.. 그래도 SSD RAID 0가 성능이 엄청나서 다행입니다 -.-;;
적어도 제 인생에서는 가장 큰 데이터입니다 -.-;; 그 전까지는 많아봤자 수천만이었는데 장비든 뭐든 걱정 한 적이 없었습니다 -.-;; 우물 레벨1 탈출이랄까요..
야후는 데이터가 1.2PB라는데.. 새발의 피지만 말입니다..
여튼..
이 이후로 하나의 DBMS를 더 만들었습니다.
원래는 mysql로 구현했었는데 mysql이 버티지 못해서 메모리 기반의 DBMS를 새로 구현하게 되었습니다.
mysql로 생각하면 2개의 테이블이 있는데 한 테이블은 초당 0.5~1k정도의 레코드가 쌓입니다.
한 테이블은 적은 수의 insert가 일어나는데 update가 초당 몇 번 일어나는데 한번에 변경되는 레코드가 수십~수천 입니다.
매우 간단한 테이블 구조인데 레코드가 억단위를 가니 웹서비스라는 것에서는 나오면 안되는 성능이 나옵니다.
그 전의 key-value 기반은 데이터 구조가 간단해서 금방 만들고 테스트만 오래했지만 이번에 만들어야 하는 인덱싱 DB는 DB테이블 6개를 메모리에 구현해야 합니다. 만드는 김에 테이블 몇 개를 더 넣어버림 -_-;
처음으로 red-black tree, btree 등을 C로 구현해 봤습니다.. 맨날 있는거 갖다 썼는데 데이터가 많으니까 바이트 단위로 제어할 수 있도록 직접 구현하게 됐습니다. 생각보다 겁나 복잡하더라구요.. 언제 해봤어야지 -_-;
이런 트리로 데이터를 찾고 데이터를 연결하고 연결한 걸 뽑아내고 등등을 해야 했습니다.
SELECT ... ORDER BY 로 쉽게 하던걸 quick sort, merge sort 등을 구현해야만 했습니다...
여튼 우여곡절 끝에 만들었습니다.
기능 하나 넣으려면 죽였다 살려야 하고 -_-; 빠르게 동작하게 하려고 데이터 구조를 메모리에 최적화 했더니 추가로 저장할 데이터 하나 생기면 죽이고 살리는데 30분입니다..
약 20억건의 데이터 연결이 들어있고 몇 달 동안 잘 돌아가고 있습니다..
다행히도 이 장비는 메모리가 120GB입니다 >_<;
요즘은 이 두놈을 합쳐서 분산처리되는 놈을 만드려고 하고 있습니다.
이 두 놈을 몇 달 돌려보니 이런걸 만드는게 너무나 힘든 일이란 걸 실감하고 있습니다..
오라클이나 PostgreSQL, Cubrid 같은걸 만드는 사람은 정말 초천재입니다!!
여튼 삽질 수고하세요~
|