-
Mysql에서의 InnoDB와 같이 스토리지 엔진이 존재하며 가장 많이 쓰이는 것은 WiredTiger이다
-
하나의 서버에서 여러 스토리지 엔진을 같이 사용 할 수 없다
-
저자는 Read Ahead 알고리즘 때문에 리눅스 페이징 옵션(ATTR{bdi/read_ahead_kb}="16")을 16~32kb 정도로 유지하는 것을 권장한다 → https://www.percona.com/blog/2016/08/12/tuning-linux-for-mongodb/ 참조
-
WAL(Write Ahead Log)를 이용하여 손실된 데이터를 재 시작 시에 복구 할 수 있다
-
공유 캐시의 크기는 서버 메모리의 50~60% 정도를 권장한다
-
데이터 저장 방식
- 레코드 스토어: 테이블의 레코드를 한꺼번에 같이 저장하는 방식. Wired Tiger에서 사용
- 컬럼 스토어: 컬럼 그룹(패밀리)로 데이터 파일을 관리하여 대용량 분석에 적합
- LSM(log structured merge tree): 작은 조각으로 데이터를 메모리에 가지고 있다가 저장 한계를 넘어서면 디스크로 저장한다. 이 저장된 조각들을 지속적으로 병합하면서 데이터 파일로 성장시킨다
- 일반적으로 레벨이 낮을 수록 최신 데이터이다
- 데이터를 저장하는데 있어 B-Tree보다 훨씬 성능이 좋다
- 읽기 성능이 느리다 → 여러 조각들을 전부 읽어야 한다
-
Wired Tiger
- MongoDb의 기본 스토리지 엔진
- 데이터베이스 별로 디렉토리가 구분된다
- 아키텍쳐

- 저널: WAL 저널 로그. 데이터베이스 크래시로부터 데이터를 복구하기 위함
- 리컨실링: 디스크에 기록하기 전에 기존 데이터와 비교하여 원본 레코드와 병합
- 커서: 쿼리의 결과를 커서로 반환하여 클라이언트는 반복문을 통해 데이터를 가져온다
- 에빅션: 자주 사용되지 않는 데이터 페이지를 캐시에서 제거하는 역할
- 블록 매니져: 데이터를 디스크로 부터 읽어들이기 위한 역할
- 체크포인트: 트랜잭션을 위해 지원됨. 데이터 파일과 WAL 로그가 동기화 되는 시점
- 퍼지 방식: 오라클, Mysql 에서 채택하며, 조금 오래전 시점에 발생했던 트랙잭션을 기준점으로 삼는 방식. 과도한 디스크 IO를 방지하나 느리다
- 샤프 방식: 몽고디비에서 쓰이며 체크 포인트 실행 시점에 디스크에 한번에 모아서 쓰기를 진행하므로 디스크 IO가 크게 발생한다
- 버퍼 풀(공유 캐시): 인덱스나 데이터를 메모리에 캐시하고, 데이터의 변경을 한번에 배치 처리하는 기능 담당
- 사용자의 쿼리는 모두 이 캐시를 거친다
- 공유 캐시의 잠금 경합을 최소화 하기 위해 Lock-Free 알고리즘을 채택하고 있다
- 하자드 포인터: 사용자 스레드가 참조하는 페이지를 등록하고, 없는 경우 이빅션 스레드가 페이지를 비울 수 있도록 지원
- 스킵 리스트: 레코드의 변경 이력을 이 리스트에 저장하여 캐시된 데이터 페이지를 바로 변경하기 보다 리스트를 참조하기 때문에 락을 줄인다
- MVCC(Multi Version Concurrency Control) 지원
- Repeatable-read(Mongo에서는 SnapShot 으로 표현) 수준의 격리를 지원하여 같은 트랜잭션에서는 항상 같은 데이터가 읽히기 위한 기술
- 운영체제 캐시(페이지 캐시)
- 운영체제의 캐시를 통해 공유 버퍼에 들어가기 때문에 캐시가 두 군데 생기는 더블 버퍼링 현상이 일어난다
- 스토리지 엔진의 기본 방식이며, 이 페이지 캐시를 제외하고 운영하는 Direct IO 방식은 현재 추천되지 않는다
- 성능 역시 현재는 캐시 방식보다 떨어진다
-
Percona 메모리 스토리지
- 메모리에 데이터를 적재하는 스토리지 엔진. 휘발성이다
- 체크포인트, 페이지 이빅션이 불필요하다