활용가이드와 완벽가이드를 읽고 정리차 끄적인다..
샤딩..
거대한 컬렉션을 클러스터군 서버에 분할해 저장하는 것을 말하고, RDBMS의 파티셔닝과 같은 개념이긴 하지만 몽고는 이를 자동으로 해준다.
몽고에서 샤딩목적은
- 클러스터군을 단일구성인것과 차이가 없게 하고
- 다운타임없이 스케일아웃할수있다.
이를 mongos(라우팅 프로세스)가 이를 관장한다. 보통 mongos 뒤에 mongod(클러스터)로 구성한다.
mongos는 요청을 클러스터군의 적절한 서버로 전달하고, mongod응답을 취합해 클라이언트에 전달한다.
클러스터..
전체데이터중 일부를 책임진다. 분산처리nosql특성처럼 지역성이 중요하다.
데이터를 공평하게 분산하기 위해, 일부데이터(샤드)를 샤드간에 이동한다. 어떻게 데이터를 분할하는지 방식이 중요하다.
- 범위기반 분할방식 : 데이터가 지정된 범위만큼 분할하며, [a,b) 의 범위분할방식이며 a이상 b초과
데이터분산방식..
- 청크가 커지면 자동으로 2개의 작은 청크로 분할한다. 샤드간에 불균형이 발생하면 청크가 이동해 균형을 맞춘다. 청크는 청크범위로 사용할 키를 선택하게 되는데 이를 샤드키라 부른다.
- 컬렉션은 처음 샤딩하면 몽고는 그 컬렉션의 데이터를 보고 청크를 1개만 만든다. 그리고 더 많은 데이터가 입력될수록 기존의 청크를 계속 분할해 새로운 청크를 만들어 데이터를 분산한다.
- 청크의 크기가 64MB 가 기본설정이다. 데이터를 옮기는 비용이 크기때문에 너무 크지도 작지도 않게.. 64MB 기본설정이 이동성과 청크관리비용시 가장 효율적인 양이라고 한다. (책.)
밸런싱
- 충분한수의 청크가 확보되면, 다른 샤드로 데이터를 이동하는 것을 밸런싱이라 말하고, 이를 밸런서가 한다. 즉, 샤드간에 청크를 주고받는 = 데이터분포를 밸런서가 한다. 알아서 하는데 이게 맘에 안들면 컬렉션을 다시 사딩하거나 밸런서 기능을 off하면 된다.
- 밸런서는 데이터의전송량을 최소화하는데 목적을 두고 청크를 관리 하기 때문에, 데이터가 가장 적은 샤드보다 적어도 청크9개가 더 있어야 밸런싱을 한다. 너무 차이가 나느게 아닌가 하겠지만 실제 청크9개의 크기는 1GB도 안된다. ( 당연히. 작은변화에 움직이면 리소스낭비니까.. 무의미한 데이터전송이 되지 않도록.. )
- 어떻게 샤딩되는지 보고 싶으면 --chunksize N 설정을 1로 하고 관찰하면 된다. (음.. 굳이..)
mongos
단일서버같이 보이게 하는 프로세스이다. 사용자의 모든 요청을 적절한 샤드에 전달한다.(요청을 적절한 샤드로 라우팅해줘서 라우팅프로세스라고 말함)
mongos 샤드키 -> 청크조회 -> 올바른 청크가 저장되어 있는 샤드로 문서를 전달한다.
쿼리조건에 샤드키가 있으면 targeted query를 수행한다. 업스면? 모든 샤드에 쿼리를 전달한다.
샤드키정책
샤드키정책을 잘 갖는게 포인트.. 복합샤드키로 사용하도록 가이드 하고 있고, 몇가지 상황에 맞는 시나리오가 책에 있다.
- cardinality가 적은 샤드키는 샤드키로 들어갈수 잇는 값이 제한되어버림.
- 값이 증가하는 샤드키.. 보통 최신데이터는 더 자주 사용되니까 timestamp나 obejectID로 사용하게 되면 청크는 데이터의 중간지점에서 분할을 하니까 이렇게 되면 hot spot 이 생긴다. 그래서 증가하는 값을 갖는 필드로 샤드키를 쓰지 않는게 청크분할시 좋다.
- 무작위샤드키는 예상할수 없으니 노!
- 좋은 샤드키는 데이터에 접근하는 양상을 고려해 설정하고 locality와 hot spot을 고려해 설정한다. 그래서 보통 복합샤드키를 사용한다. 데이터에 요구되는 집약성을 갖는 필드 + 일상적으로 데이터에대해 수행되는 쿼리의 특성을 갖는 필드
클러스터에 데이터 저장소
- 클러스터에 대한 모든 관리는 mongos를 통해서 된다.
- 샤드크기 제한.. 데이터를 샤드간에 골고루 분배하게 되어있다. 각 서버의 저장공간의 차이가 심각할때는 maxsize옵션을 사용하면 되는다, todo 각 샤드에서 작업공간이 얼마나 되는지 자동으로 판단하고 크기를 계획할수 있을거란다. (책)
- 저장공간을 추가 하거나 삭제할때.. 데이터의 이동은 리소스가 많이 드는 작업이다. 그래서 한번에 청크를 하나씩 이동하고, 서버가 바쁘면 이 작업을 나중으로 미룬다. 예를 들어, 밸런서는 1번샤드에 청크를 새로운 샤드로 이동할때.. 1번 샤드의 메모리에는 실서비스데이터의 공간만 보유하고 있는데, 청크를 이동하는 작업이 가능한 공간이 남아 있지 않으면 해당 작업을 나중으로 미룬다. 그래서 작업이 가능한 공간이 남아잇는지 확인한후 해야 안전하다.
샤드키를 제외한 다른키는 유일성을 보장하지 않는다.
그래서 데이터의 복제 vs 데이터 무결성 선택해야 할때..
- 쓰기와 읽기의 비율을 따져보거나
- 참조되는 데이터의 변경이 적으면 / 읽기가 빨라야 한다면 비졍규화를 선택하는것이 현명..
- 데이터의 일관성이 중요하면 정규화
탐색속도를 높이려면 문서를 계층적으로 생성하는 것도 방법이 될수 잇다. (인덱스외)
'데이터베이스' 카테고리의 다른 글
mongo array map 에 엘리먼트 제거하기 (0) | 2018.07.04 |
---|---|
mongo mongo_slave_server_host:port database < file.js > dump_users_`date +%Y%m%d`.log (0) | 2018.07.03 |
mongo run javascript file (0) | 2018.05.24 |
mongoexport / mongoimport 하기 (0) | 2018.05.16 |
mongodb Unique 인덱스 : 색인된 키에 대해 이미 있거나 중복된 것은 insert되지 않는다 (0) | 2018.02.08 |