Replica set

1. 목적

  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 선출방식

  1. Prioity 선출 방식

    • DBA에 의해 우선순위를 정한 순서대로 Primary Server가 선출됨
    • DBA 관리 측면에서 어느 서버가 다음 Primary Server가 될지 알 수 있기 때문에 관리가 편함
  2. Arbiter 선출방식

    • Arbiter 서버의 알고리즘에 의해 자동으로 선출됨
    • 서버 상태 (저장공간, 네트워크 상태등을 고려)를 자동으로 고려해 선출하여 편리
    • DBA 관리 측면에서는 어느서버가 다음 Primary Server가 될지 알 수 없기 때문에 불편
    • Arbiter server는 복제 데이터를 가지고 있지 않음

7. Replica 실습

  1. 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
    
  2. 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 
      
  3. 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 테스트

  1. 저장 후 복제 확인 테스트

    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()
    
  2. FailOver 테스트

    Primary server shutdown

    mongo localhost:10001
    db.shutdownServer()
    

    Secondary server가 Primary server로 변경되었는지 확인

    프롬프트로 확인 가능함

    mongo localhost:10002
    mongo localhost:10003