1. HandlerSocket for MySQL

    MySQL을 NoSQL로 변신 시켜주는 참한 물건이 나왔다. 나온지 몇 개월 됐다. 현재 추진하고 있는 솔루션에 memcached나 redis를 메모리 캐쉬 서버로 앞에 두고 영성속을 위해 데이터베이스로 MySQL를 쓰려던 참이었는데 시기적절하게 좋은 물건을 만난것 같다. DeNA라는 일본의 소셜 게임회사에서 서비스용으로 현업에 사용하고 있기 때문에 일단은 검증은 되었다고 봐도 무난하다. MongoDB나 CouchDB도 쓰이고 있는 판인데 MySQL은 더 신뢰가 간다. MySQL를 KeyValue 스토리지로 사용하는 트릭도 있었기는 하지만 이번엔 제대로 나온듯 하다. 버클리DB나 Sqlite3를 DB엔진으로 두는 KeyValue스토리지도 있기는 하지만 동시성 제어 등에서 약간은 불안한 감이 없지는 않았다.

    HandlerSocket의 이야기는 이렇다. MySQL에 대해 리눅스에서 OS레벨의 프로파일링(oProfile)을 해봤더니 대부분의 오버헤드는 SQL을 파싱하고 처리하는데서 발생하고 InnoDB를 접근하는 시간은 그리 길지 않다는 것이 개발의 동기란다. 그래서 직접 InnoDB에 접근할 수 있는 통로를 HandlerSocket라는 플러그인을 만들어 뚫었다. 모든 시스템이 그렇듯 가벼우면 가벼울 수록 성능은 좋기 마련이다. HandlerSocket은 MySQL같이 SQL을 처리하는 레이어와 실제 데이터베이스 인덱싱 엔진(e.g. InnoDB)이 분리되어 있기 때문에 가능한 일인지도 모른다. HandlerSocket은 MySQL의 플러그인으로 만들어졌기 때문에 하나의 테이블에 대해 SQL과 NoSQL로 동시에 접근 할 수 있어 아주 매력적이다. 복잡한 쿼리는 SQL로 소화하고 PRIMARY로 빨리 접근하는 get/put의 경우 HandlerSocket으로 통하면 된다.

    벤치마킹 결과 초당 75만 qps를 소화해 낸다. 같은 하드웨어에서 memcached는 22만 qps의 성능이 나왔다. (벤치마킹한 하드웨어 스펙은 아래 링크를 참고.) HandlerSocket으로 접근할 경우 PRIMARY가 되는 필드가 키가 된다. 기본적으로 9998포트(읽기전용), 9999포트(쓰기전용)를 사용하고 내부적으로 16개의 쓰레드를 사용한다. Disk I/O 바운드의 데이터베이스 보다 메모리에 데이터를 다 올릴 수 있는 데이터베이스에 더 유용하다.

    HandlerSocket은 기본적으로 C++과 Perl 클라이언트 라이브러리를 제공한다. 파이썬 바인딩으로 pyhs(python-handler-socket)가 있다.

    Percona-Server 5.1.34 r12.5 바이너리 배포판에 함께 컴파일되어 내장되어 있기 때문에 쉽게 테스트 해 볼 수 있다. 100만건 테스트를 실시할 예정인데 memcached, redis와 비교해 성능이 어떤지 궁금해 진다.

    참고자료