MongoDB의 Write Concern

Pinterest

글 : 이승용

MongoDB의 경우는 [그림 1-4]의 경우를 디폴트로 설정하여 사용한다. 이를 NORMAL 상태라 하고, 클라이언트는 서버에 데이터 전송이 완료되었음을 인지하고 서버가 데이터를 저장소에 저장하였는지를 통보해 주지 않는다. 서버 저장소에 보내준 데이터가 완료되었음을 알기 위해서는 getLastError() API를 통해 알 수 있다는 것이다.

다음의 [표 1]을 보자. [표 1]은 MongoDB가 지원하고 있는 쓰기 연산과 관련된 일관성 모드를 보여준다. MongoDB는 일관성 모드를 WriteConcern 이라는 객체로 지원한다. MongoDB가 C++로 개발되었음에도 불구하고, 자바 드라이버가 C++보다 체계적이다. 특히, 일관성과 관련된 부분은 C++에서도 지원되기는 하지만, 기능이 정확하게 문서화가 되어 있지 않는 반면, 자바에서는 추상화된 일관성 모드를 지원하기 위한 기능이 자세히 언급되어 있다. [표 1] 역시 자바에서 지원하는 일관성과 관련된 WriteConcern과 관련된 사항이다.

 

[표 1] MongoDB의 WriteConcern

WriteConcern Type 내 용
FSYNC_SAFE Exceptions are raised for network issues, and server errors; the write operation waits for the server to flush the data to disk.
JOURNAL_SAFE Exceptions are raised for network issues, and server errors; the write operation waits for the server to group commit to the journal file on disk.
MAJORITY Exceptions are raised for network issues, and server errors; waits on a majority of servers for the write operation.
NONE No exceptions are raised, even for network issues.
NORMAL Exceptions are raised for network issues, but not server errors.
REPLICAS_SAFE Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
SAFE Exceptions are raised for network issues, and server errors; waits on a server for the write operation.

* Default: Normal[1]

 

[표 1]의 SAFE는 [그림 1-5]의 경우를 말한다. 즉, 서버에서 저장소에 클라이언트가 보내준 데이터가 저장되었음을 나타낸다.
 

DBCollection coll...;

coll.insert(..., WriteConcern.SAFE);

 
자바로 상기와 같이 쓰기 명령을 수행하면 데이터가 안전하게 저장되고 난 다음에 insert() 메소드가 리턴한다. 또는 다음과 같이 getLastError()를 활용하는 방법도 있다.
 

DB db...;
DBCollection coll...;

db.requestStart();
coll.insert(...);
DBObject err = db.getLastError();
db.requestDone();

 
여기에서 다음과 같은 질문이 나올 수 있다. “그렇다면, SAFE 모드는 서버에 ACK를 받아야만 하니깐, 속도가 느려지는 것 아닌가?” 당연하다. [그림 1-4][그림 1-5]에서 보다시피 [그림 1-5]는 두 번의 데이터가 서로 교환되어야 한다. 얼핏 보아도 2배는 느려 보인다. 실제로 한 개의 연결만 가지고 쓰기 연산에 대한 테스트를 수행한다면, 2배 정도의 속도 차이가 난다. 하지만, MongoDB는 한 개의 연결 당 쓰레드로 구성된다. MongoDB의 연결 개수는 운영체제가 지원하는 쓰레드 수와 관련이 있으며, 시스템 하드웨어 성능에 따라서도 달라진다.

 MongoDB의 WriteConcern을 SAFE 모드로 검증을 한 결과, 한 개의 연결에서는 2배 정도의 성능 차이가 발생하지만, 복수 개의 연결에서는 병렬처리로 인해 약 15%의 성능 차이를 보인다. 따라서, 15%의 성능 저하를 감한 하더라도, 일관성이 중요한 데이터에 대해서는 SAFE 모드를 지원하는 것이 바람직하다. 하지만, 일관성 보다는 쓰기 성능에 이슈가 있는 경우라면 NORMAL 모드를 사용하여도 좋을 듯 하다.

 

이전글 : 소켓의 blocking-mode


[1] 일관성 지원 클래스인 WriteConcern의 유형은 자바 드라이버 2.7.2 버전을 기준으로 한다.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
  1. 아직 댓글이 없습니다.
  1. 엮인글들이 아직 없습니다.