본문 바로가기

MongoDB

MongoDB 복제 시스템, 레플리카 셋

@markdown

# MongoDB 복제 시스템, 레플리카 셋

<br/>

## MongoDB 복제 시스템

____

- Master - Slave 방식으로 구성

- Master 데이터의 복사본을 Slave에 배치

- Master 장애에 따른 데이터 손실없이 Slave의 데이터 사용가능


## MongoDB 복제 구조

____

![](http://mongodb.citsoft.net/wp-content/uploads/pic2-1.png)

[사진 출처 : [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>

- 실행결과

![](https://user-images.githubusercontent.com/12658717/28351248-956266f4-6c89-11e7-99d0-652c45241a06.png)

<br/>

<pre><code style="font-size:14px">slave01 실행

mongod --dbpath C:\mongodb\DB\slave01 -port 10001 -slave -source localhost:10000

</code></pre>

- 실행결과

![](https://user-images.githubusercontent.com/12658717/28351287-cc2f4ec2-6c89-11e7-875d-ad721087e031.png)

<pre><code style="font-size:14px">slave02 실행

mongod --dbpath C:\mongodb\DB\slave02 -port 10002 -slave -source localhost:10000

</code></pre>

- 실행결과

![](https://user-images.githubusercontent.com/12658717/28351292-d390e84c-6c89-11e7-846a-2c4abc490593.png)

<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이 동기화 된 것을 확인할 수 있다.

![](https://user-images.githubusercontent.com/12658717/28351349-2685bf14-6c8a-11e7-89db-f633af0c4929.png)

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

![](https://user-images.githubusercontent.com/12658717/28351434-c69e7da6-6c8a-11e7-992c-cf8280514cf7.png)


## 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/manual/_images/replica-set-primary-with-two-secondaries.bakedsvg.svg)

[사진 출처 : [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`로 바뀐것을 확인할 수 있다.

![](https://user-images.githubusercontent.com/12658717/28352469-8a69ecb0-6c91-11e7-84b1-5ebd7539d218.png)

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

![](https://user-images.githubusercontent.com/12658717/28352479-9ea899ce-6c91-11e7-9e7f-09aef25b8347.png)


#### slave를 master로 만들어보기

- primary 서버를 중단 시키면, secondary 서버였던 `localhost:10002` 서버가 primary 서버로 바뀐 것을 확인 할 수 있다.

- 이를 통해 서버가 복제되고 난 후 서버에 장애가 생겼을 때를 대비해 복제된 서버가 primary 서버가 됨으로써 데이터를 보존할 수 있다.

![](https://user-images.githubusercontent.com/12658717/28352665-b2dda9ce-6c92-11e7-887c-a6e66e3036b6.png)





'MongoDB' 카테고리의 다른 글

MongoDB Sharding(샤딩)  (0) 2017.07.21
MongoDB 설치 및 사용  (0) 2017.07.18