티스토리 뷰

1. Replica Sets + Sharding 시스템 구성

대용량 처리를 위한 분산 확장이 가능하고 안전성과 높은 가용성 보장을 위해 다음 그림과 같 이 Replica Sets을 구성하고, 이것을 토대로 Sharding 시스템을 구성할 수 있습니다.

4대의 맥미니를 이용하여 Replica Sets + Sharding 시스템을 구성 하는 것을 설명해 드리고자 합니다. 우선 각각의 노드에 다음과 같이 Config 서버와 Replica Set 서버 가 작동하도록 설정해 줍니다. Replica Set1은 모두 10001번 포트를 사용하고, Replica Set2는 모두 10002번 포트를 사용하며, Replica Set3은 모두 10003번 포트를 사용하도록 설정합니다.

node1: 192.168.3.1

$ mkdir /data/config1 /data/replset1 /data/replset3
$ mongod --dbpath /data/config1 --port 20001 &
$ mongod --dbpath /data/replset1 --port 10001 --replSet replset1 --oplogSize 1000 & 
$ mongod --dbpath /data/replset3 --port 10003 --replSet replset3 --oplogSize 1000 &

node2: 192.168.3.2

$ mkdir /data/replset1 /data/replset2
$ mongod --dbpath /data/replset1 --port 10001 --replSet replset1 --oplogSize 1000 & 
$ mongod --dbpath /data/replset2 --port 10002 --replSet replset2 --oplogSize 1000 &

node3: 192.168.3.3

$ mkdir /data/config2 /data/replset1 /data/replset2 /data/replset3
$ mongod --dbpath /data/config2 --port 20001 &
$ mongod --dbpath /data/replset1 --port 10001 --replSet replset1 --oplogSize 1000 & 
$ mongod --dbpath /data/replset2 --port 10002 --replSet replset2 --oplogSize 1000 & 
$ mongod --dbpath /data/replset3 --port 10003 --replSet replset3 --oplogSize 1000 &

node4: 192.168.3.4

$ mkdir /data/config3 /data/replset2 /data/replset3
$ mongod --dbpath /data/config3 --port 20001&
$ mongod --dbpath /data/replset2 --port 10002 --replSet replset2 --oplogSize 1000 & 
$ mongod --dbpath /data/replset3 --port 10003 --replSet replset3 --oplogSize 1000 &

각 노드별 설정이 끝나면, Replica Set을 초기화해야 한다. Replica Set을 구성할 때 Primary 서버와 여러 대의 Replica 서버로 구성된 환경에서 Primary 서버에 장애가 발생하면 MongoDB는 10초 이내에 다음 Primary 서버가 되어야 할 노드 하나를 선택해 줍니다. 이 경우, 아비타 Arbiter 서버가 활성화 되어 있으면 아비타가 적절한 서버를 선택해 주지만 사용자가 각 서버 에 대한 우선순위를 설정해 둔 경우에는 가장 높은 값을 부여받은 서버가 Primary 서버가 됩니다.

node1 - setting replica set1 (arbiter server: node3)

$ mongo 192.168.3.1:10001/admin MongoDB shell version: 2.2.5 connecting to: 192.168.3.1:10001/admin > db.runCommand( {"replSetInitiate" : {"_id" : "replset1", "members" : [ {"_id" : 1, "host" : "192.168.3.1:10001"}, {"_id" : 2, "host" : "192.168.3.2:10001"}, {"_id" : 3, "host" : "192.168.3.3:10001", arbiterOnly:true} ] } } )

node2 - setting replica set2 (arbiter server: node4)

$ mongo 192.168.3.2:10002/admin MongoDB shell version: 2.2.5 connecting to: 192.168.3.2:10002/admin > db.runCommand( {"replSetInitiate" : {"_id" : "replset2", "members" : [ {"_id" : 1, "host" : "192.168.3.2:10002"}, {"_id" : 2, "host" : "192.168.3.3:10002"}, {"_id" : 3, "host" : "192.168.3.4:10002", arbiterOnly:true} ] } } )

node3 - setting replica set3 (arbiter server: node1)

$ mongo 192.168.3.3:10002/admin MongoDB shell version: 2.2.5 connecting to: 192.168.3.3:10002/admin > db.runCommand( {"replSetInitiate" : {"_id" : "replset3", "members" : [ {"_id" : 1, "host" : "192.168.3.3:10003"}, {"_id" : 2, "host" : "192.168.3.4:10003"}, {"_id" : 3, "host" : "192.168.3.1:10003", arbiterOnly:true} ] } } )

이제 Config 서버를 설정하고 Replica Set을 Sharding으로 구성하는 과정이 남았습니다. 우선 node1, node3, node4 에 설정되어 있는 Config 서버들을 mongos로 연결시켜야 합니다. mongos 프로세스 설정을 위해서 node2에 접속 한 후에 다음과 같은 방법으로 mongos 프로세스를 설정할 수 있습니다.

$ mongos --configdb 192.168.3.1:20001,192.168.3.3:20001,192.168.3.4:20001 --port 27017 --chunkSize 64

이제 node2의 mongos 프로세스에 접속해서 ‘addShard'를 통해서 Replica Sets을 Shard 서버로 등록하면 시스템 구축이 모두 마무리 됩니다.

$ mongo 192.168.3.2:27017/admin mongos> mongos> db.runCommand( {addShard : "replset1/192.168.3.1:10001,192.168.3.2:10001, 192.168.3.3:10001"} ) // add replset1 as shard server mongos> db.runCommand( {addShard : "replset2/192.168.3.2:10002,192.168.3.3:10002, 192.168.3.4:10002"} ) // add replset2 as shard server mongos> db.runCommand( {addShard : "replset3/192.168.3.3:10003,192.168.3.4:10003, 192.168.3.1:10003"} ) // add replset3 as shard server mongos> mongos> use config // Config 설정에서 샤딩과 관련된 사항을 확인할 수 있다 mongos> db.shards.find() // Shard 서버 목록 확인 mongos> sh.status() // Shard 서버의 상태 확인


댓글
  • 프로필사진 beginner 안녕하세요.
    포스팅 읽고 질문이 생겨서 그렇습니다. 이전 sharding에서는 읽어보면,
    데이터를 저장할 때 metadata만 config서버에 저장을 하고 직접적인 데이터는 sarding하는 것으로 이해되었습니다.
    1. 그럼 각 config서버는 각 sharding할 서버와 같은 노드(컴퓨터)에 저장하는 것이 맞는거지요?
    2. mongs에는 config서버를 왜 두지 않는지 궁금합니다. mongos는 단지 각 데이터들을 분산해서 저장해라라고 명령해주는 것이 아닌가 싶어서요.
    3. replicaset은 복제품 같은데 서버당 저렇게 세개씩 주어야 하나요?
    4. 서버당 복제품을 세개씩 주는 듯 보이지만, 실제 그림을 보면 node3에만 세개의 복제가 있고 나머지는 2개씩 랜덤하게 설계되어 있는 것처럼 보입니다. 왜 그런지 이해가 잘 안됩니다. (처음에는 node3에 복제가 1,2,3이 완벽하게 구성되어 있고 나머지는 하나씩 빠져 있어서 mongos가 있는 노드2에서는 config서버를 두면 안되어서 mongos만 두면 공간낭비여서 sharding서버를 그쪽에 두고 다른 노드에 confing서버를 두어서 적절하게 분배하는 것이 아닐까 생각했습니다. 그럼 짝이 모두 3개씩 맞거든요. 그럼 저렇게 배분하는 것은 임의적으로 해도 상관이 없는건가요? 아니면 그런 이유가 있나요? 저라면 mongs는 건드리지 않고 나머지 node들에게 각config와 replicaset1,2,3를 동일하게 두어서 보기 좋게 할 것 같아서요. -그럼 관리도 편해지지 않나했습니다.)
    혼자서 공부하는 중인 초보자입니다. 읽어주시면 고맙겠습니다.
    2016.12.14 05:05 신고
  • 프로필사진 경성현 안녕하세요. 몽고디비는 제가 수리과학연구소에 재직할 당시에 본격적으로 공부하면서 테스트도 하고 그랬는데... 지금은 손을 놓은지 오래되서 정확하게 답변 드리기는 어렵습니다만, 알고 있는 정보로 답변 드리면 다음과 같습니다..

    1. 제가 구성했던 것은 노드4개로 sharing을 구성해 보는 것이었기 때문에 config서버에도 데이터가 저장되는 형태었습니다. 하지만, config server를 따로 두는 것도 가능합니다.

    2. 말씀드린 것처럼 config를 독립적으로 구성하셔도 됩니다.

    3. 꼭 세개씩 줄 필요는 없고요, 2개씩 해도 되고, 4개를 해도 됩니다.

    4. 말씀하신 것처럼 해도 모두 가능하리라 생각합니다. 이것은 명령어를 테스트 하고, 작동이 되는 시스템을 만들어 보는데 의의가 있는 작업이었습니다. 실무적으로 mongodb를 이용하여 sharding-replicaset을 구성하시려면 전문가 분께 문의해 보시는게 어떨까 합니다.

    보다 정확하게 확실한 정보를 원하신다면 네이버에 <MongoDB 공식 사용자 그룹>카페가 있습니다. 이곳에서 질문하시면, 훨씬 정확한 정보를 얻으실 수 있을 것이라 생각됩니다.
    2016.12.16 09:54 신고
  • 프로필사진 beginner 답변 고맙습니다. 꾸벅. 많은 도움이 되었습니다. 2016.12.22 07:20 신고
댓글쓰기 폼