MongoDB 복제

Minyuk·2024년 5월 26일
0

복제

  • MongoDB의 Primary는 클라이언트 앱들의 읽기와 쓰기 요청을 모두 받게 되는데, 해당 작업을 수행하고 변화된 모든 내용을 operation logs(oplogs) 에 기록
  • Secondary들은 oplogs에 기록된 내용을 같이 연산하여 Primary와 함께 동일한 데이터를 유지 (동기화)

oplogs

  • 데이터베이스에서 발생되는 모든 수정 작업에 대한 내용을 기록하며, capped collection 에 저장

복제 방식

  1. Primary에 쓰기가 수행되면, Primary의 oplog에 기록
  2. 모든 secondary도 자신의 oplog에 Primary의 oplog 복제 (아래 순서로 복제)
    2-1. secondary의 oplog에서 가장 최근 항목의 타임스탬프 검사
    2-2. Primary의 oplog에서 2-1의 타임스탬프 이후 모든 항목을 질의
    2-3. 데이터 쓰기 수행 후 secondary의 oplog에 기록

장애 복구

Primary 교체

  • Node 간에 주고 받는 heartbeat 신호를 통해 Primary가 정상적이지 않는 상황일 때, Secondary 중 하나가 Election 통해 Primary로 승격
    • 기존 Primary가 정상화되면 다시 Primary 역할을 수행
# Heartbeat
- Replica set내의 모든 노드들은 정해진 초마다 서로에게 Hearbeat를 보내서 상태를 확인

Election 방식

  • Election 시에 투표자들의 투표 숫자가 전체 가능한 투표 숫자의 과반수를 넘어야 진행
    • 최소 2개 이상 투표권 필요, 투표하는 서버가 3개이상의 홀 수개로 존재해야 Primary가 정상적으로 선출
  • Arbiter
    • 투표권은 있으나 Primary node로 선출될 수는 없는 노드
    • 데이터 셋 복사본을 들고 있지 않기 때문에 하드웨어 리소스를 많이 소비하지않는 경량 프로세스
{
	"member": [
    	{
        	"_id": 0,
            "host": "localhost:5500",
            "arbiterOnly": false,
            "prioriy": 1
            ...
            "votes": 1 # 투표권 0 or 1
}

Replica set 구축

  • MongoDB 설치
  • ./etc/mongo.conf 수정
	# primary, secondary 서버에 port만 수정하여 동일하게 적용
    
	... # Replca set 외 설정 생략

	net:
		port: 27017
    	bindIp: localhsot, {host name(domain or IP)}
    
	security: # 커넥 실패 에러가 발생하는 경우에 설정 필요
		authorization: "enabled"
    	clusterAuthMode: "keyFile"
    	keyFile: "{key file path}"
    
	replication:
		replSetName: "{name}"
  • mongod(mongo daemon) 실행

    $sudo mongod --config /etc/mongod.conf --fork
    or
    systemctl start mongod

  • Primary node에서 mongo daemon 접속

    mongo --port 27017 -u "admin" -p

  • Replica set 생성

    rs.initiate(
    	{
    	 	_id: "rs0",
    	 	members: [
    	   		{_id: 0, host: "primary:27017"},
    	   		{_id: 1, host: "secondary1:27018"},
    	   		{_id: 2, host: "secondary2:27019"}
    	 	]
    	}
    )
  • Primary node에서 Replica set 생성 결과 확인

    rs.status()

0개의 댓글

관련 채용 정보