@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 |