본문 바로가기
DataBase/MongoDB

[MongoDB] Sharding(샤딩)

by 개발자 한량 2021. 12. 3.
728x90
반응형
SMALL

빅데이터 저장을 어떻게 할 것인가?

샤딩(sharding)

  • 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법

샤딩의 목적

  • 데이터 분산- 데이터를 분산하여 순차적으로 저장한다면 한 대 이상에서 트래픽을 감당하기 때문에 부하를 분산하는 효과 있음
  • 백업과 복구 전략- 미리 데이터를 분산하여 저정해둔다면 리스크로부터 보호받고 효과적인 시스템 운영이 가능해짐
  • 빠른 성능- 여러 대의 독립된 프로세스가 병렬로 작업을 동시에 수행하기 때문에 이상적으로 빠른 처리 성능 보장

 

Sharding 시스템 구조

 

config server (최소 3대 이상 권장)

  • config 서버는 샤드 시스템에 대한 메타 데이터 저장/관리 역할
  • 샤드 서버의 인덱스 정보를 빠르게 검색 가능하게 함

Mongos

  • 빅데이터를 샤드 서버로 분산해주는 프로세스

shard

  • 분산된 데이터 저장 공간

샤딩을 하기 위한 폴더 구조

1. D 드라이브에 shard 폴더 생성

 

 

2. config01, 02, 03 + shard1, 2, 3, 4 폴더 생성

3. 각각의 shard1, 2, 3, 4 안에 shardRep1, 2, 3폴더 생성

4. 각각의 shardRep1, 2, 3안에 data 폴더 생성

 


1. config 서버 실행 (각각 cmd로 실행)

mongod --configsvr --replSet configRepl --dbpath D:\shard\config01 -port 20001

mongod --configsvr --replSet configRepl --dbpath D:\shard\config02 -port 20002

mongod --configsvr --replSet configRepl --dbpath D:\shard\config03 -port 20003

 

2. config 서버 접속 및 리플리카 셋 설정(replSet : 복제본 생성)

mongo localhost:20001 
# config01 server 접속

var config = {
  _id : "configRepl", members : [
    {_id : 0, host : 'localhost:20001'},
    {_id : 1, host : 'localhost:20002'},
    {_id : 2, host : 'localhost:20003'}
  ]
}
rs.initiate(config)

exit

# 설정 후 접속한 서버가 primary 서버로 바뀐 것을 확인 할 수 있다.

 

  • exit 입력mongo localhost:20001로 접속하면 configRepl:PRIMARY> 로 나타남
  • exit 입력 mongo localhost:20002로 접속하면 configRepl:SECONDARY> 로 나타남
  • exit 입력  mongo localhost:20003로 접속하면 configRepl:SECONDARY> 로 나타남

※ 복제본을 생성시 한개의 Primary서버와 나머지는 secondary서버로 설정됨.

    Primary서버가 무조건 먼저 실행 서버다운이나 고장 시 secondary서버 실행됨

 

3. shard 서버 구성을 위한 리플리카 셋 설정 : 서버 실행 (총 12개의 서버(cmd)를 실행)

   (각각의 Shard Mongo 서버 역시 리플리카 셋으로 구성)

mongod --shardsvr --replSet shardRep1 --dbpath D:\shard\shard1\shardRep1\data -port 30011
mongod --shardsvr --replSet shardRep1 --dbpath D:\shard\shard1\shardRep2\data -port 30012
mongod --shardsvr --replSet shardRep1 --dbpath D:\shard\shard1\shardRep3\data -port 30013

mongod --shardsvr --replSet shardRep2 --dbpath D:\shard\shard2\shardRep1\data -port 30021
mongod --shardsvr --replSet shardRep2 --dbpath D:\shard\shard2\shardRep2\data -port 30022
mongod --shardsvr --replSet shardRep2 --dbpath D:\shard\shard2\shardRep3\data -port 30023

mongod --shardsvr --replSet shardRep3 --dbpath D:\shard\shard3\shardRep1\data -port 30031
mongod --shardsvr --replSet shardRep3 --dbpath D:\shard\shard3\shardRep2\data -port 30032
mongod --shardsvr --replSet shardRep3 --dbpath D:\shard\shard3\shardRep3\data -port 30033

mongod --shardsvr --replSet shardRep4 --dbpath D:\shard\shard4\shardRep1\data -port 30041
mongod --shardsvr --replSet shardRep4 --dbpath D:\shard\shard4\shardRep2\data -port 30042
mongod --shardsvr --replSet shardRep4 --dbpath D:\shard\shard4\shardRep3\data -port 30043

 

4. 각각의 리플리카 셋 서버 접속 및 설정 (rs.status() 명령어로 설정된 리플리카 셋 설정 정보를 확인)

mongo localhost:30011

var shard1 = {
  _id : "shardRep1", members : [
    {_id : 0, host : 'localhost:30011'},
    {_id : 1, host : 'localhost:30012'},
    {_id : 2, host : 'localhost:30013'}
  ]
}
rs.initiate(shard1)

mongo localhost:30021

var shard2 = {
  _id : "shardRep2", members : [
    {_id : 0, host : 'localhost:30021'},
    {_id : 1, host : 'localhost:30022'},
    {_id : 2, host : 'localhost:30023'}
  ]
}
rs.initiate(shard2)

mongo localhost:30031

var shard3 = {
  _id : "shardRep3", members : [
    {_id : 0, host : 'localhost:30031'},
    {_id : 1, host : 'localhost:30032'},
    {_id : 2, host : 'localhost:30033'}
  ]
}
rs.initiate(shard3)

mongo localhost:30041

var shard4 = {
  _id : "shardRep4", members : [
    {_id : 0, host : 'localhost:30041'},
    {_id : 1, host : 'localhost:30042'},
    {_id : 2, host : 'localhost:30043'}
  ]
}
rs.initiate(shard4)

 

▶ rs.status() 명령어로 설정된 리플리카 셋 설정 정보를 확인 할 수 있음

 

 

5.  Mongos(shard 서버) 설정(위에서 설정한 config 서버를 각 실행해둔다)

mongos --configdb configRepl/localhost:20001,localhost:20002,localhost:20003

 

6. Sharding 설정 (새로운 cmd 창에 mongo 입력하면 mongos로 접속이 됨)

mongo

 

7. 샤드 설정(데이터 분산 저장할 컴퓨터 설정과 같음)

sh.addShard("shardRep1/localhost:30011")

sh.addShard("shardRep2/localhost:30021")

sh.addShard("shardRep3/localhost:30031")

sh.addShard("shardRep4/localhost:30041")

 

8. 샤드 db 등록

sh.enableSharding("test")

 

9. 샤딩시킬 collection의 인덱싱 설정

use test

db.things.createIndex({empno:1})

 

10. 샤드 콜렉션 셜정(admin)

use admin

sh.shardCollection("test.things",{empno:"hashed"})

 

11. 테스트 데이터 삽입

use test

# 10만개로 돌리기엔 오래걸려서 10000개로 설정함
for(var n = 100000; n<110000; n++){
    db.things.insert({empno : n, ename : 'test', sal : 1000})
}

db.things.count() # 데이터 갯수 확인

 

12. 데이터가 잘 분산되었는지 확인하기

mongo localhost:30011

use test
db.things.count()
>exit

mongo localhost:30021

use test
db.things.count()
>exit

mongo localhost:30031

use test
db.things.count()
>exit

mongo localhost:30041

use test
db.things.count()
>exit

 

728x90
반응형
LIST

댓글