플러그인 스토리지 엔진
스토리지 엔진은 사용자의 데이터를 디스크와 메모리에 저장하고 읽어오는 역할을 담당한다. MMAPv1과 WiredTiger 등을 스토리지 엔진이라고 하며, 이 엔진들은 사용자의 데이터를 디스크에 영구적으로 기록하거나 다시 읽어와서 메모리에 적재하는 역할을 담당한다.
몽고디비 서버도 MySQL 서버와 동일하게 다양한 스토리지 엔진을 사용할 수 있도록 스토리지 엔진이 플로그인 형태로 구현되어 있으나 MySQL 서버와 달리 하나의 인스턴스에서 동시에 여러 개의 스토리지 엔진을 사용할 수가 없다.
즉 하나의 몽고디비 서버에서 MMAPv1와 WiredTiger 스토리지 엔진을 동시에 사용할 수는 없다. 몽고디비 서버는 쿼리를 분석해서 옵티마이저라고 부르는 컴포넌트가 최적화된 실행 계획을 수립하면 실제 그 실행 계획에 맞게 디스크에서 데이터를 읽어는 역할은 스토리지 엔진이 하는 것이다.
스토리지 엔진 종류
- MMAPv1: 처음 출시됐을 때 사용되던 스토리지
- WiredTiger: 몽고디비 3.0부터 도입된 스토리지 엔진
- In-Memory: WiredTiger 변형, 디스크에 기록하지 않고 메모리에만 보관
- RocksDB
- TokuDB
MMAPv1 스토리지 엔진을 제외한 모든 스토리지 엔진은 도큐먼트 수준의 잠금을 지원하기 때문에 대부분 스토리지 엔진의 동시성 처리는 우수하다고 볼 수 있다. 또한 대부분 데이터 파일이나 인덱스의 압축도 지원한다.
WiredTiger 스토리지 엔진
WiredTiger 스토리지 엔진은 내부적인 Lock 경합 최소화를 위해서 Hazard-Pointer나 Skip-List와 같은 많은 신기술을 채택하고 있으며, 최신 RDBMS들이 가지고 있는 MVCC와 데이터 파일 압축, 암호화 기능 등을 갖추고 있다.
내부 동작 방식
다른 DBMS와 동일하게 B-Tree 구조의 데이터 파일과 서버 크래시로부터 데이터를 복구하기 위한 저널 로그(WAL)를 가지고 있다. 다른 RDBMS의 WA처럼 로테이션되면서 로그 파일의 로그 슬롯이 재활용되는 방식이 아니라 새로운 로그 파일이 계속 생성된다.
그리고 체크포인트 시점 이전의 저널 로그는 더 이상 필요하지 않으므로 체크포인트 이후 시점의 저널 로그만 남기저 이전 저널 로그는 자동으로 삭제한다.
공유 캐시
WiredTiger 스토리지 엔진에서 사용자의 쿼리는 공유 캐시를 반드시 거쳐야 한다. 그래서 공유 캐시의 최적화는 몽고디비의 처리 성능에 있어서 매우 중요한 역할을 담당한다. 짧은 시간에 수많은 쿼리를 처리해야 하는 OLTP(On-Line Transaction Processing) 시스템에서는 많은 쿼리들이 공유 캐시에 있는 하나의 데이터 페이지를 동시에 참조하기 위해 경합하는 경우도 많기 때문에 공유 캐시 객체에 대한 잠금 경합이 성능에 많은 영향을 미친다.
WiredTiger 엔진은 공유 캐시의 잠금 경합(Mutex Contention)을 최소화하기 위해서 Lock-Free 알고리즘을 사용한다. 해당 알고리즘은 잠금을 사용하지 않는 것을 의미하는 것이 아니라 경합을 최소화하는 알고리즘을 의미한다. 대표적으로 하자드 포인터와 스킵 리스트 자료 구조를 활용하여 Lock-Free를 구현하고 있다.
MVCC(Multi Version Concurrency Control)
MVCC는 하나의 도큐먼트에 대해서 여러 개의 버전을 동시에 관리하면서 필요에 따라 적절한 버전을 사용할 수 있게 해주는 기술이다.
WiredTiger 스토리지 엔진은 READ_UNCOMMITTED와 READ_COMMITTED 그리고 SNAPSHOT 격리 수준을 기본 격리 수준을 제공하며, 몽고 디비 서버에 내장된 WiredTiger 스토리지 엔진은 SNAPSHOT 격리 수준을 기본으로 하고 있다.
SNAPSHOT 격리 수준은 REPEATABLE_READ와 동일한 격리 수준이다. 그러므로 RDBMS와 비슷하게 검색을 실행하는 커넥션은 자신의 트랜잭션 번호보다 낮은 트랜잭션이 변경한 마지막 데이터만 볼 수 있다.
참고
- 도서 : Real MongoDB
'mongo' 카테고리의 다른 글
[Real MongoDB] Mongo DB (0) | 2024.10.20 |
---|