Shared Cache
1. Shared Cache란 무엇일까?
디스크에서 읽은 page를 메모리에 캐싱해두는 공간이다.
데이터 변경 작업을 메모리 상에서 먼저 수행하고
dirty page를 일괄적으로 disk에 flush 함으로써 I/O를 줄여준다.
shared cache의 크기는 서버 재시작없이 조정이 가능하다.
사용량이 높지 않은 시점을 선택해서 실행하는 것이 권장된다.
2. Harzard Pointer란 무엇일까?
잠금 경합을 최소화하기 위해 사용되는 알고리즘이다.
data page를 참조하게 되면 harzard pointer에 해당 page를 등록한다.
shared cache에서 data page를 제거하는 eviction thread는
제거 대상에서 hazard pointer에 있는 page를 제외한다.
3. Skip List란 무엇일까?
잠금 경합을 최소화하기 위해 사용되는 알고리즘이다.
skip list는 linked list와 유사해보이나 검색을 할 때 특정 몇개의 노드만 거친다.
시간 복잡도는 b-tree와 같은 O(logn)이 걸린다.
b-tree에 비해서 검색 성능이 떨어지지만 구현이 간단하고 메모리 공간이 덜 든다.
삭제 작업 외에는 잠금이 필요하지 않기 때문에 동시성 측면에서 유리하다.
transaction이 rollback이 되면 기존 데이터를 복구하기 위해 undo log를 관리하는데 skip list를 사용해서 관리한다.
변경이 발생되면 변경 이후의 데이터를 skip list에 추가하고
쿼리가 수행되는 시점에서 skip list를 검색해서 원하는 시점의 데이터를 조회한다.
Journal Log
1. Journal Log란 무엇일까?
데이터 변경 작업을 복구할 수 있도록 기록해 두는 로그이다.
데이터를 먼저 메모리에 반영하고 나중에 디스크에 반영하기 때문에
중간에 서버가 비정상 종료되면 데이터가 유실될 수 있다.
이런 이유로 journal log를 기록해 두고 이를 사용해서 데이터를 복구한다.
journal log는 설정을 통해 활성화 여부를 지정할 수 있다.
replica set에서 secondary 노드의 journal log를 비활성화하면
매 쓰기 작업마다 checkpoint를 수행해서 disk와 동기화하는데 이는 부하로 이어질 수 있다.
데이터 저장
1. Data Page
데이터를 저장하기 위해 고정된 크기의 block이나 page를 사용하지 않는다.
page가 너무 커지는 것을 막기위해 page의 최대 크기 제한은 하고 있다.
설정을 통해 data page와 index page의 크기를 다르게 지정할 수 있다.
대규모 작업에서는 page 크기를 크게하고 소규모 작업에서는 page 크기를 작게 설정하는 것이 좋다.
2. Page Cache
운영체제가 disk I/O를 최적화하기 위해 사용하는 메모리 공간이다.
page cache를 사용하는 cached I/O는 wiredtiger의 shared cache와 os의 page cache
이중으로 캐싱되므로 메모리 공간이 낭비되는 문제가 생긴다.
하지만 page cache를 사용하지 않는 direct I/O보다 보통 빠르다.
3. 압축
mysql innodb의 경우 고정 크기의 page를 사용하며 압축할 때도 고정된 크기를 사용한다.
16KB의 page를 압축하는 경우 압축된 page가 4KB나 8KB가 되어야한다.
아닐 경우 16KB의 page를 2개의 page로 나누고 각각 압축을 한다.
하지만 mongodb wiredtiger는 가변 크기의 page를 사용하기 때문에 이런 과정을 거칠 필요가 없다.
block manager에 의해 wiredtiger의 shared cache는 압축이 해체된 상태로 로드되며
os의 page cache는 압축된 상태로 저장된다.
압축 알고리즘은 여러가지를 지원하며 collection, index, journal log에 대해서 각각 압축 설정을 적용할 수 있다.
index 파일의 경우 key prefix 압축이 적용되며
index key에서 왼쪽 부분의 중복되는 부분을 생략한다.
중복되는 부분이 짧을 경우 압축을 생략하기도 한다.
key prefix 압축은 block 압축과 달리 shared cache에서도 압축된 상태를 유지한다.
하지만 데이터를 읽는 과정에서 조립과정을 거쳐야하므로 속도가 떨어질 수 있다.
'분석 > 데이터베이스' 카테고리의 다른 글
| [MongoDB] 복제에 관해서 알아보자 (0) | 2025.09.22 |
|---|---|
| [MySQL] Performance Schema와 Sys Schema (1) | 2025.08.31 |
| [MongoDB] Sharding에 대해 알아보자 (0) | 2025.08.17 |
| [MySQL] Optimizer의 최적화 방식에 대해 알아보자 (0) | 2025.07.01 |
| [MySQL] InnoDB Storage Engiene에 대해서 알아보자 (0) | 2025.06.22 |