MONGODB

[Mac]몽고디비 샤딩과 리플리카셋 구성하는 방법

[Docker]몽고디비 샤딩과 리플리카셋 구성하는 방법

database
샤딩과 리플리카셋 이해하기이러한 샤딩의 문제점을 해결하는 방법이 바로 리플리카 세트이다. 리플리카(=RAID)셋이란 각각의 서버를 복제하여 사용하는 것으로 최소 3개씩 복제한다. 만약 메인 서버인 프라이머리 서버에서 문제가 생기면 복제해둔 세컨더리 서버에서 데이터를 가져 올 수 있다....

1. 폴더 생성

시작하기전에 기존에 폴더가 있으면 안에 내용 다 삭제하고 시작finder

2. Config-Server 설정

1. Config-Server 실행

Terminal 창 3개 열어서 CS 서버 3개 실행
mongod --configsvr --replSet configSet --dbpath "/Users/dahyechoi/mongolab/config1" --port 50001 --bind_ip_all
mongod --configsvr --replSet configSet --dbpath "/Users/dahyechoi/mongolab/config2" --port 50002 --bind_ip_all
mongod --configsvr --replSet configSet --dbpath "/Users/dahyechoi/mongolab/config3" --port 50003 --bind_ip_all
terminal
50000번대 포트 확인
sudo lsof -i tcp:50001
sudo lsof -i tcp:50002
sudo lsof -i tcp:50003
terminal

2. 리플리카셋 설정

Config-Server 50001번 포트에 접속
mongo --port 50001
terminal
변수 생성
let con = {_id:"configSet", members:[{_id:1, host:"127.0.0.1:50001"}, {_id:2, host:"127.0.0.1:50002"}, {_id:3, host:"127.0.0.1:50003"}]};
리플리카셋 초기화
rs.initiate(con);
ok : 1 확인
terminal
리플리카 셋 구성 확인
rs.status();
terminal

3. Shard-Server 설정

1. Shard-Serve 실행

Terminal 창 3개 열어서 Shard 서버 3개 실행
mongod --shardsvr --dbpath "/Users/dahyechoi/mongolab/shard1" --port 30001 --bind_ip_all --replSet shardSet1
mongod --shardsvr --dbpath "/Users/dahyechoi/mongolab/shard2" --port 30002 --bind_ip_all --replSet shardSet2
mongod --shardsvr --dbpath "/Users/dahyechoi/mongolab/shard3" --port 30003 --bind_ip_all --replSet shardSet3
리플리카 구성을 하지 않아도 리플리카 세트 박스는 만들어줘야 한다.
terminal
ssl(=rsa)설정하는 것이 좋지만 몽고에서 다루는 데이터는 그렇게 중요한 데이터가 아니기 때문에 설정하지 않아도 된다.
30000번대 포트 확인
sudo lsof -i tcp:30001
sudo lsof -i tcp:30002
sudo lsof -i tcp:30003
terminal

2. 30001 포트 리플리카셋 설정

각각 새로운 Terminal 창을 열어서 실행
30001번대 포트에 접속
mongo --port 30001
변수 생성
let con = {_id:"shardSet1", members:[{_id:1, host:"127.0.0.1:30001"}]};
리플리카셋 초기화
rs.initiate(con);
ok : 1 확인
terminal

3. 30002 포트 리플리카셋 설정

각각 새로운 Terminal 창을 열어서 실행
30001번대 포트에 접속
mongo --port 30002
변수 생성
let con = {_id:"shardSet2", members:[{_id:1, host:"127.0.0.1:30002"}]};
리플리카셋 초기화
rs.initiate(con);
ok : 1 확인
terminal

 

4. 30003 포트 리플리카셋 설정

각각 새로운 Terminal 창을 열어서 실행
30001번대 포트에 접속
mongo --port 30003
변수 생성
let con = {_id:"shardSet3", members:[{_id:1, host:"127.0.0.1:30003"}]};
리플리카셋 초기화
rs.initiate(con);
ok : 1 확인
terminal
여기까지 config-server1~3과 OPlog1~3, shard1~3을 만들었다.

4. Mongos-Server 설정

1. Mongos 서버 실행(라우팅 서버)

새로운 TERMINAL 창을 열어서 Mongos 서버 실행
mongos --configdb configSet/127.0.0.1:50001,127.0.0.1:50002,127.0.0.1:50003 --port 20000 --bind_ip_all
terminal
이 서버는 CS에서 메타정보를 가져와서 샤드 서버에 save하거나 find 할 때 참고하는 서버다.

2. Mongos 서버 접속

TERMINAL 창 1개 열어서 mongos 서버 접속
mongo --port 20000
terminal

3. Mongos 서버에서 Shard 추가

admin DB에 접속한다.
use admin;
Shard 추가
sh.addShard("shardSet1/127.0.0.1:30001");
sh.addShard("shardSet2/127.0.0.1:30002");
sh.addShard("shardSet3/127.0.0.1:30003");
terminal
여기서 깜빡임이 있으면 서버가 제대로 안만들어진거니 서버를 다시 만들자. 그리고 ‘shardSet1’ 적지않으면 오류가 난다.

4. emp DB에서 인덱스 생성

  • _id 는 인덱스 생성안해도 자동으로 잡히는데 개념을 익히기 위해 직접 잡아줌.
  • 왜냐하면 인덱스가 없으면 샤드키로 설정할 수 없음(중요)
emp 데이터베이스를 생성/사용
use emp;
programmer 컬렉션에 id를 index로 생성
db.collection.createIndex({_id:1});
ok : 1 확인
terminal
MongoDB
인덱스 개념 완벽하게 이해하기인덱스 설정은 DBMS가 데이터에 접근할 때 랜덤 엑세스하기 위해 데이터를 순차적으로 넣는 것을 말한다. 데이터베이스에서 정렬(order by)를 자주하게 되는 필드에 인덱스 설정을 하게 되면 데이터가 순차적으로 들어가기 때문에 풀스캔(Full Scan)하지 않고 이진 검색(Binary Search)으로 데이터를 효율적으로 찾을 수 있게된다....

5. Shard 설정

emp DB에 Sard 설정
sh.enableSharding("emp");
ok : 1 확인
terminal
데이터베이스의 programmer 컬렉션에 Shard 설정
sh.shardCollection("emp.programmer", { _id : "hashed" });
terminal

6. Shard 상태 확인

방법1.
sh.status()
terminal
방법2.
use emp
db.programmer.getShardDistribution();

 

terminal
방법2는 샤드 상태를 더 자세히 볼 수 있다.

7. 데이터 추가하기

emp DB에 접속
use emp
10000건의 데이터 추가
for (let i=0; i<10000; i++){db.programmer.save({name:"name"+i})}

데이터를 넣는데 시간이 걸린다.

데이터가 대략 3000개씩 잘 분배되었는지 확인
db.programmer.getShardDistribution();
terminal
docs(도큐먼트)에 골고루 들어간다. 샤드를 해쉬로 넣으면 균등하게 데이터 배분된다.
MongoDB
[Windows]몽고디비 샤딩과 리플리카셋 구성하는 방법1. 폴더 생성 2. Config-Server 설정하기 3. Shard-Server 설정 4. Mongos-Server 설정...

 

최신글