기본 CRUD 쿼리프로그램 언어로 MongoDB 쿼리를 작성하는 것은 쿼리 빌더와 같은 래퍼 클래스의 도움을 받으면 되기 때문에 그다지 어렵지 않으나, BSON 쿼리를 직접 손으로 입력해야 하는 경우에는 괄호 쌍을 맞추어야 한다. BSON 쿼리는 기존 RDBMS 의 SQL 과 문법과 오퍼레이터만 다를 뿐 실제 대부분의 기능을 제공하고 있다.RDBMS SQLMongoDB BSONINSERTdb.collection.insert()Batch DMLdb.collection.bulkWrite()UPDATE REPLCAE(INSERT ON DUPLICATE KEY UPDATE)db.collection.update()db.collection.update( { }, { $set : { } }, { upsert : tr..
Database/MongoDB
데이터베이스와 컬렉션MongoDB 서버에서도 다른 RDBMS 와 동일하게 하나의 인스턴스에 여러 개의 데이터베이스를 가질 수 있다.각 데이터베이스는 다시 여러 개의 테이블을 가질 수 있다.MongoDB 에서는 NoSQL 을 지향하기에 테이블이라는 이름보다는 컬렉션이라는 이름을 공식적으로 사용한다. 네임스페이스MongoDB 에서는 데이터베이스 이름과 컬렉션의 이름 조합을 네임스페이스라고 한다.네임스페이스에서 데이터베이스와 컬렉션 이름 사이는 반드시 . 으로 구분해야 한다.인덱스의 네임스페이스는 컬렉션의 네임스페이스에 추가로 인덱스의 이름을 붙인 형태이다.요약하면 '데이터베이스.컬렉션.$인덱스' 와 같이 부여된다.네임스페이스가 중요한 이유는 MongoDB 내부적으로 데이터베이스 이름이나 컬렉션 이름이 단독으..
Read & Write Concern 과 Read PreferenceMongoDB 는 분산처리를 기본 아키텍처로 선택하고 있기 때문에 단일 노드에서 단일 노드의 격리 수준뿐 아니라 레플리카 셋을 구성하는 멤버들 간의 동기화까지 제어할 수 있어야 한다.그래서 MongoDB 서버는 데이터의 Durability 수준에 따라 데이터를 변경하거나 조회할 수 있도록 Read, Write Concern 옵션을 제공한다.클라이언트 프로그램에서 쿼리 단위로 다르게 설정할 수 있다. Write Concern트랜잭션의 시작과 종료를 명시적으로 실행할 방법이 없다.따라서 MongoDB 서버는 도큐먼트를 저장할 때 사용자의 데이터 변경 요청에 응답이 반환되는 시점이 트랜잭션의 커밋으로 간주된다.이렇게 사용자의 변경 요청에 응답..
인덱스 속성인덱스 필드가 NULL 이 아닌 경우나 지정된 조건을 만족하는 경우에만 인덱스에 추가할 수 있다.TTL 인덱스도 제공한다. 프라이머리 키와 세컨드리 인덱스MongoDB 프라이머리 키 필드는 사용자가 필드의 이름을 결정할 수 없다.프라이머리 키 필드는 무조건 _id 라는 이름으로 도큐먼트에 저장되어야 한다.그렇지 않으면 MongoDB 가 자동으로 _id 라는 이름의 필드를 생성해서 추가한다. 컬렉션마다 단 하나의 프라이머리 키만 가질 수 있고, 그 외의 인덱스는 모두 세컨드리 인덱스라고 한다.프라이머리 키는 반드시 유일한 값을 가져야 하므로 유니크 인덱스를 생성할 수 없는 해시 인덱스는 프라이머리 키로 사용할 수 없다.또한 하나의 샤드에서는 중복 값에 대한 체크를 MongoDB 가 해주지만, 샤..
잠금멀티 쓰레드의 동시 처리 중에 발생할 수 있는 쓰레드 간의 충돌 문제를 막기위해 데이터베이스와 컬렉션 그리고 도큐먼트들의 잠금을 사용한다.여러 계층의 데이터베이스 오브젝트들에 대한 동시 처리를 위해서 인텐션 락과 다중 레벨의 잠금을 활용한다.또한 MongoDB 잠금은 서버 차원에서 처리되는 잠금과 스토리지 엔진에서 처리되는 잠금으로 나누어 볼 수 있다. MongoDB 엔진의 잠금명시적 잠금과 묵시적 잠금으로 나눠볼 수 있는데, 명시적 잠금은 글로벌 잠금 뿐이며 나머지 모든 잠금은 묵시적 잠금이다.데이터베이스나 컬렉션에 대한 잠금은 모두 묵시적이며, 이는 쿼리가 실행될 때 자동으로 획득했다가 해제되는 잠금이다. 글로벌 잠금글로벌 잠금은 MongoDB 서버 인스턴스에 단 하나만 있는 잠금으로 인스턴스 잠..
해시인덱스해시 인덱스는 B-Tree 인덱스만큼 범용적이지는 않지만 고유특성이 있는 인덱스 중 하나다.단일검색에는 최적화되지만 범위검색이나 정렬된 결과를 가져오는 목적으로는 사용할 수 없다.쿼리의 검색 성능을 향상시키기 위한 인덱스의 목적보다는 해시 샤딩을 구현하기 위해 꼭 필요한 인덱스이다. 해시 인덱스의 구조 및 특성해시 인덱스의 가장 큰 장점은 빠르다는 것이다.해시 인덱스는 트리 형태의 구조가 아니므로 검색하고자 하는 값이 주어지면 해시 함수를 거쳐 바로 버켓의 주소를 알아내며, 그 버켓을 읽어 즉시 해당 데이터의 레코드를 가져오기 때문이다. 일반적으로 버켓은 메모리에 로드되어 있고 해시 인덱스로 데이터 레코드를 읽는것은 디스크를 한번만 읽어서 데이터를 가져올 수 있음을 의미한다.해시 인덱스는 B-T..
쿼리의 성능에 있어 인덱스는 빠질 수 없는 부분이다.MongoDB 에서 사용할 수 있는 인덱스와 종류에 대해 살펴본다.또한 랜덤 I/O 와 순차 I/O 에 대해 살펴본다. 데이터베이스와 관련된 성능의 튜닝은 디스크 I/O 를 얼마나 줄이냐가 관건인 것들이 많이 있다. 디스크 읽기 방식디스크 저장 매체컴퓨터 장치의 성능을 보면 기계식 장치인 디스크가 가장 취약한 성능을 보였다.요즘은 이런 기계식에서 전자식으로 교체되고 있고 대표적으로 SSD 가 있다. SSD 는 D-RAM 과 달리 전원 공급에 관계없이 한번 기록한 내용을 영구적으로 보존하는 플래시 메모리를 내장하고 있고,D-RAM 보다는 떨어지지만 기계식 HDD 와 비교하면 월등하게 빠르다. SSD 의 가장 큰 장점은 랜덤 I/O 에 매우 적합하다는 것이..
청크 밸런싱샤드 간 데이터 불균형 현상을 피하기 위해 최대한 각 샤드가 가진 청크의 개수를 동일하게 만드려고 한다.그뿐만 아니라 하나의 청크가 너무 커지면 샤드 서버는 청크 하나의 이동에 너무 많은 시스템 자원을 소모한다.이렇게 하나의 청크가 너무 비대해지는 것을 막기 위해 각 청크에 데이터가 저장되거나 변경될 때마다 청크를 스플릿해야할지 체크하는 작업을 진행한다. 샤드 클러스터 밸런서밸런서는 샤드간 청크의 개수를 모니터링하다가 불균등해지면 적절히 청크를 옮겨서 샤드 간 부하의 균형을 맞춘다.불균형을 판단하는 기준은 청크를 가장 많이 가진 샤드와 가장 적게 가진 샤드의 개수가 임계치 이상 차이가 나면 청크 이동을 실행한다.전체 청크 수기준 치20개 미만의 청크를 가진 컬렉션220~79개 사이의 청크를 가..
샤딩 알고리즘청크각 컬렉션은 샤드 키를 기준으로 잘게 쪼개져 여러 샤드에 분산되어 관리된다.이렇게 쪼개진 컬렉션의 조각(파티션)들을 청크라고 한다. 청크는 샤드 키의 원본 값 또는 해시 값의 일정 범위를 가진다.샤드 키에서 가장 작은 값은 MinKey, 가장 큰 값은 MaxKey 로도큐먼트의 필드가 가질수 있는 최솟값과 최댓값을 지칭하는 가상의 값을 의미하는 예약어인데모든 청크는 MinKey 와 MaxKey 사이의 각 영역을 담당하게 된다. 청크는 어떠한 물리적인 의미를 가지지 않으며, 논리적으로만 존재하는 개념이다.즉 청크 단위로 데이터파일이 생성되거나 데이터가 모여있지 않다. 실제로 청크에 관계없이 하나의 컬렉션에 속한 데이터는 하나의 데이터 파일에 섞여서 존재한다.물론 컬렉션의 각 인덱스는 개별 파..
샤딩이란데이터를 여러 서버에 분산해서 저장하고 처리할 수 있도록 하는 기술이다. MongoDB 에서 샤딩을 적용하려면 샤드 클러스터를 구축해야 하는데,이를 위해 파티션된 데이터의 범위와 샤드 위치 정보 등의 메타 정보를 저장하기 위한 컨피그 서버가 필요하다. 응용 프로그램이 필요한 데이터를 조회하거나 저장하려면 mongos 라고 불리는 라우터서버가 필요하다.라우터는 쿼리 수행에 있어 프록시 역할을 하는데,컨피그 서버의 메타 정보를 참조하여 필요한 데이터가 저장된 샤드로 쿼리를 전달하고 그 결과를 다시 응용 프로그램으로 반환하는 역할을 한다. 샤딩의 필요성인터넷이 발달하고 인터넷이 가능한 단말기가 기하급수적으로 늘어나면서 서버에서는 더욱 많은 요청을 처리해야한다. 웹 서버는 특별한 설정이 필요한 상태를 가..