글모음

글쓴이의 글모음

MongoDB 2.4 New Feature : V8 JavaScript Engine

글 : 이승용

MongoDB 2.4 버전에서 우리가 주목할 점은 hashed-index와 자비스크립트 엔진이 구글의 V8 엔진으로 변경되었다는 점이다. Hashed-index에 대해서는 저번 글에서 간단하게 살펴보았고, 이번에는 자비스크립트 V8 엔진에 대해서 살펴보기로 한다.

MongoDB의 자바스크립트 엔진은 버전 2.4가 발표되기 전에 모질라의 SpiderMonkey 엔진을 사용하고 있었다. 한가지 우리가 집고 넘어가야 할 점은 버전 2.4 이전에 자바스크립트 엔진을 V8로 사용하지 못하는 것은 아니었다는 점이다. 실제로 10gen은 MongoDB의 자바스크립트 엔진을 SpiderMonkey와 V8 둘 중에 하나로 빌드 할 수 있도록 제공하고 있었다.

이 두 자바 스크립트 엔진의 가장 큰 차이점은 멀티 쓰레드와 속도이다. SpiderMonkey 엔진은 멀티 쓰레드를 지원하지 않지만 V8 엔진보다 빠르고, V8 엔진은 멀티 쓰레드를 지원한다. 10gen은 MongoDB 버전 2.4 이전까지 SpiderMonkey를 유지하고 있었던 것은 쓰레드 환경보다는 자바 스크립트 엔진의 빠른 속도가 더 중요시 되었기 때문으로 보인다. 실제로 MongoDB는 $where, mapreduce, group, eval 문으로 작성된 질의를 자바스크립트 엔진을 이용하여 처리하고 있기 때문에, 무엇보다 빠른 속도의 자바스크립트 엔진이 필요했을 것이다.

하지만, 10gend은 MongoDB의 락 시스템이 global lock에서 database lock으로 변경되고, 또 앞으로 collection lock으로 변경될 것이라는 로드 맵을 보여주고 있다. 락 시스템의 변경은 데이터베이스에서 병렬 처리를 위한 가장 핵심이 되는 항목이다. 락 범위가 크다는 것은 락 선점 시간이 커지기 때문에 동시 처리가 줄어들게 되는 반면, 자원을 독점하여 빠른 처리를 할 수 있다. 하지만, 멀티 코어에 따른 하드웨어의 발전은 범위 큰 락에 의한 CPU 활용도가 떨어지는 현상을 유발하게 되었고, MongoDB도 락 범위의 축소와 함께, CPU 활용도를 늘리는 정책으로 선회한 것으로 보인다.

필자의 개인적인 의견으로도, V8 엔진을 사용하는 것이 바람직하다고 보인다. 자바 스크립트로 동작하는 MapReduce를 수행할 때, 많은 시간을 걸리는 MapReduce 작업이 끝날 때까지 질의를 수행하지 못한다는 것은 끔직한 일이기 때문이다. 인터넷 자바스크립트 엔진의 성능 비교 사이트의 자료를 보면 SpiderMonkey가 V8보다 약 30% 정도 빠르다고 나온다. 하지만 실질적인 테스트를 수행해 보면, 15% 정도의 차이가 있다. 하지만, 동접 처리를 할 수 있는 장점에 비한다면 15%의 속도 문제는 그다지 큰 문제점으로 보이지 않는다.

개발자들이 MongoDB 버전 2.4를 사용할 때 주의할 점은, V8 자바스크립트 엔진은 ECMAscript 5th edition을 지원하고 있기 때문에, 기존 SpiderMonkey가 가지고 있던 비표준 기능은 사용할 수 없다는 것이다. 따라서, 기존에 작업하였던 자바스크립트 로직에서 syntax error가 발생할 수 있음에 주의하자.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: 미분류 Tags: , ,

Hashed index of MongoDB 2.4

글 : 이승용

10gen에서 MongoDB 2.4를 3월 19일에 발표하였다. 발표된 새로운 MongoDB 2.4의 기능 중에서 관심 있게 필자가 살펴본 기능은 해시 인덱스(hash index) 부분이다. MongoDB는 데이터 분할을 위한 방법을 도큐멘트를 구성하는 임의의 항목을 분할 키로 설정하여 키 영역에 따른 샤드 구조를 가지고 있었다. 이러한 구조는 많은 MongoDB를 사용하는 사람들에게 영역에 따른 샤드 분할이 빠른 검색을 제공해주는 장점을 가지고 있지만, 데이터 분배가 골고루 발생되지 않는다는 문제점을 가지고 있었다. 즉, 특정 영역으로 데이터 삽입이 몰리면 한쪽 샤드로 부하가 집중되고 나머지 영역을 가지고 있는 샤드는 부하가 발생하지 않는 비효율적인 구조가 된다. 물론 MongoDB의 자동 분할(auto-sharding) 기능을 이용한다면 한쪽으로 집중된 데이터가 다른 샤드로 이동되면서 부하가 분산될 수 있다고 말할 수 있다.

MongoDB 2.4는 이러한 문제를 해결하기 위해, Dynamo에서 사용된 Consistent Hash 기법을 이용하여 데이터 저장 분포를 균등하게 가질 수 있는 해시 인덱스(hased index) 기능을 제공한다. 해시 인덱스는 샤드 키 값의 영역으로 데이터 분할을 수행하던 분할 기준을 샤드 키 값을 해시 값으로 변환하여 데이터를 분할하는 방법이다. 하기 그림을 살펴보자. 그림과 같이 샤드 키 값 1은 MD5 해시 알고리즘에 의해 2193[1]으로 변환되었고, 변환된 해시 값은 config 서버에 등록된 청크 테이블에서 해당되는 샤드를 검색한다. 그리고 검색된 샤드로 질의를 수행한다.

MD5 해시의 특성상 연속된 2개의 값이 연속된 해시 값을 가진다고 보장할 수 없기 때문에 고르게 분포되어 데이터가 저장된다. 이외에도 문자열로 구성된 샤드 키를 해시 인덱스를 이용하여 적용할 경우, 비교 대상이 해쉬 값으로 변경되어 문자열 보다 빠른 샤드 키 선택이 이루어진다.[2]

앞에서 논한 것처럼, 해시 인덱스가 장점만을 가지는 것은 아니다. 해시 인덱스의 경우는 범위 검색이 불가능하다는 단점이 있다. 즉, a라는 항목이 정수 값을 가지고 있고, 이를 해시 인덱스로 정의하였다면, a > 30와 같은 질의를 위해 해시 인덱스를 사용할 수 없고, 전체 샤드에 동일한 질의를 모두 전달하여 해당 범위의 값을 취득한다.

MongoDB의 발전된 모습의 한가지로 해시 인덱스를 제공해 주고 있지만, 해시 인덱스 사용 역시 MongoDB를 사용하는 프로그래머의 몫이다. 데이터 저장이 높은 cardinality를 보장하여야 한다면, 해시 인덱스가 좋은 해결책이 될 수 있지만, 범위 검색과 같이 특정 영역 안에 있는 데이터를 빈번하게 검색하는 질의에서는 그다지 좋은 성능을 보장하지 못한다. 또한 해시 인덱스의 분할 영역 역시 자동으로 사용하지 않을 경우, 프로그래머가 직접 정의하기 때문에 분할 영역 설정에 신중해야 한다.


[1] 해시 값 2193은 1의 MD5의 해시 값이 아닌 가상의 값이다.

[2] MongoDB가 제공하고 있는 해시 인덱스는 128bit의 MD5 중에서 64비트만을 사용한다.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: 샤딩 Tags:

New Released – Monad Management for MongoDB v2.3

MongoDB 모니터링 및 관리도구인 Monad Management가 버전 2.3으로 업그레이드 했다. 버전 2.3은  버전 2.2에서의 일부 버그와 MongoDB의 샤딩 정보를 볼수 있는 기능을 새롭게 추가하였다. 자세한 사항은 다음과 같다.

2.3.0 (2012-11-23)

  • Defect : Fix the faults about does not display daemon detailed information of mongos.
  • Defect : Fix the faults about zero stored collections from DB detailed information of mongos.
  • Defect : Fix the faults about vanishing email address when change mongo version on settings menu.
  • Feature : Added radio button for select between “difference” and “accumulation” graph on Dashboard DB-layered popup window.
  • Feature : Added balancer status icon upper right side of screen for monitoring of the load of sharding..
  • Feature : Added a page that displays the sharding information.
    • Shards information
    • Databases information
    • Collections information
    • Chunks information
  • Feature : Sharding status graph for monitoring how many chunks are on each shard.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: 관리도구 Tags:

New Released – Monad Management for MongoDB v2.2

11월 7th, 2012 한 개의 댓글

MongoDB 모니터링 및 관리도구인 Monad Management가 버전 2.2로 새롭게 업그레이드 했다. 이번 버전에서는  MongoDB 2.2의 데이터베이스별 락을 지원해주고 있으며, 그래프 시간대별 선택을 편리하게 제공해주는 time-slider control을 추가하였다. 이번 버전 역시 프리웨어로 제공된다. 자세한 업그레이드 내용은 다음과 같다.

1. Support MongoDB v2.2

  • New added “Lock Graph” Menu
    • Daemon-specific Lock Graph
    • DB-specific Lock Graph
    • Lock Graph by types
    • Group-specific Lock Graph
  • New Added “DB Graph” Menu
  • Support Daemon-specific information for MongoDB v2.2
  • Set option for switch function about MongoDB v2.0 and MongoDB v2.2

2. Improvement of Graph

  • Feature of date selection using slider control.
    • Support time-scaling function : 10 seconds, 1 minute, 5 minutes, 30 minutes, 1 hour.
    • Support Graph function : Accumulate Graph, Different Graph
  • Graph for Daemon detailed information
  • New added Graph function
    • Network In/Out Graph
    • Global Read/Write Graph
    • Lock Read/Write Graph
    • DB & Index Graph

3. Improvement of Dashboard

  • Added “Locks Sum” Graph
  • Global Lock Read/Write summary
  • DB Locks Read/Write summary

4. Improvement of Event

  • Support “Global Lock Read/Write” alert
  • Support “DB Locks Read/Write” alert

5. Converting Tool for previous version

  • Provide data converting tool for new version for user who using previous version (2.0.1)

ScreenShot

time-slider control in Graph

새롭게 첨가된 그래프 기능


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: 관리도구 Tags: ,

Free Download – Monad Management for MongoDB

10월 4th, 2012 13 개의 댓글

MongoDB 전용 관리도구인 Monad Management for MongoDB의 free download 버전을 이번에 공개하였다. 이 버전은 등록할 수 있는 데몬의 개수를 3개로 제한할 뿐, 어드민 기능을 포함한 모든 기능을 사용할 수 있다. 또한 이번 공개 버전은 최근에 발표한 통계 시각화에 역점을 둔 v2.0 버전을 제공한다. Free download 버전을 사용하기 원하는 사용자는 Monad 사이트(http://monad.citsoft.net)에 접근하여 이메일 주소를 등록하면 바로 다운로드 받을 수 있다.

(주)카디날정보기술


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: 관리도구 Tags:

Monad Management for MongoDB v2.0 – MongoDB 관리도구

Monad Management for MongoDB v2.0이 출시되었다. 이번 버전에서는 통계 시각화에 역점을 두어 대시보드에서 제공되었던 전체 현황 그래프에 대해 상세 그래프 기능을 제공하여 자세한 정보를 확인할 수 있게 하였고, 데몬 상태를 상세 레벨로 확인할 수 있는 상세 리스트 기능과 항목별 그래프를 확인할 수 있는 기능을 제공 한다. 또한, “그래프” 메뉴를 신설하여 각 항목별, 그룹별, 유형별로 통계 수치를 확인할 수 있으며, 멀티 항목 그래프를 지원, 보다 손쉽게 정보의 흐름 및 요약 내용을 쉽게 파악하는 기능을 제공한다. 이벤트 메뉴 또한 개편되어 각 이벤트 발생에 대한 상세 정보 및 그래프를 함께 제공, 해당 시점의 변화 내용을 간편하게 확인하는 기능을 제공한다.

(주)카디날정보기술


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: 관리도구 Tags:

MongoDB의 샤딩

MongoDB의 샤딩 구조는 분산데이터베이스의 전통적인 분할 3계층 구조 – 응용, 중개자, 데이터 계층 – 를 가진다. 중개자 역할을 담당하는 mongos와 중개자의 메타 정보를 저장하고 있는  config 서버, 그리고 데이터를 저장하는 mongod 로 구성된다. 본 절에서는 이러한 MongoDB의 샤딩 구조에 대한 기본적인 개념부터, 각 모듈들이 처리하는 내부 구조에 대해서 알아본다.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: 샤딩 Tags: , , , ,

MongoDB의 락

C++로 개발된 MongoDB는 boost의 shared_mutex를 이용하여 락 시스템을 개발하였다. shared_mutex는 기본적으로 one writer many reader의 구조를 가지기 때문에 MongoDB는 쓰기 락이 한 개만 존재한다. 이러한 점은 MongoDB의 쓰기 연산에서 부하가 발생할 경우, 전체적인 시스템 부하를 야기할 수 있다.  하지만, 10gen에서는 쓰기 연산 속도가 매우 빠르기 때문에, MongoDB의 락이 부하를 발생시키지 않는다고 말한다. 사실 NoSQL은 트랜잭션이 없기 때문에 쓰기 연산에 대한 부하가 RDB 처럼 심하지 않다. 즉 근본적인 쓰기만 수행하면 되기 때문에 매우 빠른 특징을 가진다. 또한 MongoDB는 1차적으로 메모리에 데이터를 쓰기 때문에 쓰기 연산 속도가 빠르다는 것이 보장된다.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: Tags: , ,

Monad Management for MongoDB v1.0 – MongoDB 관리도구

MongoDB 관리도구인 ‘Monad Management for MongoDB v1.0′이 출시되었다.  Monad Management 시스템은 설정 된 임계 값 정보 등을 통해 시스템에 발생할 장애 등을 미리 예측할 수 있으며, 미리 시스템의 증설 시기 등을 계획하거나, 불필요한 데이터의 삭제 시기를 정확하게 판단하여 불필요한 운영 비용을 절감할 수 있게 한다. 또한, 갑자기 발생되는 장애에 대해서도 대시보드와 아이콘, 이메일 등을 통한 즉시 알림 기능을 통해 운영자가 즉각적인 조치를 하게 함으로써 빠른 시스템 복구가 가능하게 하며, MongoDB의 유형별 상세 정보를 파악,  효율적인 시스템 관리를 가능하게 한다.

(주)카디날정보기술


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

MongoDB의 복제

MongoDB가 많은 사람들에게 각광받고 있는 것은, 빠른 속도와 다른 NoSQL 보다 유연한 쿼리를 제공해 주기 때문이다. 빠른 속도는 기존 RDBMS가 가지고 있던 대용량으로 확장성 문제를 해결해주는 대안이 되었고, 유연한 쿼리는 RDBMS가 가지는 복잡한 쿼리를 대체할 수 있다는 기대감을 가져다 주었다. 이뿐만 아니라, MongoDB는 시스템 장애에 따른 안정성을 보장하기 위해 장애 대응 방안으로 복제와 저널링을 제공해 주고 있다.

MongoDB가 제공하고 있는 장애 대응에 대한 기능으로 복제와 저널링 시스템에 대한 내부 구조를 살펴보는 것과 함께, NoSQL의 근본적인 문제인 데이터 유실 가능성에 대해서 살펴본다.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS