Sharding
1. 목적
- 파티셔닝 분산처리
- 성능향상을 위한 Load balancing
- 효율적인 데이터 관리와 복구전략 수립
2. Architecture
3. 구성 요소
Shard Server
- 실제 데이터가 저장되는 서버
- 최소 2개 이상 구동되어야 하고 지속적인 분할 처리를 위해 3개 이상이 필요
같은 Node에 서버에 어려개의 Shard Server를 구동할 경우 포트가 달라야함
mongod --shardsvr --dbpath /usr/local/mongodb/shard_practices/shard1 --port 40001 mongod --shardsvr --dbpath /usr/local/mongodb/shard_practices/shard2 --port 40002 mongod --shardsvr --dbpath /usr/local/mongodb/shard_practices/shard3 --port 40003 dbpath는 미리 생성 하여 둔다
Config Server
- Shard server에 대한 메타 정보를 가지고 있음
- 각 Shard server의 포트, 아이피, 데이터 상태 정보를 포함 관리
최소 1개가 구동되어야 하고 안전한 분할처리를 위해 3개가 적당함
mongod --configsvr --dbpath /usr/local/mongodb/shard_practices/config1 --port 50001
Route Server
- Shard server 의 상태 정보를 Config Server로 부터 수집
실제 저장될 데이터를 Shard server에 Collection 단위로 분산저장 ( 실제 Collection에 10만건을 데이터를 넣으면 각 Shard server로 분산저장됨)
mongos --configdb localhost:50001 --port 50000 --chunkSize 1
Route Server Setting
Route Server에 Shard server 등록
mongo localhost:50000/admin db.runCommand( { addshard : "localhost:40001" } ) db.runCommand( { addshard : "localhost:40002" } ) db.runCommand( { addshard : "localhost:40003" } )
Route Server에 Sharding 할 데이터 베이스 지정
db.runCommand( { enablesharding : "test" } )
things Collection에 Index를 생성
use test db.things.createIndex( { empno : "hashed" } )
admin db에서 shardcollection 지정과 Shard key 설정
use admin db.runCommand( {shardcollection : "test.things", key : { empno : 1} } )
- test db에 things 컬렉션을 sharding 하고 empno를 기준으로 sharding*
4. Shard Server 변경
Shard server 추가
db.runCommand ( { addshard : "hostname:port" } )
Shard server 삭제
db.runCommand ( { removeshard: "shardname" } )
Shard server 이동
db.runCommand ( { movePrimary : "대상shard", to : "이동될 shard" } )
5. 테스트
mongo localhost:50000/test
for (var n = 100000; n <= 300000; n++) db.things.save({ empno: n , ename: "test", sa1: 1000 })
각 Shard server의 db.things.counter()를 확인해 본다