쿼리의 성능에 있어 인덱스는 빠질 수 없는 부분이다.MongoDB 에서 사용할 수 있는 인덱스와 종류에 대해 살펴본다.또한 랜덤 I/O 와 순차 I/O 에 대해 살펴본다. 데이터베이스와 관련된 성능의 튜닝은 디스크 I/O 를 얼마나 줄이냐가 관건인 것들이 많이 있다. 디스크 읽기 방식디스크 저장 매체컴퓨터 장치의 성능을 보면 기계식 장치인 디스크가 가장 취약한 성능을 보였다.요즘은 이런 기계식에서 전자식으로 교체되고 있고 대표적으로 SSD 가 있다. SSD 는 D-RAM 과 달리 전원 공급에 관계없이 한번 기록한 내용을 영구적으로 보존하는 플래시 메모리를 내장하고 있고,D-RAM 보다는 떨어지지만 기계식 HDD 와 비교하면 월등하게 빠르다. SSD 의 가장 큰 장점은 랜덤 I/O 에 매우 적합하다는 것이..
Database/MongoDB
청크 밸런싱샤드 간 데이터 불균형 현상을 피하기 위해 최대한 각 샤드가 가진 청크의 개수를 동일하게 만드려고 한다.그뿐만 아니라 하나의 청크가 너무 커지면 샤드 서버는 청크 하나의 이동에 너무 많은 시스템 자원을 소모한다.이렇게 하나의 청크가 너무 비대해지는 것을 막기 위해 각 청크에 데이터가 저장되거나 변경될 때마다 청크를 스플릿해야할지 체크하는 작업을 진행한다. 샤드 클러스터 밸런서밸런서는 샤드간 청크의 개수를 모니터링하다가 불균등해지면 적절히 청크를 옮겨서 샤드 간 부하의 균형을 맞춘다.불균형을 판단하는 기준은 청크를 가장 많이 가진 샤드와 가장 적게 가진 샤드의 개수가 임계치 이상 차이가 나면 청크 이동을 실행한다.전체 청크 수기준 치20개 미만의 청크를 가진 컬렉션220~79개 사이의 청크를 가..
샤딩 알고리즘청크각 컬렉션은 샤드 키를 기준으로 잘게 쪼개져 여러 샤드에 분산되어 관리된다.이렇게 쪼개진 컬렉션의 조각(파티션)들을 청크라고 한다. 청크는 샤드 키의 원본 값 또는 해시 값의 일정 범위를 가진다.샤드 키에서 가장 작은 값은 MinKey, 가장 큰 값은 MaxKey 로도큐먼트의 필드가 가질수 있는 최솟값과 최댓값을 지칭하는 가상의 값을 의미하는 예약어인데모든 청크는 MinKey 와 MaxKey 사이의 각 영역을 담당하게 된다. 청크는 어떠한 물리적인 의미를 가지지 않으며, 논리적으로만 존재하는 개념이다.즉 청크 단위로 데이터파일이 생성되거나 데이터가 모여있지 않다. 실제로 청크에 관계없이 하나의 컬렉션에 속한 데이터는 하나의 데이터 파일에 섞여서 존재한다.물론 컬렉션의 각 인덱스는 개별 파..
샤딩이란데이터를 여러 서버에 분산해서 저장하고 처리할 수 있도록 하는 기술이다. MongoDB 에서 샤딩을 적용하려면 샤드 클러스터를 구축해야 하는데,이를 위해 파티션된 데이터의 범위와 샤드 위치 정보 등의 메타 정보를 저장하기 위한 컨피그 서버가 필요하다. 응용 프로그램이 필요한 데이터를 조회하거나 저장하려면 mongos 라고 불리는 라우터서버가 필요하다.라우터는 쿼리 수행에 있어 프록시 역할을 하는데,컨피그 서버의 메타 정보를 참조하여 필요한 데이터가 저장된 샤드로 쿼리를 전달하고 그 결과를 다시 응용 프로그램으로 반환하는 역할을 한다. 샤딩의 필요성인터넷이 발달하고 인터넷이 가능한 단말기가 기하급수적으로 늘어나면서 서버에서는 더욱 많은 요청을 처리해야한다. 웹 서버는 특별한 설정이 필요한 상태를 가..
복제 로그 설정OpLog 는 큐처럼 작동하는 Cap 컬렉션으로 관리되는데,세컨드리 멤버가 OpLog 를 가져간다고 해서 컬렉션의 오래된 OpLog 가 자동으로 지워지지 않는다. 그래서 OpLog 를 저장하는 컬렉션은 항상 최대 크기를 명시해야 한다.oplog.rs 컬렉션을 포함한 Cap 컬렉션은 INSERT 이외의 데이터 변경을 허용하지 않으며,컬렉션이 지정된 크기를 넘어서면 MongoDB 서버가 자동으로 가장 오래된 데이터를 삭제하면서 지정된 크기를 넘지 않도록 한다. OpLog 컬렉션 크기 설정 컬렉션의 크기가 중요한 이유는 이 컬렉션이 OpLog 를 얼마나 담을 수 있느냐에 따라 세컨드리가 허용 가능한 지연 시간이 결정되기 때문이다. 프라이머리 OpLog 가 1 2 3 4 5 가 있을 때, 세컨드리..
복제여러 서버가 서로의 데이터를 동기화하는 것을 의미하는데 서로 주고받는 데이터에 따라 논리 복제와 물리 복제로 나뉜다. DRBD 와 같이 리눅스 서버가 데이터 내부를 전혀 모르는 상태에서 디스크의 블록만 복제하는 형태를 물리복제라고 한다.데이터베이스 서버가 직접 서 버간 데이터를 동기화하는 방식을 논리적 복제라고 한다. MongoDB 의 복제는 크게 2가지 '마스터-슬레이브 복제', '레플리카 셋 복제' 로 나뉘는데3.2 버전 이후로 마스터-슬레이브 복제는 사용되고 있지 않다. 컨센서스 알고리즘여러 서버가 복제에 참여해서 서로 같은 데이터를 동기화하는데, 이렇게 데이터를 공유하는 그룹을 레플리카 셋이라고 한다.그리고 하나의 레플리카 셋에는 프라이머리와 세컨드리로 각자의 역할이 나뉜다.레플리카 셋에 참여..
WiredTiger 엔진WiredTiger 스토리지 엔진은 트랜잭션을 지원하는 임베디드 데이터베이스 엔진으로 사용된다. WiredTiger 스토리지 엔진은 내장된 캐시를 가지고 있다.이 캐시는 디스크의 인덱스나 데이터 파일을 메모리에 캐시하여 빠르게 쿼리를 처리하고,데이터 변경을 모아 한번에 디스크로 기록하는 쓰기 배치 기능을 가지고 있다. 사용자가 쿼리를 실행하면 WiredTiger 스토리지 엔진은 블록매니저(Block Manager)를 통해서 필요한 데이터 블록을 디스크에서 읽어서 공유 캐시에 적재하여 쿼리를 수행한다.만약 사용자가 데이터를 변경하면 WiredTiger 스토리지 엔진은 트랜잭션을 시작하고 커서를 이용해 원하는 도큐먼트의 내용을 변경한다.도큐먼트의 변경 내용은 먼저 공유 캐시에 적용되는..
WiredTiger 스토리지 엔진Berkeley DB 개발자들에 의해서 개발된 임베디드 데이터베이스 엔진으로 현재 MongoDB 의 기본엔진이다.이 엔진이 도입되기 전 MMAPv1 스토리지 엔진을 사용했는데 문제점이 많아 이 엔진으로 변경되었다. 이 엔진은 내부적인 잠금 경합 최소화를 위해 '하자드 포인터' 나 '스킵 리스트' 와 같은 많은 신기술을 채택하였다.또한 MVCC 와 데이터파일 압축 그리고 암호화 기능들을 모두 가지고 있다. WiredTiger 스토리지 엔진 설정storage 의 enigine 필드를 wiredTiger 로 변경한다.마찬가지로 이 외의 필드는 성능에 크게 영향을 미치지 않는다.storage: engine:"wiredTiger" wiredTiger: eng..
운영체제 캐시앞 포스팅에서 말한 것처럼 MongoDB 의 MMAPv1 스토리지는 운영체제 캐시를 사용한다.따라서 OS 캐시정책이 매우 중요하다. 페이지 캐시의 데이터 읽기읽는 방법MMAPv1 스토리지 엔진은 리눅스의 캐시를 거쳐서 데이터를 MongoDB 서버로 읽어들인다.이를 순서로 표현하면 아래와 같다.1) MongoDB 서버가 필요로 하는 데이터는 먼저 리눅스의 페이지 캐시에 적재2) 그 데이터를 MongoDB 서버가 가져감3) 그 데이터를 다시 읽어야 하는 경우 디스크에서 읽지 않고 리눅스 페이지 캐시에 적재된 페이지를 조회함 문제점문제는 리눅스의 디스크 읽기는 주변의 일부 페이지들을 같이 읽어 들이는 경우가 많다.이를 Read-Ahead 라고 하는데, 데이터 파일에서 필요로 하는 페이지 주변의 ..
MMAPv1 스토리지 엔진MMAPv1 스토리지 엔진은 MongoDB 초찾익부터 3.0 까지 주로 사용되던 스토리지 엔진이다.2.6 버전까지는 데이터베이스 단위의 잠금을 사용했으나, 3.0 으로 업그레이드되면서 컬렉션 수준의 잠금으로 개선되었다.하지만 컬렉션 수준의 잠금 또한 동시성 처리에 많은 걸림돌이다. MMAPv1 스토리지 엔진은 자체 캐시 기능이 없어 운영체제의 캐시를 활용한다.이는 커널이 제공하는 시스템 콜을 거치게 되므로 오버헤드가 상대적으로 큰 편이다.또한 운영체제의 캐시 기능은 관리가 데이터베이스가 직접하는 것 보다 안정적이지 않다. MMAPv1 스토리지 전망현재는 MongoDB 서버가 업그레이드 되면서 MMAPv1 스토리지 엔진의 사용이 줄어들고 있다.이는 MMAPv1 이 가진 단점이 많..