MongoDB로 sharding을 운영할 땐 치명적인 낙장불입이 몇가지 있다.



1. collection 이름을 변경할 수 없다.

MongoDB에는 renameCollection 이라는 collection의 이름을 변경하는 명령어가 있지만,

shard된 collection은 이름을 변경할 수 없다.

그냥 쓰는데는 딱히 문제가 되지 않지만, 뒤에 나오는 shard key를 변경해야 하는 경우,

collection을 export 한 다음 import 하는 방법을 쓰면 그나마 좀 나은데 collection 명을 변경할 수 없으므로,

저 방법을 사용한다면 관련된 소스코드에서 해당 collection 이름을 사용한 부분을 전부 새로운 collection 이름으로 변경해줘야 한다.

collection 을 반환하는 함수를 만들어 쓸 필요가 있겠다고 절실히 느꼈던 부분이다.



2. shard key를 변경할 수 없다.

완전 낙장불입이다.

한 번 지정해서 sharding 했다면 shard key는 변경불가다.

그냥 대충 감잡아서 shard key를 지정했거나, 추후 데이터 패턴이 변경되어 hot spot이 생기거나 해도 shard key를 변경할 수가 없다.

1번에서 설명한 import/export 방법을 사용하는 수 밖에는 없는데 collection 이름을 변경할 수가 없으므로 결국 소스코드를 다 뜯어고쳐야 하는 상황에 직면한다.

위에 적어놓은 대로 collection 을 반환하는 함수같은 걸 만들어서 피해를 최소화하는 방법은 있다.




3. chunk는 삭제하거나 병합할 수 없다.

진정한 낙장불입의 끝판대장이다.

좀 잘해볼라고 수동으로 chunk를 나누고 옮기고 하다가 실수로 100 바이트 짜리 chunk를 만들었고 해당 chunk는 더 이상 데이터가 증가하여 split 될 가능성이 없다면 그대로 평생 가는거다.

MongoDB 2.5.5 문서에 보면 mergeChunks 명령어가 있는데 여하튼 실제 서비스에 도입하려면 2.6 버전에서나 사용가능한 상황인 것이다.

게다가 잘 읽어보면 mergeChunks 명령어는 document가 삭제 되다가 document수가 0 이 되는 비어버린 chunk를 병합하는 용도지 수동으로 chunk를 관리하면서 작은 chunk를 큰 chunk에 병합하는 용도가 아니다.






결국 MongoDB는 shard key가 포인트다.







Posted by bloodguy
,