Sharding

1. 목적

  1. 파티셔닝 분산처리
  2. 성능향상을 위한 Load balancing
  3. 효율적인 데이터 관리와 복구전략 수립

2. Architecture

  • enter image description here

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()를 확인해 본다