WiredTiger 스토리지 엔진
Berkeley DB 개발자들에 의해서 개발된 임베디드 데이터베이스 엔진으로 현재 MongoDB 의 기본엔진이다.
이 엔진이 도입되기 전 MMAPv1 스토리지 엔진을 사용했는데 문제점이 많아 이 엔진으로 변경되었다.
이 엔진은 내부적인 잠금 경합 최소화를 위해 '하자드 포인터' 나 '스킵 리스트' 와 같은 많은 신기술을 채택하였다.
또한 MVCC 와 데이터파일 압축 그리고 암호화 기능들을 모두 가지고 있다.
WiredTiger 스토리지 엔진 설정
storage 의 enigine 필드를 wiredTiger 로 변경한다.
마찬가지로 이 외의 필드는 성능에 크게 영향을 미치지 않는다.
storage:
engine:"wiredTiger"
wiredTiger:
engineConfig:
cacheSizeGB:
journalCompressor:
directoryForIndexes:
collectionConfig:
blockCompressor:
indexConfig:
prefixCompression:
...
...
...
필드 | 설명 |
engineConfig.cacheSizeGB | WiredTiger 스토리지 엔진의 공유 캐시가 어느정도의 메모리를 사용하게 할 것인지 설정 |
collectionConfig.blockCompressor | WiredTiger 스토리지 엔진의 데이터 파일을 압축할 것인지, 압축한다면 어떤 알고리즘을 사용할 것인지 설정 |
indexConfig.prefixCompression | WiredTiger 스토리지 엔진의 인덱스는 기본적으로 데이터 블록단위의 압축은 지원하지 않고 프리픽스 압축을 지원하는데 프리픽스 압축을 사용할 것인지 설정 |
WiredTiger 스토리지 저장 방식
스토리지 엔진은 3가지 타입의 저장소를 가지고 있다.
1) 레코드(Row) 스토어
2) 컬럼 스토어
3) LSM(Log Structured Merge Tree) 스토어
레코드 스토어
일반적인 RDBMS 가 사용하는 저장 방식으로, 테이블의 레코드를 한꺼번에 같이 저장하는 방식이다.
구조체로는 B-Tree 를 사용한다.
컬럼 스토어
대용량의 분석용도로 자주 사용되는데, 테이블의 레코드와 상관없이 각 컬럼 단위 또는 컬럼의 그룹 단위로 데이터 파일을 관리한다.
컬럼 스토어는 특정 컬럼 단위로 데이터 파일을 생성하므로 데이터 파일으 크기가 작아지고 데이터를 읽어 들이는 속도도 매우 빨라져 대용량 분석에 적합한 방식이다.
LSM 스토어
카산드라와 같은 NoSQL 데이터베이스에서 자주 사용하는 저장 방식으로 읽기보다는 쓰기 능력에 집중한 저장방식이다.
LSM 은 내부적으로 B-Tree 알고리즘을 사용하지 않고 순차파일 형태로 데이터를 저장한다.
메모리에 저장 가능한 크기의 조각으로 데이터 파일을 관리하는데, 메모리에 저장 가능한 하계를 넘어서면 이를 디스크에 저장한다.
이렇게 메모리에서 디스크로 저장된 파일은 Level-0 파일이 되고,
Level-0 데이터 파일 조각이 많아지면 이를 모아서 Level-1 데이터 파일 조각을 만든다.
이렇게 로그처럼 계속해서 기록되는 파일들을 병하여 Level-n 까지의 데이터 파일로 계속 성장하는 방식으로 작동하므로 로그 기반의 병합 트리(Log Structured Merge Tree) 라 부른다.
쓰기 장점
B-Tree 는 레코드가 저장될 때마다 B-Tree 를 유지해야 하는 비용이 필요하고 트리도 커지기 때문에 INSERT 비용이 증가하는 구조인 반면, LSM 은 새로운 데이터는 메모리에 저장하고 메모리에 저장된 데이터가 커지면 이 데이터 파일만 메모리에서 디스크로 저장하면 된다.
따라서 B-Tree 와 다르게 INSERT 성능이 떨어지지 않는다.
읽기 단점
하지만 LSM 에선 데이터를 읽기 위해서 N 개의 데이터파일을 모두 검색해야만 원하는 데이터를 찾을 수 있다.
B-Tree 는 하나의 트리만 검색하면 되는 반면 LSM 은 모든 파일을 읽기 때문에 성능이 느리
WiredTiger 데이터 파일 구조
MMAPv1 스토리지 엔진과는 완전히 다른 구조를 사용한다.
명칭 | 설명 |
WiredTiger | 별도의 확장자를 가지지 않는 텍스트 파일로 현재 실행중인 스토리지 엔진의 버전을 저장하고 있음 |
storage.bson | BSON 포맷으로 WiredTiger 디렉터리 구조를 설명하는 옵션의 내용이 저장 |
sizeStorer.wt | WiredTiger 스토리지 엔진을 사용하는 컬렉션의 전체 도큐먼트 건수와 각 컬렉션의 데잍 파일 크기를 저장 이 정보를 이용하여 전체 도큐먼트 건수를 확인하는 쿼리는 메타 정보만 조회하여 매우 빠른 결과를 보여줌 다만 정확한 컬렉션의 도큐먼트 건수를 보여주지 않을 수 있음 - 샤딩된 클러스터 환경일 때 - 샤드간 재분산이 실행될 때 - 고아가 된 도큐먼트가 있을 때 - 서버가 비정상적으로 종료되었을 때 |
WiredTiger.lock | 다른 MongoDB 서버의 인스턴스가 동시에 사용하지 못하도록 잠금 역할을 하기 위한 파일 MongoDB 가 정상적으로 종료되었는지 판단하는 파일 만약 서버가 올라올 때 WiredTiger.lock 파일이 있다면 비정상적으로 종료되었다고 판단하고 복구를 수행 함 |
WiredTiger.turtle | WiredTiger 스토리지 엔진의 설정 내용을 담음 |
WiredTiger.wt | WiredTiger 스토리지 엔진의 메타 데이터를 저장하는 컬렉션의 데이터 파일 컬렉션에서 uri 필드에 각 컬렉션이나 인덱스의 파일경로가 표시 |
_mdb_catalog.wt | WiredTiger 스토리지 엔진 컬렉션과 인덱스의 목록 그리고 각 인덱스나 컬렉션이 사용하는 데이터 파일의 목록을 관리하는 파일 |
WiredTigerLAS.wt | 스토리지 엔진의 캐시에서 재활용할 수 있는 공간이 부족하면 필요한 만큼의 여유공간을 만들어야 사용자 요청 쿼리를 처리할 수 있음 이 때 캐시에서 제거해야 하는 데이터페이지들이 더티상태여서 디스크에 기록해야 할 때 필요하다면 임시로 WiredTigerLAS.wt 데이터 파일을 사용함 이렇게 임시로 기록된 더티페이지는 나중에 다시 원래 데이터파일로 기록되거나 캐시로 읽어와짐 |
diagnostic.data | 내부 정보를 1초에 한번씩 모아서 별도의 파일로 기록 - 운영체제의 상태정보 - 서버 상태 정보 - 복재 상태 - 호스트정보 등 3.2버전이 상에서 getDiagnosticData 명령을 사용하여 정보를 바로 가져올 수 있음 |
'Database > MongoDB' 카테고리의 다른 글
[MongoDB] 복제 (0) | 2024.05.20 |
---|---|
[MongoDB] WiredTiger 의 내부 작동방식 (0) | 2024.05.13 |
[MongoDB] 데이터를 읽고 쓰는 방법과 프레그멘테이션 관리 (0) | 2024.05.13 |
[MongoDB] MMAPv1 스토리지 엔진 (0) | 2024.05.13 |
[MongoDB] MongoDB 아키텍처 MMAPv1, WiredTiger (0) | 2024.05.10 |