WiredTiger StorageEngine 이란?
MongoDB WiredTiger는 MongoDB의 기본 스토리지 엔진 중 하나이다.
WiredTiger는 2014년 MongoDB 버전 3.0에서 처음 도입되었으며,
기존의 MMAPv1 엔진 대신 새로운 알고리즘과 데이터 구조를 도입하여
더 빠르고 효율적인 데이터베이스 엔진을 만들어내는 데 중점을 두고 개발되었다.
WiredTiger StorageEngine 구조 및 작동 방식
WiredTiger 스토리지 엔진은 B-Tree 구조의 데이터 파일과
서버의 장애 시 데이터 복구를 위한 저널 로그를 가지고 있다.
WiredTiger의 저널 로그는 데이터 디렉터리 하위에 있는
journal이라는 디렉터리에 저장되며,
다른 RDBMS의 redo 로그처럼 로테이션되면서 로그 파일의
로그 슬롯이 재활용되는 방식이 아닌
새로운 파일이 계속 생성되는 방식을 취한다.
체크포인트 시점에서 이전의 저널 로그는 더 이상 불필요하므로
이후 시점의 파일만 남기고 이전의 로그 파일은 자동으로 삭제된다.
또한 wiredtiger 스토리지 엔젠은 MMAPv1 스토리지 엔진과는 달리
내장된 공유 캐시를 가지고 있다.
내장된 공유 캐시는 디스크의 인덱스나 데이터 파일을 메모리에 캐시 하여
조회를 빠르게 처리할뿐만 아니라,
데이터 변경을 모아서 한번에 디스크로 기록하는 배치 쓰기 기능을 모두 가지고 있다.
사용자가 쿼리를 실행하면 블록 매니저를 통해서
필요한 데이터 블록을 디스크에서 읽어 공유 캐시에 적재하여 쿼리를 수행한다.
사용자가 데이터를 변경하면 스토리지 엔진은 트랜잭션을 시작하고
커서를 이용해서 원하는 도큐먼트 내용을 변경한다.
도큐먼트의 변경 내용은 먼저 공유 캐시에 적용되는데
WiredTiger 스토리지 엔진은 변경된 데이터가 디스크에 기록되는 과정을 기다리지 않고
먼저 저널 로그에 기록한 다음에 사용자에게 작업 처리 결과를 리턴한다.
공유 캐시에 변경 내용이 어느 정도 쌓이게 되면 체크포인트를 발생시켜서
공유 캐시의 더티 페이지를 모아서 디스크에 기록한다.
이때 더티 페이지는 디스크에 기록하기 전에 가공 작업
(원본 레코드와 변경된 정보의 병합)을 거쳐야 하는데,
WiredTiger 스토리지 엔진의 리컨실리에이션(Reconciliation)
모듈이 이 작업을 수행한다.
Eviction 모듈은 공유 캐시가 적절한 메모리 사용량을 유지하도록 공유 캐시에서
자주 사용 되지 않은 데이터 페이지들을 제거하는 작업을 수행한다.
제거해야 하는 데이터 페이지가 더티 페이지라면 리컨실리에이션 모듈을 이용해
디스크에 데이터를 기록하고 공유 캐시에서 제거하는 작업을 수행한다.
WiredTiger 스토리지 엔진의 데이터 페이지(블록)는 블록 크기에 대한
상한선은 있지만 모두 가변 사이즈이다.
Block Manager는 변경된 데이터 블록을 기록할 때,
프레그멘테이션을 최소화하면서 데이터 블록의 크기에
최적인 위치를 찾아서 저장한다.
또한, Block Manager는 데이터 블록의 압축과 암호화 등과 같이
응용 프로그램에 투명하게 작동하는 기능을 모두 내장하고 있다.
WiredTiger StorageEngine 의 특징
WiredTiger StorageEngine 이 존재하기 전에
mongodb 는 MMAPv1 StorageEngine 방식을 사용했다.
두 엔진의 차이점을 확인해 보자.
[ 압축방식 ]
MMAPv1
- 압축 지원하지 않음
WiredTiger
- 압축을 지원함.
1. Snappy
- CPU 사용률이 낮고 압축 속도가 빠르므로, 디스크 I/O 작업을 줄이고
디스크 공간을 절약할 수 있는 압축 방식이다.
- zlib에 비해서는 압축률은 낮은 편이다.
2. Zlib
- CPU 사용률이 높고 압축 속도가 느리지만, 압축률이 상당히 높기 때문에
디스크 공간을 최대한 절약할 수 있다.
3. Snappy + zlib 압축
WiredTiger는 Snappy와 zlib를 조합한 압축 기술도 지원한다.
이 방식은 Snappy로 압축한 데이터를 zlib로 다시 압축하여
높은 압축률과 빠른 압축 속도를 모두 활용할 수 있다.
[ 멀티스레드 지원 ]
MMAPv1
- 멀티스레드 지원하지 않음.
- 여러 스레드가 동시에 작업할 때 데이터 일관성이 유지되지 않을 수 있으며,
느린 처리 성능을 제공할 수 있다.
WiredTiger
- 멀티 스레드 지원.
- 멀티스레드 아키텍처를 지원하므로, 여러 개의 스레드를 사용하여
동시에 데이터를 읽고 쓸 수 있다. 이를 통해 데이터베이스 성능을 향상할 수 있다.
[ 캐시 방식 ]
MMAPv1
- 시스템 캐시를 사용.
1. 캐시 오버플로우 발생가능
- 시스템 캐시는 운영 체제에서 관리되므로,
운영 체제의 메모리 제한에 영향을 받는다. MongoDB에서 시스템 캐시를
많이 사용할 경우, 운영 체제의 메모리가 부족해지면서
캐시 오버 플로우가 발생할 수 있다.
캐시 오버플로우가 발생하면, MongoDB의 쿼리와 작업의 성능이 감소할 수 있다.
2. 캐시 오염
- MongoDB에서 사용하는 데이터와 다른 애플리케이션이 사용하는 데이터가
동일한 메모리 주소를 참조할 경우, 캐시 오염이 발생할 수 있다.
캐시 오염이 발생하면, MongoDB에서 잘못된 데이터를
사용할 수 있다.
3. 느린 디스크 액세스
MongoDB에서 시스템 캐시를 사용하면,
일부 데이터가 캐시에 저장된다. 그러나, 캐시에 저장되지 않은 데이터는
디스크에서 읽어와야 한다.
시스템 캐시의 크기가 작거나, 캐시의 정책이 적절하지 않으면
느린 디스크 액세스가 발생할 수 있다.
이는 MongoDB의 쿼리와 작업의 성능에 영향을 미칠 수 있다.
WiredTiger
- mongodb 전용 캐시를 사용함.
1. 빠른 데이터 액세스
MongoDB의 자체 캐시는 데이터를 메모리에 저장하므로,
데이터 액세스 속도가 빨라진다.
자주 액세스하는 데이터가 캐시에 저장되면,
디스크에서 데이터를 읽어오는 것보다 빠르게 데이터에 액세스 할 수 있다.
2. 높은 처리량
MongoDB의 자체 캐시는 메모리에서 데이터를 읽어오므로,
디스크에서 데이터를 읽어오는 것보다 빠르게 데이터를 처리할 수 있다.
이는 MongoDB의 처리량을 높이고, 애플리케이션의 성능을 향상하는 데 도움이 된다.
3. 유연한 캐시 정책
MongoDB의 자체 캐시는 유연한 캐시 정책을 사용할 수 있다.
예를 들어, TTL(Time To Live) 캐시 정책을 사용하여 데이터의 유효기간을 설정할 수 있다.
또한, MongoDB의 자체 캐시는 애플리케이션의 요구에 따라
캐시의 크기를 동적으로 조정할 수 있다.
4. 안정성
MongoDB의 자체 캐시는 MongoDB 프로세스 내부에서 관리되므로,
운영 체제의 메모리 제한에 영향을 받지 않는다.
또한, 자체 캐시는 MongoDB에서 사용하는 데이터와
다른 애플리케이션이 사용하는 데이터를 분리하여 관리하므로,
캐시 오염이나 오버플로우 등의 문제가 발생하지 않는다.
[ 저장방식 ]
MMAPv1
- 메모리 매핑하는 방식으로 데이터를 저장.
- 이는 파일에서 데이터를 읽을 때 메모리에
매핑된 부분만 읽어 들이므로 매우 빠른 읽기 성능을 제공하지만,
쓰기 작업은 느릴 수 있다.
또한 파일 크기가 커지면 메모리 사용량도 커지기 때문에,
디스크 공간을 불합리하게 사용할 수 있다.
WiredTiger
- B-Tree 알고리즘을 사용하여 데이터를 저장.
- 즉 데이터파일을 메모리에 직접 올려놓는것이 아닌,
인덱스를 메모리에 올려두고 해당 인덱스의 정보를 바탕으로
디스크 에서 정보를 읽어온다. (추가 I/O 는 발생 가능함)
- 이는 데이터를 페이지 단위로 저장하고,
페이지를 단위로 디스크에 쓴다. 따라서 쓰기 작업이 빠르며,
파일 크기와 메모리 사용량을 효율적으로 관리할 수 있다.
StorageEngine Type | MMAPv1 | WiredTiger |
압축 | 압축 지원하지 않음 | 압축 지원함. Snappy Zlib Zlib + Snappy |
멀티스레드 지원 유무 | 단일 스레드 지원. | 멀티 스레드 지원. |
캐시 방식 | 시스템 캐시를 사용. |
자체 캐시를 사용 |
저장방식 | 메모리 매핑하는 방식으로 데이터를 저장. |
B-Tree 알고리즘을 사용하여 데이터를 저장. |
'MongoDB' 카테고리의 다른 글
[MongoDB] Ubuntu MongoDB 설치 - mongoshell 설치 (0) | 2022.11.28 |
---|---|
[MongoDB] Ubuntu MongoDB 설치 - mongos 설치 (0) | 2022.11.25 |
[MongoDB] Ubuntu MongoDB 설치 - mongoc 설치 (0) | 2022.11.24 |
[MongoDB] Ubuntu MongoDB 설치 - mongod 설치 (0) | 2022.11.23 |
[MongoDB] MongoDB 란? (0) | 2022.11.22 |