Replica set
1. 목적
- 장애시 자동 복구
2. Architecture
3. 구성 요소
- Heartbeat
- 매2초마다 Secondary 서버 상태를 체크
- Secondary Server
- Readonly
- 복제 용도로만 사용하는것이 아니라 검색시 Seconary Server 이용
- Primary Server의 데이터를 복제한다
- Primary Server
- Read / Write
- Read는 Secondary server에서 맡기고 주로 Write 담당
- 서버가 다운되면 Secondary 서버중 하나가 Primary 서버 역할을 수행
- OpLog
- 복제가 실패했을 경우 로그를 저장 (기본 1G)
4. Replica Init
- Heartbeat을 통해 Primary Server와 Secondary Server는 서로의 상태를 체크
- Primary Server는 Secondary Server에 데이터 복제
5. Replica FailOver
Primary Server에 장애 발생시 Secondary Server들 중 정의된 선출방식에 의해 Primary Server 선정
6. Replica Pirmary 선출방식
Prioity 선출 방식
- DBA에 의해 우선순위를 정한 순서대로 Primary Server가 선출됨
- DBA 관리 측면에서 어느 서버가 다음 Primary Server가 될지 알 수 있기 때문에 관리가 편함
Arbiter 선출방식
- Arbiter 서버의 알고리즘에 의해 자동으로 선출됨
- 서버 상태 (저장공간, 네트워크 상태등을 고려)를 자동으로 고려해 선출하여 편리
- DBA 관리 측면에서는 어느서버가 다음 Primary Server가 될지 알 수 없기 때문에 불편
- Arbiter server는 복제 데이터를 가지고 있지 않음
7. Replica 실습
Replica set 저장 위치 선정
mkdir /usr/local/mongodb/replica/disk1 mkdir /usr/local/mongodb/replica/disk2 mkdir /usr/local/mongodb/replica/disk3 mkdir /usr/local/mongodb/replica/arbit
Mongod instance 생성
- Replica set name : rptmongo 로 지정함
다음과 같이 rptmongo Relica set을 활성
mongod --dbpath /usr/local/mongodb/replica/disk1 --port 10001 --replSet rptmongo --oplogSize 10 mongod --dbpath /usr/local/mongodb/replica/disk2 --port 10002 --replSet rptmongo --oplogSize 10 mongod --dbpath /usr/local/mongodb/replica/disk3 --port 10003 --replSet rptmongo --oplogSize 10 mongod --dbpath /usr/local/mongodb/replica/arbit --port 10004 --replSet rptmongo --oplogSize 10
Replica set 설정
- Primary Server로 사용될 mongod에 접속
- rptmongo - Mongod instance 생성시 정의된 replica set 이름
- members._id:1 이 Primary
- members._id:2~ 은 Secondary
Secondary중 arbiterOnly : true는 arbiter 설정
mongo localhost:10001/admin db.runCommand({ "replSetInitiate" : { "_id" : "rptmongo", "members": [ {"_id": 1, "host" : "localhost:10001"}, {"_id": 2, "host" : "localhost:10002"}, {"_id": 3, "host" : "localhost:10003"}, {"_id": 4, "host" : "localhost:10004", arbiterOnly: true} ] } } )
8. Replica 테스트
저장 후 복제 확인 테스트
Primary에 데이터 저장
mongo localhost:10001 use test for (var n = 10 ; n < 30 ; n++) db.things.save( { replno:n , replName: "repl test"} )
Secondary 복제 확인
mongo localhost:10002 use test db.setSlaveOk() db.things.find()
FailOver 테스트
Primary server shutdown
mongo localhost:10001 db.shutdownServer()
Secondary server가 Primary server로 변경되었는지 확인
프롬프트로 확인 가능함
mongo localhost:10002 mongo localhost:10003