API (Application Programming Interface)
스토리지 엔진
MMAPv1 스토리지 엔진
데이터베이스 관리자는 데이터가 디스크에 저장되는 방법을 결정하는 다양한 스토리지 대안 중에서 선택해야한다.
v3.0부터 MongoDB에 다른 스토리지 모듈을 사용하도록 지시할 수 있으며, 이것이 플러그형 스토리지 엔진 API 기능이다.
시스템마다 목적이 다르고 필요한 스토리지 성능이 다르기 때문이다.
뉴스사이트 VS SNS
뉴스 사이트
많은 방문객들이 동일한 첫 화면을 보고, 쿼리 캐시를 활용해 몇 분 전 요청된 동일한 기사를 반복적으로 신속하게 전달할 수 있다. 멤캐시디 또는 Redis 등 외부 메모리 캐시 시스템을 활용해 동일 데이터를 고속 전달할 수 있다.
소셜 미디어 사이트 (= 트위터)
사용자별로 수백만 건의 트윗/상태 업데이트 및 저장이 가능하도록 높은 쓰기 성능이 필요하고,
사용자마다 다르게 필터링한 데이터를 읽어서 보여줘야 하므로 더 높은 읽기 성능도 필요하다.
다양한 종류의 시스템을 처리하기 위해 MongoDB는 플러그형 스토리지 엔진 개념을 구현하여,
데이터베이스 관리자 또는 시스템 엔지니어가 사용 사례에 가장 적합한 성능을 제공하는 스토리지 엔진을 선택할 수 있도록 했다.
MongoDB에 번들로 제공된 스토리지 플러그인 WiredTiger를 소개한다. (기존 엔진이 아닌 신규 도입 엔진)
hazard pointers
스레드가 액세스 중인 메모리 블록의 포인터 목록으로 목록에 있는 포인터 자체나, 그 포인터가 가리키는 메모리 블록을 다른 스레드가 수정/삭제할 수 없다.
lock-free algorithm
여러 스레드가 서로 resource locking 해제를 기다리게 되면서 프로그램이 정지하는 상황을 피하여프로그램 전체가 진행되도록 보장하기 위한 프로그래밍 패턴이다.
WiredTiger를 사용하기 전에 반드시 64비트 시스템을 실행해야 한다.
WiredTiger를 사용하기 위해 MongoDB를 설정할 때, 새로운 dbpath 디렉터리에서 WiredTiger 구성으로 MongoDB 서버를 시작하는 것이 중요하다.
MMAPv1 구조에 있는 dbPath로 서버를 시작하면 시작되지 않을 것이다.
서로 호환되지 않으며, 저장 구조 간에 사용 가능한 on-the-fly 변환이 없기 때문이다.
mongodump와 mongorestore를 통해서 마이그레이션 처리가 필요하다.
(마이그레이션에 대한 자세한 설명은 생략..)
WiredTiger의 성능은 MMAPv1을 사용하는 MongoDB 인스턴스와 어떤 차이가 있을까?
자바스크립트 및 셸 스크립트를 사용하여 MMAPv1에 대해 세 개의 WiredTiger를 구성을 테스트한다.
zilb은 Huffman 코딩을 사용하는 LZ77의 변형인 DEFLATE 압축 알고리즘의 추상화다.
zlib은 많은 소프트웨어 플랫폼에서 매우 일반적이며, gzip 파일 압축 프로그램의 기초가 된다.
snappy는 구글에서 개발했으며 BigTable과 같은 구글 프로젝트에서 널리 사용된다.
snappy는 중간 수준의 솔루션에 가깝고, 최대한 압축을 목표로 하지는 않지만, 대신 합리적인 수준의 압축을 고속으로 진행할 수 있다.
MMAPv1(기존)과의 비교했을 때, WiredTiger 가 디스크 사용 측면에서 이득이 크다.
삽입 성능: 디스크 사용량 차이
압축하지 않은 상태에서 기존의 15% 미만을 사용, 압축 추가되면 10%미만
snappy 압축 구성 → 삽입 속도와 디스크 사용 간 중간지점을 찾는다.
zlib 압축 구성 → 더 많이 압축하지만, 시간은 snappy보다 더 걸린다.
읽기 성능: cold fetch의 경우 기존보다 훨씬 빠르다. (WiredTiger > MMAPv1)
특히, 압축(snappy, zlib) 구성이 더 빠르다.
하지만 캐시를 사용한 읽기 성능은 MMAPv1이 약간 더 빠르다.
호출 속도가 오래 걸리면 방문객마다 필터링 조건을 갖는 SNS에서는 cache miss가 발생하므로 중요하다.
(음..호출하고 캐시 값 셋팅을 하는게 오래 걸려서 누락되기 때문인가..?)
하지만 특정 운영체제 설정에 따라 성능이 더 향상될 수도, 저하될 수도 있어 환경적 요소도 간과하면 안된다.
WiredTiger는 읽기 및 쓰기 작업 모두에서 성능이 뛰어나며, 도큐먼트 수준의 잠금 기능을 제공한다.
MMAPv1은 컬렉션 수준의 이상의 잠금을 제공하지 않는다.
( 즉, WiredTiger 이 더 좋다가 이 장의 결과가 아닐까...? )
MMAPv1는 몽고디비 4.2버전부터 deprecated 되었다.