데이터를 여러 서버에 분할, 데이터의 분할은 MongoDB가 (분할 된 데이터는 상황에 따라 각 Shard 이동)
MongoDB 이용자 (앱 -> 마스터 서버)은 여러 서버를 의식하지 않아도 된다.
복제가 동일한 데이터의 사본을 여러 DB에있는 반면,
Sharding은 다른 데이터를 여러 DB에 가진다.
따라서 보통의 운용은 Sharding + ReplicaSet ( 복제 ) 구성된다.
샤드(shard) : 실제로 데이터가 저장되어있는 mongod 프로세스 하나의 문서는 하나의 샤드에 저장되어 샤드 간의 데이터 복제는 하지 않는다 복제 구성하는 것을 권장
config 서버 : 샤드 메타 데이터를 관리하는 mongod 프로세스로 단일 장애 지점이 되므로, 여러 config 서버로 구성하는 것을 추천
mongos 서버 : 샤드의 라우팅 프로세스입니다.
샤드와 클라이언트를 연계시킨다.
필요하다면 여러 mongos 서버를 가진다.
mongod 프로세스가 아니기 때문에, 상태와 데이터를 가지고 있지 않는다.
샤드 키 : 데이터를 분산하는 범위의 키로 복수 지정 할 수 있다.
키에 어떤 범위의 데이터가 어떤 샤드에 저장되는지는 MongoDB가 관리하고 데이터의 편차에 따라 자동으로 조정한다.
청크(chunk) : 샤드의 덩어리 분산 데이터의 단위.
구체적으로는 컬렉션의 연속 된 범위의 데이터에서 여러 문서이다.
청크의 최대 크기에 도달하면 분할 된 샤드가 가지고있는 청크 수에 따라 필요한 경우 다른 샤드로 이동된다. 청크의 최대 크기는 변경할 수 있다.
이전 mongofiles, mongoimport,export 를 할 때 명령어를 간단하게 사용해 보았다.
이제는 샤딩으로 넘어가 보자.

로컬C에 data폴더를 생성한 뒤,
mydata02~04 폴더를 생성하고 각 폴더안에 log 라는 폴더를 만든다.
mongod --shardsvr --dbpath c:\data\mydata02 --logpath c:\data\mydata02\log\monod1.log --port 27030 --replSet RS
mongod --shardsvr --dbpath c:\data\mydata03 --logpath c:\data\mydata03\log\monod2.log --port 27031 --replSet RS
mongod --shardsvr --dbpath c:\data\mydata04 --logpath c:\data\mydata04\log\monod3.log --port 27032 --replSet RS
쉘을 각각 1개씩 실행 후 코드 실행
start mongod --shardsvr --dbpath c:\data\mydata02 --logpath c:\data\mydata02\log\monod1.log --port 27030 --replSet RS
start mongod --shardsvr --dbpath c:\data\mydata03 --logpath c:\data\mydata03\log\monod2.log --port 27031 --replSet RS
start mongod --shardsvr --dbpath c:\data\mydata04 --logpath c:\data\mydata04\log\monod3.log --port 27032 --replSet RS
또는 위에 코드 처럼 메모장에 써넣은뒤에
bat파일로 만들어 실행하자.

실행에 문제가 있을 수 있으므로
관리자 권한으로 실행을 권장
mongo localhost:207030
localhost 주소로 실행 (위에서 넣어준 포트
--port 27030)
use admin
admin으로 접속
var config = {_id:'RS',members:
[{_id:0, host:'localhost:27030'},
{_id:1, host:'localhost:27031'},
{_id:2, host:'localhost:27032'}]};
js로 config 메소드 생성 (RS의 멤버로 각각 넣어준다)
rs.initiate(config)
config 실행

{"ok" : 1}
ok : 1 나오면 성공

사용자 명이 OUTHER 혹은 SECONDARY로 나올 것이다.
rs.sutatus()
rs.sutatus()실행 > 사용자 명이 PRIMARY로 변경 >rs.status()한번 더 실행하여 내용확인
mongo localhost:27031
새로운 쉘을 열어 코드 실행

SECONDARY로 나오는 걸 확인할 수 있다.
rs.status()
상태 확인을 한다.

localhost:27030 =
PRIMARY
localhost:27031 =SECONDARY
localhost:27032 =SECONDARY
27030이PRIMARY로 잡혀진걸 볼 수 있다
rs.remove("localhost:27032")
rs.status()
localhost:27032 삭제
rs.add("localhost:27032")
rs.status()
localhost:27032 추가
mongod의 configserver를 설정하기 위해서 C:\data\mongoc1\log 폴더를 생성 하자 (mongoc1 ~ mongoc3)
mongod --configsvr --dbpath c:\data\mongoc1 --logpath c:\data\mongoc1\log\mongoc.log --port 27011 --replSet CRS
mongod --configsvr --dbpath c:\data\mongoc2 --logpath c:\data\mongoc2\log\mongoc.log --port 27012 --replSet CRS
mongod --configsvr --dbpath c:\data\mongoc3 --logpath c:\data\mongoc3\log\mongoc.log --port 27013 --replSet CRS
이전과 같이 쉘을 열어 각각 실행하거나 bat파일로 만들어서 실행하자 (bat파일로 만들경우 mongod 앞에 start 추가)
클라이언트가 configserver로 접속할 수 있도록 라우팅 기능을 부여하는 과정
mongo localhost:27011
use admin
로컬 접속 후 admin사용
var conf={
_id:'CRS',
version:1,
members: [
{_id:0,host:'localhost:27011'},
{_id:1,host:'localhost:27012'},
{_id:2,host:'localhost:27013'}]};
rs.initiate(conf)
마스터 등록
[관리자 쉘]
mongos --configdb CRS/localhost:27011,localhost:27012,localhost:27013 --port 1000
CRS에 로컬들을 넣고 포트 1000으로 지정
[접속자 쉘]
mongo localhost:1000 //접속
sh.status() // 샤딩확인
접속자 쉘을 켜서 configserver로 들어간다 --> 샤딩 확인
sh.addShard('RS/localhost:27030,localhost:27031,localhost:27032');
RS를 등록한다 (sh.status()로 확인)
접속한 서버에서 데이터를 입력해 보자.
sh.enableSharding("blog")
blog를 shardDB로 만든다.
sh.shardCollection("blog.user",{"userId":1})
컬렉션 생성
use blog
for(var i=1001; i < 1000000; i++){
var user = {
userid:i,
name:'userName'+i,
createAt:new Date().getTime()
}
db.user.save(user);
}
데이터를 넣어준다.

show dbs // db확인
db가 잘 들어와있는지 마지막으로 확인해 보자.