MMAPv1 스토리지 엔진
MMAPv1 스토리지 엔진은 MongoDB 초찾익부터 3.0 까지 주로 사용되던 스토리지 엔진이다.
2.6 버전까지는 데이터베이스 단위의 잠금을 사용했으나, 3.0 으로 업그레이드되면서 컬렉션 수준의 잠금으로 개선되었다.
하지만 컬렉션 수준의 잠금 또한 동시성 처리에 많은 걸림돌이다.
MMAPv1 스토리지 엔진은 자체 캐시 기능이 없어 운영체제의 캐시를 활용한다.
이는 커널이 제공하는 시스템 콜을 거치게 되므로 오버헤드가 상대적으로 큰 편이다.
또한 운영체제의 캐시 기능은 관리가 데이터베이스가 직접하는 것 보다 안정적이지 않다.
MMAPv1 스토리지 전망
현재는 MongoDB 서버가 업그레이드 되면서 MMAPv1 스토리지 엔진의 사용이 줄어들고 있다.
이는 MMAPv1 이 가진 단점이 많고 MongoDB 에서도 현재 기본엔진인 WiredTiger 의 기능과 안정성에 집중하고 있기 때문이다.
MMAPv1 스토리지 엔진 설정
MongoDB 설정 파일을 수정한다.
- storage 파트 engine 옵션을 mmapv1 으로 설정
- mmapv1 파트에서 MMAPv1 스토리지 엔진의 옵션을 설정
storage:
engine:"mmapv1"
mmapv1:
preallocDataFiles: <boolean>
...
...
...
성능을 좌우하는 파라미터는 딱히 없으며
preallocDataFiles 는 빈 데이터 파일을 미리 생성하여 데이터가 사용할 공간을 미리 예약해 둘 것인지 결정하는 옵션이다.
이 외 여러 옵션들도 있으며 대부분 파일과 관련된 설정들이다.
MMAPv1 엔진의 경우 MongoDB 서버 자체의 설정보단 리눅스의 커널 튜닝이 더 많이 필요하다.
MMAPv1 데이터 파일 구조
데이터파일은 데이터베이스 단위로 생성된다.
컬렉션의 데이터는 하나의 데이터베이스 파일에만 저장되는 것이 아니라,
데이터의 크기에 따라 여러 개의 데이터 파일로 나눠진다.
데이터베이스 이름이 데이터 파일의 이름으로 사용되며 각 파일은 자동으로 증가하는 순번을 확장자로 가지게 된다.
최초 파일은 64MB 로 생성되며 그 다음 증가는 64MB, 128MB 순으로 할당되고 2GB 까지 증가하면 그 이후에는 더 이상 증가하지 않고 새로운 디스크 파일을 사용한다.
컬렉션의 데이터는 많지 않지만 데이터베이스 개수가 많은 경우에는 공간 낭비가 심하기 때문에
storage.smallFiles 옵션을 이용하여 생성되는 파일의 크기를 작게 만들 수 있다.
또한 storage.directoryperDB 옵션을 이용해서 디스크의 데이터 파일을 데이터베이스 단위로 별도의 디렉터리에 저장할 수 있다.
tmp 디렉터리
각 데이터베이스 디렉터리에는 _tmp 디렉터리가 있는데 RepiareDatabase 명령을 실행할 때 사용하는 임시 작업경로이다.
ns 파일
그리고 데이터베이별로 ns 파일을 확인할 수 있는데, 이 파일은 데이터베이스와 컬렉션, 인덱스 정보를 저장한다.
pid, lock 파일
MongoDB 가 실행중인 프로세스의 번호를 저장하고 데몬 프로그램의 프로세스를 관리하는데 사용한다.
특히 lock 파일은 비정상적인 종료를 체크하고 복구를 수행할 것인지 판단하는 용도로 활용되므로 주의한다.
log 파일
MongoDB 의 로그를 기록하는 파일이다.
MongoDB 서버 상태 확인
상태를 확인할 수 있는 mongostat 이라는 도구를 제공한다.
이 도구는 현재 쿼리처리량과 메모리 사용량 등과 같은 MongoDB 전체적인 상태를 확인할수 있다.
mongodbstat 지표
열 | 설명 |
flush | 몇 번이나 데이터파일이 디스크에 동기화 되었는지 보여줌 |
mmaped | MMAPv1 스토리지 엔진에서만 보여지는 매트릭으로 페이지 캐시에 얼마나 매핑되어 있는지 보여줌 |
vsize | MongoDB 프로세스가 현재 사용중인 가상 메모리를 보여줌 |
faults | 디스크에서 데이터 페이지를 읽은 횟수 |
locked db | 데이터베이스 중에서 가장 잠금이 심한 데이터베이스를 보여 |
'Database > MongoDB' 카테고리의 다른 글
[MongoDB] WiredTiger 스토리지 엔진, 데이터파일 구조 (0) | 2024.05.13 |
---|---|
[MongoDB] 데이터를 읽고 쓰는 방법과 프레그멘테이션 관리 (0) | 2024.05.13 |
[MongoDB] MongoDB 아키텍처 MMAPv1, WiredTiger (0) | 2024.05.10 |
[MongoDB] MongoDB 의 CRUD 사용 ( SELECT, INSERT, UPDATE, DELETE ) (0) | 2024.04.18 |
[MongoDB] MongoDB 와 RDBMS 차이 (1) | 2024.04.18 |