@markdown
# MongoDB 복제 시스템, 레플리카 셋
<br/>
## MongoDB 복제 시스템
____
- Master - Slave 방식으로 구성
- Master 데이터의 복사본을 Slave에 배치
- Master 장애에 따른 데이터 손실없이 Slave의 데이터 사용가능
## MongoDB 복제 구조
____

[사진 출처 : [http://mongodb.citsoft.net](http://mongodb.citsoft.net)]
- `Slave`는 5초에 한번씩 `Master`에 접근하며, `Master` 서버에서 변경 사항이 있다면 자신의 `Slave`에 옮겨 온다.
- 자신의 `Oplog`와 `Master`의 `Oplog`를 비교해 변경사항이 있다면 자신의 데이터 저장소를 업데이트 한다.
## MongoDB 복제 구성작업
____
### 1. Master, Slave 서버 폴더 생성
<pre><code style="font-size:14px">mkdir C:\mongodb\master
mkdir C:\mongodb\slave01
mkdir C:\mongodb\slave02
</code></pre>
<br/>
### 2. Master, Slave 서버 실행하기
<pre><code style="font-size:14px">matser 실행
- mongod --dbpath C:\mongodb\master -port 10000 -master
</code></pre>
- 실행결과

<br/>
<pre><code style="font-size:14px">slave01 실행
mongod --dbpath C:\mongodb\DB\slave01 -port 10001 -slave -source localhost:10000
</code></pre>
- 실행결과

<pre><code style="font-size:14px">slave02 실행
mongod --dbpath C:\mongodb\DB\slave02 -port 10002 -slave -source localhost:10000
</code></pre>
- 실행결과

<br/>
### 3. Master 서버 접속
<pre><code style="font-size:14px">mongo localhost:10000
</code></pre>
<br/>
### 4. Master 서버 데이터 입력
<pre><code style="font-size:14px">show collections
db.users.insert({ 'name' : 'lee', 'phone' : '010-1234-5678', 'addr' : 'seoul' })
db.users.find()
</code></pre>
<br/>
### 5. slave 서버 설정
<pre><code style="font-size:14px">rs.slaveOk()
db.users.find()
</code></pre>
- 각 slave 서버와 master 서버와 `users` collection이 동기화 된 것을 확인할 수 있다.

- slave에 데이터를 입력하면 master가 아니기 때문에 오류가 나는 것을 확인할 수 있다.

## MongoDB Replica Set
_____
- 데이터 보존을 위해 백업 서버를 두는 것
- 데이터 서버 장애 대응방법
- 데이터 복제 동기화
## MongoDB Replica Set 구조
____
- `primary server`는 secondary server를 2초 단위로 구성(입력 담당 서버)
- `primary server` : Replica set에서 첫번째 입력을 담당하는 서버
- `secondary server` : primary server를 제외한 나머지 server
- 복제 집합으로 구성된 각각의 노드이다.
- 아래의 그림은 한 개의 Master와 두 개의 Slave로 구성된 복제 집합이다.

[사진 출처 : [https://docs.mongodb.com](https://docs.mongodb.com)]
## MongoDB Replica Set 복제 동작
____
1. 구성된 각각의 서버는 서로의 서버의 상태를 확인한다.(Heartbeat)
2. `Heartbeat`를 통해 서버 상태의 코드를 각 노드간에 주고 받는다.
3. Master 서버가 죽었다면, 각 Slave 서버는 Master 선출 방법이나 우선순위에 따라 Master 서버가 된다.
## MongoDB Replica Set 구성 작업
____
### 1. master, slave 폴더 생성
<pre><code style="font-size:14px">mkdir C:\mongodb\master
mkdir C:\mongodb\slave01
mkdir C:\mongodb\slave02
</code></pre>
- 단, master 폴더가 master가 된다는 보장은 없다.
### 2. primary 서버 실행
<pre><code style="font-size:14px">mongod --replSet downSet --dbpath C:\mongodb\master -port 10000
</code></pre>
<br/>
### 3. secondary 서버 실행
<pre><code style="font-size:14px">mongod --replSet downSet --dbpath C:\mongodb\slave01 -port 10001
mongod --replSet downSet --dbpath C:\mongodb\slave02 -port 10002mongod --replSet downSet --dbpath C:\mongodb\master -port 10000
</code></pre>
<br/>
### 4. primary 서버 접속
<pre><code style="font-size:14px">mongo localhost:10000
</code></pre>
<br/>
### 5. 리플리카셋 환경설정
- 해당 ID 가지고 있는 것끼리 포트번호와 함께 묶는다.
<pre><code style="font-size:14px">var config={
_id : 'downSet',
members : [
{_id : 0, host : "localhost:10000"},
{_id : 1, host : "localhost:10001"},
{_id : 2, host : "localhost:10002"}
]
}
</code></pre>
<br/>
### 6. 리플리카셋 초기화
<pre><code style="font-size:14px">rs.initiate(config)
</code></pre>
- 리플리카 셋 초기화 후 `downSet:OTHER>`로 바뀐것을 확인할 수 있다.
그리고 `Enter`를 한번 치면 `PRIMARY`로 바뀐것을 확인할 수 있다.

- `localhost:10001` slave02 서버가 secondary 서버로 설정된 것을 확인할 수 있다.

#### slave를 master로 만들어보기
- primary 서버를 중단 시키면, secondary 서버였던 `localhost:10002` 서버가 primary 서버로 바뀐 것을 확인 할 수 있다.
- 이를 통해 서버가 복제되고 난 후 서버에 장애가 생겼을 때를 대비해 복제된 서버가 primary 서버가 됨으로써 데이터를 보존할 수 있다.

'MongoDB' 카테고리의 다른 글
MongoDB Sharding(샤딩) (0) | 2017.07.21 |
---|---|
MongoDB 설치 및 사용 (0) | 2017.07.18 |