Loading...

DB/MongoDB / / 2022. 5. 6. 15:20

몽고DB 13강. 샤딩 시스템 구성

반응형

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

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형