1. shard 폴더 생성
mkdir c:\mongolab\shard1\r1
mkdir c:\mongolab\shard1\r2
mkdir c:\mongolab\shard1\r3
mkdir c:\mongolab\shard2\r1
mkdir c:\mongolab\shard2\r2
mkdir c:\mongolab\shard2\r3
mkdir c:\mongolab\shard3\r1
mkdir c:\mongolab\shard3\r2
mkdir c:\mongolab\shard3\r3
폴더가 잘 생성되었는지 확인해보자.
cd c:\mongolab
dir
2. config 서버 저장 폴더 생성 (shard에 대한 메타 데이터를 가지고 있는 서버)
mkdir c:\mongolab\config\r1
mkdir c:\mongolab\config\r2
mkdir c:\mongolab\config\r3
3. 샤드 서버
(1) 실행
3개의 샤드 서버를 띄울때는 옵션만 걸어주면 된다.
--shardsvr
레플리카셋 설정과 비슷하다.
샤드 서버에 레플리카셋을 설정해주지 않고 실습하려고 했지만 버전이 업데이트되면서
레플리카셋 없이는 실행조차 되지 않는다.
설정해주자.
레플리카셋으로 묶어주고 샤드 서버라고 설정해주고 포트번호도 다 다르다.
하나씩 실행해주지 않아도 백그라운드로 실행하기 위해 start를 붙여주었다.
몽고 서버 실행 시 설정 파일에서 모든 IP 허용을 설정해주지 않았다면 옵션으로 모든 IP를 허용 설정할 수 있다.
옵션은 --bind_ip_all 이다.
사실 --bind_ip_all 하지 않고 mongos 서버의 ip만 연결해주면 된다.
외부에 열어줄 필요 없다.
mongos 서버만 bind_ip_all 해주면 된다.
클라이언트는 mongos에만 붙을 거니까!
start mongod --replSet shard1Set --shardsvr --dbpath "C:\mongolab\shard1\r1" --port 30001 --bind_ip_all
start mongod --replSet shard1Set --shardsvr --dbpath "C:\mongolab\shard1\r2" --port 30002 --bind_ip_all
start mongod --replSet shard1Set --shardsvr --dbpath "C:\mongolab\shard1\r3" --port 30003 --bind_ip_all
start mongod --replSet shard2Set --shardsvr --dbpath "C:\mongolab\shard2\r1" --port 40001 --bind_ip_all
start mongod --replSet shard2Set --shardsvr --dbpath "C:\mongolab\shard2\r2" --port 40002 --bind_ip_all
start mongod --replSet shard2Set --shardsvr --dbpath "C:\mongolab\shard2\r3" --port 40003 --bind_ip_all
start mongod --replSet shard3Set --shardsvr --dbpath "C:\mongolab\shard3\r1" --port 50001 --bind_ip_all
start mongod --replSet shard3Set --shardsvr --dbpath "C:\mongolab\shard3\r2" --port 50002 --bind_ip_all
start mongod --replSet shard3Set --shardsvr --dbpath "C:\mongolab\shard3\r3" --port 50003 --bind_ip_all
(2) 레플리카 셋 설정
IPv4 주소로 해야 함. localhost 안 먹음!!
ok가 잘 뜨는지 확인해주자.
mongo --port 30001
let con = {_id:"shard1Set", members:[{_id:1, host:"192.168.50.245:30001"}, {_id:2, host:"192.168.50.245:30002"}, {_id:3, host:"192.168.50.245:30003"}]};
rs.initiate(con);
mongo --port 40001
let con = {_id:"shard2Set", members:[{_id:1, host:"192.168.50.245:40001"}, {_id:2, host:"192.168.50.245:40002"}, {_id:3, host:"192.168.50.245:40003"}]};
rs.initiate(con);
mongo --port 50001
let con = {_id:"shard3Set", members:[{_id:1, host:"192.168.50.245:50001"}, {_id:2, host:"192.168.50.245:50002"}, {_id:3, host:"192.168.50.245:50003"}]};
rs.initiate(con);
(3) 포트 확인
서버가 잘 실행되었는지 확인해보자.
netstat -ano | findstr 3000*
netstat -ano | findstr 4000*
netstat -ano | findstr 5000*
4. config 서버
(1) 서버 실행
start mongod --configsvr --replSet configSet --dbpath "C:\mongolab\config\r1" --port 60001 --bind_ip_all
start mongod --configsvr --replSet configSet --dbpath "C:\mongolab\config\r2" --port 60002 --bind_ip_all
start mongod --configsvr --replSet configSet --dbpath "C:\mongolab\config\r3" --port 60003 --bind_ip_all
(2) 레플리카 셋 설정
config 서버는 레플리카셋 구성을 설정해주어야 한다.
지금은 레플리카셋이 3개라서 members에 3개를 추가해주었다.
mongo --port 60001
let con = {_id:"configSet", members:[{_id:1, host:"192.168.50.245:60001"}, {_id:2, host:"192.168.50.245:60002"}, {_id:3, host:"192.168.50.245:60003"}]};
rs.initiate(con);
6. mongos 서버 실행
mongos를 실행시킬 건데 이건 라우터이다.
라우터는 config의 정보를 알고 있어야 한다.
그리고 이 config를 통해 샤드 정보를 아는 것이다.
mongos는 샤드를 바로 알 필요 없다.
config 서버를 통해서만 샤드로 간다.
나는 이 config 서버를 참조를 하겠다! 설정해주자.
근데 왜 config 서버 2개가 걸려있냐?
하나만 걸려있으면 config 서버가 죽었을 때 문제가 생길 수 있기 때문이다!
mongos --configdb configSet/192.168.50.245:60001,192.168.50.245:60002,192.168.50.245:60003 --port 20000 --bind_ip_all
7. mongos 서버 접속
이제 mongos로 접속하자.
mongo --port 20000
8. admin으로 접속
이제 샤드 연결!
admin으로 접속하여 연결해야 한다.
디폴트가 test db에 연결되어있다.
use admin
9. 샤드 서버 추가해주기
시간이 좀 걸리기 때문에 한 줄씩 실행해주자.
ok가 뜨는지만 확인 해주자.
sh.addShard("shard1Set/192.168.50.245:30001,192.168.50.245:30002,192.168.50.245:30003");
sh.addShard("shard2Set/192.168.50.245:40001,192.168.50.245:40002,192.168.50.245:40003");
sh.addShard("shard3Set/192.168.50.245:50001,192.168.50.245:50002,192.168.50.245:50003");
10. 샤드 키 설정
샤드 키에 대해서는 다음 강에서 더 자세히 다뤄보자.
여러 개의 Shard 서버로 분할되어 있기 때문에 특정 필드의 값으로 샤딩해야한다.
_id로 되었다면 그 값을 통해 샤딩한다.
한마디로 _id값으로 구분하여 데이터를 분할 저장한다.
이렇게 저장해야지 나중에 _id값으로 어디에 샤딩되었는지 알 수 있다.
아래의 "greendb" 값은 DB 이름이다.
greendb는 만들어져 있는 데이터베이스가 아니다.
show dbs; 해봐도 나오지 않을 것이다.
데이터를 실제로 insert 할 때 생성된다.
sh.enableSharding("greendb");
sh.shardCollection("greendb.account", {_id: "hashed"});
샤드 키 설정 시에 _id로 인덱스를 사용하지 않고
예를 들어 name 값으로 설정하려면 꼭 name에 인덱스를 생성해야 한다.
"name":1은 true라는 것인데 name 자체에 인덱스를 걸겠다는 말이다.
우리는 해시를 사용할 것이기 때문에 아래 설정은 안 해줄 것이다.
db.account.createIndex({"name":1});
db.shardCollection("greendb.account", {"name":1}};
11. 샤딩 상태 확인
sh.status()
12. 더미 데이터로 샤딩이 제대로 되었는지 확인
(1) 더미 데이터 추가
mongos에서 추가해주면 된다.
시간이 좀 걸린다. 생각보다!! (대략 10분 정도)
* 10만 개에 1분 정도 걸렸으니 100만 개면 10분 정도 걸림.
use greendb;
for (let i=0; i<1000; i++){db.account.save({name:"name"+i})}
(2) 30001 포트로 접속해서 카운팅 해보기
mongo --port 30001
use greendb;
db.account.find().count();
진짜 잘 들어갔는지 확인하려면 40001번 서버에 가서도 확인해보고,
레플리카셋에도 잘 저장되었는지 30002번 서버에 가서도 확인해보자.
세컨더리 서버에서 데이터를 확인할 때는 read 옵션을 걸어줘야 한다.
rs.secondaryOk();
db.account.find().count();
(3) 샤딩 상태 확인
db.account.getShardDistribution()
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9