MongoDB in Action 10

김하영·2022년 2월 22일
0

10. WiredTiger 와 플러그형 스토리지

10.1 플러그형 스토리지 엔진 API

API (Application Programming Interface)

  • 소프트웨어 애플리케이션 프로그램을 작성하기 위한, 상대적으로 엄격한 루틴, 프로토콜 및 도구 세트
  • MongoDB 드라이버들은 MongoDB가 제공하는 API를 사용하여 드라이버 기능을 구현한다.
  • 각 외부 어플리케이션이 MongoDB와 통신하고, DB 내 문서에 대한 CRUD 연산을 수행할 수 있게 한다.

스토리지 엔진

  • 데이터베이스와 하드웨어 간의 인터페이스
  • 셸 또는 드라이버에서 쿼리 수행이나, 클러스터 등에 개입하지 않는다.
  • 데이터를 디스크에 기록/수정/삭제하거나 디스크에서 읽어오기, 데이터의 저장되는 자료 구조에 간섭한다.
  • 플러그형 스토리지 엔진 API를 사용하면 타사에서 MongoDB용 스토리지 엔진을 개발할 수 있다.
  • 플러그형 스토리지 엔진 API 이전에 MongoDB의 기존 스토리지 엔진은 MMAPv1뿐이었다.

MMAPv1 스토리지 엔진

  • MongoDB는 여전히 MMAPv1 스토리지 엔진을 사용하며 버전 3.0이상에서는 여전히 기본 스토리지 엔진이다.
  • 메모리 메핑을 기반으로 하는 MongoDB의 안정적인 솔루션이다.
  • 단점
    저장할 데이터가 많으면 데이터 세트가 증가하면서 서버 디스크 공간을 너무 빠르게 많이 소비한다.
    e.g. 만약 사전 할당되는 블록이 2GB보다 커지면, 그 다음에는 같은 2GB씩 사전 할당된다.

데이터베이스 관리자는 데이터가 디스크에 저장되는 방법을 결정하는 다양한 스토리지 대안 중에서 선택해야한다.
v3.0부터 MongoDB에 다른 스토리지 모듈을 사용하도록 지시할 수 있으며, 이것이 플러그형 스토리지 엔진 API 기능이다.

10.1.1 왜 다른 스토리지 엔진을 사용할까?

시스템마다 목적이 다르고 필요한 스토리지 성능이 다르기 때문이다.

뉴스사이트 VS SNS

  1. 뉴스 사이트
    많은 방문객들이 동일한 첫 화면을 보고, 쿼리 캐시를 활용해 몇 분 전 요청된 동일한 기사를 반복적으로 신속하게 전달할 수 있다. 멤캐시디 또는 Redis 등 외부 메모리 캐시 시스템을 활용해 동일 데이터를 고속 전달할 수 있다.

  2. 소셜 미디어 사이트 (= 트위터)
    사용자별로 수백만 건의 트윗/상태 업데이트 및 저장이 가능하도록 높은 쓰기 성능이 필요하고,
    사용자마다 다르게 필터링한 데이터를 읽어서 보여줘야 하므로 더 높은 읽기 성능도 필요하다.

다양한 종류의 시스템을 처리하기 위해 MongoDB는 플러그형 스토리지 엔진 개념을 구현하여,
데이터베이스 관리자 또는 시스템 엔지니어가 사용 사례에 가장 적합한 성능을 제공하는 스토리지 엔진을 선택할 수 있도록 했다.

10.2 WiredTiger

MongoDB에 번들로 제공된 스토리지 플러그인 WiredTiger를 소개한다. (기존 엔진이 아닌 신규 도입 엔진)

  • 멀티 코어 확장성과 최적의 램 사용에 초점을 맞춘, 고성능의 확장 가능한 오픈 소스 데이터 엔진
  • 멀티 코어 스케일링(확장)은 멀티 스레딩 프로그래밍에서 중요한 개념인 hazard pointers, lock-free algorithm 기반이므로 각 CPU 코어에서 더 많은 작업 수행이 가능하다.
  1. hazard pointers
    스레드가 액세스 중인 메모리 블록의 포인터 목록으로 목록에 있는 포인터 자체나, 그 포인터가 가리키는 메모리 블록을 다른 스레드가 수정/삭제할 수 없다.

  2. lock-free algorithm
    여러 스레드가 서로 resource locking 해제를 기다리게 되면서 프로그램이 정지하는 상황을 피하여프로그램 전체가 진행되도록 보장하기 위한 프로그래밍 패턴이다.

10.2.1 WiredTiger로의 전환

WiredTiger를 사용하기 전에 반드시 64비트 시스템을 실행해야 한다.
WiredTiger를 사용하기 위해 MongoDB를 설정할 때, 새로운 dbpath 디렉터리에서 WiredTiger 구성으로 MongoDB 서버를 시작하는 것이 중요하다.

MMAPv1 구조에 있는 dbPath로 서버를 시작하면 시작되지 않을 것이다.
서로 호환되지 않으며, 저장 구조 간에 사용 가능한 on-the-fly 변환이 없기 때문이다.

mongodump와 mongorestore를 통해서 마이그레이션 처리가 필요하다.
(마이그레이션에 대한 자세한 설명은 생략..)

10.3 MMAPv1과 비교

WiredTiger의 성능은 MMAPv1을 사용하는 MongoDB 인스턴스와 어떤 차이가 있을까?

자바스크립트 및 셸 스크립트를 사용하여 MMAPv1에 대해 세 개의 WiredTiger를 구성을 테스트한다.

  • MMAPv1을 사용한 기본 구성
  • WiredTiger, 압축 안함
  • snappy 압축이 있는 WiredTiger
  • zlib 압축이 있는 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 되었다.

profile
Back-end Developer

0개의 댓글