MongoDB 는 버전 4.0부터 트랜잭션을 지원합니다. 하지만 여타 다른 DB와 다르게 트랜잭션을 사용하기 위해선 Replica Set 환경을 구성해야합니다. 이번 포스트에선 Replica Set에 대해 알아보며 Docker를 통해 환경을 구성하는 방법을 알아봅니다.
🤔 Replica Set 이란?
Replica Set은 동일한 데이터 세트를 유지 관리하는 프로세스 그룹입니다. 여러 프로세스가 동일한 데이터 세트를 유지함을써 하나의 서버가 다운되더라도 제공하는 서비스에 문제가 생기지 않고 운영할 수 있다는 장점이 있습니다.
Replica Set을 구축하는 이유는 다음과 같습니다.
데이터를 안전하게 보존하기 위해서
24시간 접근 가능한 데이터의 상태를 유지하기 위해서
Transaction 처리를 위해 (테스트 환경이나 개발 환경에서는 Standalone mongod 인스턴스를 Replica Set으로 변환하여 사용할 수 있지만, 프로덕션 환경에서는 Replica Set 구축이 필수적입니다.)
기타 등등..
구성 형태
Replica Set은 세가지 역할로 구성원을 나눌 수 있습니다.
Primary: 레플리카 셋에서 프라이머리 노드는 단 하나만 존재 할 수 있습니다. 클라이언트에서 DB로 읽기 및 쓰기 작업을 진행합니다.
Secondary: 프라이머리로부터 데이터를 동기화 합니다. 프라이머리의 장애 상황에서 어떤 세컨더리 노드를 프라이머리로 올릴것인지 투표권을 가지고 있습니다. 설정에 따라 프라이머리 노드의 읽기 작업을 분담할 수 있습니다.
Arbiter: 데이터를 동기화하지는 않으며 투표권만을 가져 프라이머리 장애 발생시 레플리카 셋의 복구를 돕는 역할을 합니다. (현재 예제에선 Arbiter을 다루지 않습니다.)
Replica Set의 구성원 사이에는 주기적으로 10초에 한번씩 Ping을 보내 서로의 노드를 확인하는 작업을 진행합니다. 이러한 작업을 Heartbeat 라고 부르며, 해당 작업을 통해 노드 및 DB의 장애를 파악합니다. 만약 장애가 발견된다면 다음과 같은 작업을 수행합니다.
다음 이미지는 프라이머리 노드에 장애가 발생해 다운되었을 때 입니다. 장애가 발견되면 세컨더리 노드 중 하나를 프라이머리 노드로 올리게 되는데 이때 투표권을 가진 노드들이 선거를 통해 프라이머리 노드로 승격시킬 노드를 결정합니다.
🐳 Docker로 MongoDB Replica Set 구축하기
해당 장에선 Docker를 통해 Replica Set 환경을 구성합니다. Docker를 통해 MongoDB 이미지를 가져와 컨테이너를 구동합니다. MongoDB 이미지에는 런타임 환경에 필요한 Dependency들이 포함되어 있기 때문에 로컬환경에서 MongoDB를 설치하지 않고 Container 단위로 관리할 수 있습니다.
실제 프로덕션 환경에선 하나에 인스턴스에서 모든 노드들을 관리하는 것보다 분산해서 관리하는 것을 추천합니다.
분산된 DB를 통해 프라이머리 노드가 중지되었을 때도 다른 노드들에 영향미치지 않기 때문입니다.
Docker를 통해 Replica Set 구축하는 단계는 다음과 같습니다.
Docker Network 생성
Docker를 통해 세 개의 MongoDB 컨테이너 생성
Replica set 초기 설정
첫 단계부터 차근차근 정리해보도록 하겠습니다.
1️⃣ Docker Network 생성
첫 번째 단계는 Docker Network를 생성하는 것입니다. 실행중인 세 개의 MongoDB 컨테이너를 연결하기 위해 해당 단계를 진행합니다.
1docker network create mongoCluster
mongoCluster는 생성될 network 이름입니다. 사용자가 자유롭게 변경할 수 있습니다.
2️⃣ Docker를 통해 세 개의 MongoDB 컨테이너 생성
세 개의 컨테이너를 한번에 관리하기 위해서 docker-compose를 사용합니다. 먼저 MongoDB Image를 다운로드하는 것부터 진행하겠습니다.
1docker pull mongo
해당 Docker 명령어를 통해 MongoDB 최신 버전을 다운로드 합니다.
이후 docker-compose.yml 파일을 구성하기 전 Replica Set 내부 인증을 위한 키 파일을 먼저 생성해야 합니다.