insert에 최적화된 table을 구성하려면 어떻게 해야하나요.
안녕하세요 -
현재 유지 보수 중인 사이트에서 새로운 기능을 하나 덧붙이려고 하는데요.
대략적으로
insert가 1초에 1000 번 정도의 수준까지
감당할 수 있도록 만드려고 합니다.
select는 거의 없을 것 같고요.
insert에 부하에 대한 걱정이 상당히 큰데 이정도는 용납할만 한건가요?
사이트 운영에 비중이 그리 큰 모듈이 아닌데,
사이트 전체 속도를 저하시키는 주범이 되면 곤란할 것 같아서요.
현재 DB는 mysql 사용하고 있습니다.
CentOS에서 돌아가고 있고요.
개발자들 사이에서는
table을 memcached나 다른 엔진을 써보는건 어떻겠냐는 등
이런저런 의견이 오가고 있긴한데 정작 문서를 찾으면 제대로 나오지도 않고 -_ㅠ
많이 헤매고 있습니다. ㅠㅠ
(MyISam,innoDB 외에는 다른 엔진에 관련된 문서 찾기도 어렵더라구요.)
관련된 경험 혹은 조언을 해주실 수 있는 분을 찾고 있습니다.
그리고
다른 분들은 DB와 관련된 근황이나 Document를 어디서 습득(?)하시는지 궁금합니다.
KLDP의 "시스템 엔지니어 고민상담실" 도 최근에 생긴 카테고리 인거죠?
검색하다보니 "데이터베이스 사랑넷" 과 같은 사이트가 자주 노출이 되던데
http://database.sarang.net/database/database.phtml
정리된 문서들을 보면 5년에서 10년이 다 되어가는 문서들이더군요.
(물론, 저는 10년전의 문서도 못따라가서 해메고 있었지만 ㅎㅎ)
DB 최적화 혹은 QnA 등 선배 개발자님들의 노하우가 쌓여있는 사이트 있으면 추천 부탁드릴게요.
감사합니다. :)
세줄 요약
1. Insert가 대부분인 테이블의 부하를 줄이려면 어떻게 해야할까요? (경험담, 설정변경, DB엔진 변경, 관련 알고리즘 키워드 등등)
2. DB 최근 동향 포럼은 어디서 많이들 찾으시는건가요
3. 새로운 기능에대한 스트레스 테스트는 어떻게 해결하고 계신가요?
로그 형식의
로그 형식의 데이터가 아닐까 하는데 memcached 같은 key-value 계열은 맞지 않습니다.
초당 1천번 정도면 그냥 mysql로 하셔도 됩니다.
인덱스를 최대한 걸지 마시고 가능하면 fixed size로 myisam 타입의 테이블을 만드세요. 요즘의 장비라면 디스크 IO 성능에 따라 초당 3~5천까지 무난하게 입력 될 겁니다.
아니면 postgresql의 WAL에 대해서 알아보시고 그걸 쓰셔도 됩니다.
여튼 데이터를 통계낼 상황이 생기면 테이블을 순간적으로 이름을 바꾼 후에 새 테이블을 만들어서(shift) 입력은 새 테이블에 받고 통계는 헌테이블(?)에서 볼일 보시면 될 것 같네요.
1. 소타님께서 잘
1.
소타님께서 잘 적어주셨습니다.
트랜잭션 필요 없는 인서트 위주의 데이터들은 MyISAM으로 받아도 충분합니다.
일반 데스크탑( low-cache CPU / SATA ) 환경에서도 초당 천번 무난합니다.
통계는 파티셔닝해서 insert 되고 있는 테이블 외의 테이블에서 하셔도 되고, 아니면 리플리케이션 해서 통계 전용으로 slave database 꾸리셔도 됩니다.
2.
데이터베이스 사랑넷의 MySQL섹션에서 저도 가끔 활동하는데, Q&A만 활성화 되어 있고 문서는 잘 업데이트 되지 않더군요.
MySQL 성능쪽이라면 외국 사이트 중 http://www.mysqlperformanceblog.com/ 를 추천합니다. RSS 지원하니 받아보시면 되겠습니다.
3.
새로운 기능에 대한 테스트는 로컬에서 진행하는 편입니다.
백업된 데이터를 끌어와서 이것 저것 해봅니다.
아무래도 최신 버전일수록 Query Optimizer가 좋아지니, 최신 버전과 운용중인 버전을 비교해봅니다.
와.
두 분 모두 감사합니다.
많은 도움이 되었습니다 :)
예전에는 mysql이
예전에는 mysql이 가벼운 db라고 생각을 했는데, 5.x 대에 와서는 이젠 그러하지 못하다는 생각이 드는군요.
하지만 로그 같은 것을 넣는 것이라면 mysql 보다는 monk(Metadata Offer New Knowledge)나 tokyo tryant 같은 것이 더 낫지 않을까 싶군요. 로그라는 것이 대부분 key:value 일텐.. (status:message)
로그성 데이터라면
로그성 데이터라면 MySQL의 Archive엔진을 써보시는건 어떨까요? 예전에 다른 엔진이랑 벤치마크해본적이 있는데 insert에 관한한 타의 추종을 불허했습니다.