본문 바로가기

MongoDB

MongoDB Sharding(샤딩)

@markdown

# MongoDB Sharding(샤딩)

____

- 대용량의 데이터를 저장하기 위해 소프트웨어적으로 데이터베이스를 분산시켜 처리하는 구조

- 방법에는 데이터베이스가 저장하고 있는 테이블을 테이블 단위로 분리하는 방법과 테이블 자체를 분할하는 방법이 있다.

- 분산 데이터베이스의 전통적인 분할 3계층 구조를 지원한다.(응용, 중개, 데이터 계층)

- 메타 데이터를 저장하기 위한 config 서버 때문에 메모리는 1.3배정도 추가되지만, 처리 성능에서 그 효과를 볼 수 있다.


## MongoDB Sharding 구조

____

- 하나의 config 서버와 여러개의 MongoDB 서버로 구성되어 있다.

#### Config 서버

- 중개자 계층, 샤딩을 위한 메타 데이터를 저장한다. (데이터들의 위치 정보를 저장)


#### Mongos 서버

- MongoDB의 중개자 역할, Config 서버의 메타 데이터를 이용해 각 MongoDB에 데이터 접근을 도와준다.(라우터와 같은 역할)


#### Mongod 서버

- MongoDB의 데이터 서버

- 서버 장애에 대비해 MongoDB 서버 안에 여러 개의 리플리카 셋 구조로 구성되어 있다. 


#### Client(응용 계층) →  Mongos(중개 계층) → Config(중개 계층) → Mongod(데이터 계층)

<br/>

## MongoDB Sharding 작업

_____


### 1. config 서버 생성 및 실행

- 리플리카 셋으로 config 서버를 구성한다.

- config 서버 폴더 생성

<pre><code style="font-size:14px">mkdir C:\mongodb\shard\config01

mkdir C:\mongodb\shard\config02

mkdir C:\mongodb\shard\config03

</code></pre>


- config 서버 실행

<pre><code style="font-size:14px">mongod --configsvr --replSet configRepl --dbpath C:\mongodb\shard\config01 -port 20001

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

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

</code></pre>

<br/>

### 2. config 서버 접속 및 리플리카 셋 설정

<pre><code style="font-size:14px">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)

</code></pre>


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

![](https://user-images.githubusercontent.com/12658717/28353942-e167a190-6c98-11e7-9d3e-4402566fa5bf.png)

<br/>

### 3. shard 서버 구성을 위한 리플리카 셋 설정

- shard 서버 폴더 생성

- 각각의 Shard Mongo 서버 역시 리플리카 셋으로 구성한다.

<pre><code style="font-size:14px">mkdir C:\mongodb\shard\shard1\shardRep1\data

mkdir C:\mongodb\shard\shard1\shardRep2\data

mkdir C:\mongodb\shard\shard1\shardRep3\data


mkdir C:\mongodb\shard\shard2\shardRep1\data

mkdir C:\mongodb\shard\shard2\shardRep2\data

mkdir C:\mongodb\shard\shard2\shardRep3\data


mkdir C:\mongodb\shard\shard3\shardRep1\data

mkdir C:\mongodb\shard\shard3\shardRep2\data

mkdir C:\mongodb\shard\shard3\shardRep3\data

</code></pre>

- 서버 실행


<pre><code style="font-size:14px">mongod --shardsvr --replSet shardRep1 --dbpath C:\mongodb\shard\shard1\shardRep1\data -port 30011

mongod --shardsvr --replSet shardRep1 --dbpath C:\mongodb\shard\shard1\shardRep2\data -port 30012

mongod --shardsvr --replSet shardRep1 --dbpath C:\mongodb\shard\shard1\shardRep3\data -port 30013


mongod --shardsvr --replSet shardRep2 --dbpath C:\mongodb\shard\shard2\shardRep1\data -port 30021

mongod --shardsvr --replSet shardRep2 --dbpath C:\mongodb\shard\shard2\shardRep2\data -port 30022

mongod --shardsvr --replSet shardRep2 --dbpath C:\mongodb\shard\shard2\shardRep3\data -port 30023


mongod --shardsvr --replSet shardRep3 --dbpath C:\mongodb\shard\shard3\shardRep1\data -port 30031

mongod --shardsvr --replSet shardRep3 --dbpath C:\mongodb\shard\shard3\shardRep2\data -port 30032

mongod --shardsvr --replSet shardRep3 --dbpath C:\mongodb\shard\shard3\shardRep3\data -port 30033

</code></pre>

- 총 9개의 서버를 실행시켜준다.


### 4. 각각의 리플리카 셋 서버 접속 및 설정

<pre><code style="font-size:14px">mongo localhost:30011

var config = {

_id : "shardRep1", members : [ 

{_id : 0, host : 'localhost:30011'},

{_id : 1, host : 'localhost:30012'},

{_id : 2, host : 'localhost:30013'}  

]

}

rs.initiate(config)


mongo localhost:30021

var config = {

_id : "shardRep2", members : [ 

{_id : 0, host : 'localhost:30021'},

{_id : 1, host : 'localhost:30022'},

{_id : 2, host : 'localhost:30023'}  

]

}

rs.initiate(config)


mongo localhost:30031

var config = {

_id : "shardRep3", members : [ 

{_id : 0, host : 'localhost:30031'},

{_id : 1, host : 'localhost:30032'},

{_id : 2, host : 'localhost:30033'}  

]

}

rs.initiate(config)

</code></pre>


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


### 5. Mongos(shard 서버) 설정

- 위에서 설정한 config 서버를 각 실행해둔다.

<pre><code style="font-size:14px">mongos --configdb configRepl/localhost:20001,localhost:20002,localhost:20003

</code></pre>

<br/>

### 6. Sharding 설정

- 클라이언트가 자동으로 데이터 서버를 접근하도록 하기 위한 샤딩 서버(중개 계층) 설정을 해준다.

- mongo 입력하면 mongos로 접속이 된다.

- mongos에서 각 shard를 설정한다.


#### mongo로 접속하면 자동으로 mongos로 접속되는 것을 확인할 수 있다.

![](https://user-images.githubusercontent.com/12658717/28355066-6ca4c3d8-6c9d-11e7-82dd-731ba9bdf68a.png)


#### 샤드 설정

<pre><code style="font-size:14px">sh.addShard("shardRep1/localhost:30011")

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

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

</code></pre>


#### 샤드 DB 등록

<pre><code style="font-size:14px">sh.enableSharding("test")

</code></pre>

<br/>

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

<pre><code style="font-size:14px">db.things.createIndex({ empno : 1})

</code></pre>


#### 샤드 시킬 콜렉션 설정(admin)

- test의 `things` collection을 sharding하여 저장하도록 설정

<pre><code style="font-size:14px">use admin

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

</code></pre>

![](https://user-images.githubusercontent.com/12658717/28355561-7f016db8-6c9f-11e7-8b05-39ee2f9a98fc.png)

<br/>

### 8. 테스트 데이터 삽입

<pre><code style="font-size:14px">for(var n = 100000; n<=110000; n++){

db.things.insert({empno : n, ename : 'test', sal : 1000})

}

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

</code></pre>

<br/>

### 9. 각 mongo 서버 데이터 확인

####샤드 확인

<pre><code style="font-size:14px">use admin

db.runCommand({ listshards })

mongo localhost:30011

db.things.count()

mongo localhost:30021

db.things.count()

mongo localhost:30031

db.things.count()

</code></pre>

- 각 샤딩 서버에 `3369`, `3277`, `3355`개의 데이터가 각각 저장된 것을 확인할 수 있다.

![](https://user-images.githubusercontent.com/12658717/28355907-f767ae56-6ca0-11e7-8b38-d5adfbd46c46.png)

'MongoDB' 카테고리의 다른 글

MongoDB 복제 시스템, 레플리카 셋  (0) 2017.07.20
MongoDB 설치 및 사용  (0) 2017.07.18