MongoDB 버전을 2.4에서 2.6으로 업그레이드 하려는데,

2.6 버전부터 write concern의 unacknowledged (w=0) 옵션이 fire and forget이 아니라 socket/network 에러 정보까지는 체크하는 형태로 변했기 때문에,

사용하던 시스템이 heavy update를 unacknowledged로 겨우겨우 쓰고 있는지라 과연 업그레이드를 해도 되는지 불안해서 벤치마크를 해봤다.


벤치마크 환경은 아래와 같다.

shard는 3개로 각 shard는 PRIMARY-SECONDARY-ARBITER 구성의 ReplicaSet (비록 가상서버지만..;)

write는 update만 (upsert 없음) 2개 필드에 $inc 하는 형태. 증가값은 랜덤.

document의 수는 10만개.

chunk는 각 shard별로 수동 균등분배.

update를 수행한 언어는 PHP, 드라이버 버전은 1.6.12-dev


MongoDB의 버전은 2.4, 2.6 이렇게 2개를 테스트 했고,

벤치마킹한 버전별 옵션은 아래와 같음.

2.4 (w = 1)

2.4 (w = 0)

2.6 (w = 1)

2.6 (w = 0)

2.6 (bulk = ordered, w = 1)

2.6 (bulk = ordered, w = 0)

2.6 (bulk = unordered, w = 1)

2.6 (bulk = unordered, w = 0)

2.6 (bulk = unordered, j = true)

(2.4 버전의 j=true와 2.6버전 j=true, bulk=ordered 일 때의 j=true는 너무 느려서 하다가 중단하고 그냥 빼버렸음)



결과는 아래와 같음.

역시 2.4 버전의 w=0 이 가장 TPS가 좋았고 그 다음이 2.6 버전의 unordered bulk write 이다.

2.6 버전으로 넘어가면서 w=0, 1 은 큰 의미가 없어진 것 같다.

다만, unordered bulk write가 아니라면 저널 옵션은 큰 영향을 미침. (벤치마킹을 포기할 정도로)





결론적으로,

비동기 방식의 unordered bulk write의 성능이 기대 이상이었다.

실제 테스트를 해봐야 알겠지만 TPS만 높게 나오고 write 성공여부는 불투명한 2.4 버전의 w=0 을 대체할 수 있을 정도의 성능이 아닌가 한다.

TPS는 조금 빠지지만 저널 옵션을 적용하는 것까지도 고려해볼 수 있는 수준이라고 보여진다.










Posted by bloodguy
,