MongoDB Replica Set 구성 및 운영
개요
MongoDB Replica Set은 동일한 데이터를 가진 여러 MongoDB 인스턴스의 집합입니다. 이는 데이터의 고가용성과 장애 복구를 보장하는 핵심 기능입니다.
Replica Set의 구조
기본 구성 요소
- Primary: 쓰기 작업을 처리하는 주 노드
- Secondary: 읽기 작업을 처리할 수 있는 복제 노드
- Arbiter (선택적): 투표만 참여하는 노드
최소 구성
- 3개의 데이터 노드 (1 Primary + 2 Secondary)
- 2개의 데이터 노드 + 1개의 Arbiter
Docker Compose를 이용한 Replica Set 구성
version: '3.8'
services:
  mongo1:
    image: mongo:latest
    container_name: mongo1
    command: mongod --replSet myReplicaSet --bind_ip_all
    ports:
      - '27017:27017'
    volumes:
      - mongo1_data:/data/db
    networks:
      - mongo_network
  mongo2:
    image: mongo:latest
    container_name: mongo2
    command: mongod --replSet myReplicaSet --bind_ip_all
    ports:
      - '27018:27017'
    volumes:
      - mongo2_data:/data/db
    networks:
      - mongo_network
  mongo3:
    image: mongo:latest
    container_name: mongo3
    command: mongod --replSet myReplicaSet --bind_ip_all
    ports:
      - '27019:27017'
    volumes:
      - mongo3_data:/data/db
    networks:
      - mongo_network
volumes:
  mongo1_data:
  mongo2_data:
  mongo3_data:
networks:
  mongo_network:
    driver: bridgeReplica Set 초기화
1. Primary 노드 접속
docker exec -it mongo1 mongosh2. Replica Set 구성 초기화
rs.initiate({
  _id: 'myReplicaSet',
  members: [
    { _id: 0, host: 'mongo1:27017' },
    { _id: 1, host: 'mongo2:27017' },
    { _id: 2, host: 'mongo3:27017' },
  ],
});3. Replica Set 상태 확인
rs.status();Replica Set 운영
읽기 기본 설정
// 읽기 기본 설정 확인
db.getMongo().getReadPrefMode();
// Secondary에서도 읽기 허용
db.getMongo().setReadPref('secondaryPreferred');읽기 선호도 옵션
- primary: 기본값, Primary에서만 읽기
- primaryPreferred: Primary 우선, 불가능할 경우 Secondary
- secondary: Secondary에서만 읽기
- secondaryPreferred: Secondary 우선, 불가능할 경우 Primary
- nearest: 네트워크 지연시간이 가장 낮은 멤버
노드 관리 명령어
// Replica Set 구성 확인
rs.conf();
// Secondary 노드 추가
rs.add('mongodb4:27017');
// Arbiter 노드 추가
rs.addArb('mongodbarbiter:27017');
// 노드 제거
rs.remove('mongodb4:27017');
// Primary 강제 변경
rs.stepDown();모니터링 및 유지보수
복제 지연 모니터링
// 복제 상태 확인
rs.printReplicationInfo();
// Secondary 복제 지연 확인
rs.printSecondaryReplicationInfo();노드 상태 모니터링
// 전체 상태 확인
rs.status();
// 멤버별 상태 확인
db.serverStatus().repl;장애 상황 처리
Primary 노드 장애
- 자동으로 새로운 Primary 선출
- 기존 Primary 복구 후 Secondary로 자동 전환
// 수동으로 Primary 변경
rs.stepDown(300); // 300초 동안 Primary 역할 포기Secondary 노드 장애
- 자동으로 복제 세트에서 제외
- 복구 후 자동으로 데이터 동기화
// 수동으로 Secondary 재시작
db.adminCommand({ replSetMaintenance: 1 }); // 유지보수 모드 시작
db.adminCommand({ replSetMaintenance: 0 }); // 유지보수 모드 종료운영 시 주의사항
1. 네트워크 구성
- 멤버 간 안정적인 네트워크 연결 필요
- 방화벽 설정 확인
- Hostname 해석 가능 여부 확인
2. 디스크 관리
- 충분한 디스크 공간 확보
- 디스크 I/O 모니터링
- 정기적인 백업 수행
3. 보안 설정
// 복제 세트 인증 설정
security:
  keyFile: /path/to/keyfile
  authorization: enabled4. 성능 최적화
- Write Concern 설정
- Read Preference 적절히 구성
- 인덱스 동기화 상태 모니터링
모범 사례
- 
구성 크기 - 홀수 개의 노드로 구성
- 최소 3개의 데이터 노드 권장
 
- 
지리적 분산 - 가용성 향상을 위해 다른 데이터센터에 분산
- 네트워크 지연시간 고려
 
- 
모니터링 - 복제 지연 모니터링
- 디스크 사용량 모니터링
- 네트워크 상태 모니터링
 
- 
백업 - Secondary 노드에서 백업 수행
- 정기적인 백업 및 복구 테스트
 
문제 해결
1. 복제 지연 발생 시
// 복제 지연 확인
rs.printSecondaryReplicationInfo();
// 원인 분석
db.currentOp();2. 선출 문제 발생 시
// 선출 설정 확인
rs.config();
// 강제 선출
rs.reconfig(cfg, { force: true });3. 데이터 동기화 문제
// 초기 동기화 강제 실행
rs.resync();
// 동기화 상태 확인
rs.printReplicationInfo();마치며
MongoDB Replica Set은 고가용성과 데이터 안정성을 보장하는 핵심 기능입니다. 적절한 구성과 모니터링, 그리고 문제 발생 시 신속한 대응이 중요합니다. 다음 글에서는 Sharding과 Replica Set을 함께 사용하는 방법에 대해 알아보도록 하겠습니다.