본문으로 건너뛰기

VM을 이용한 MongoDB Replica Set 구성

카카오클라우드 VM과 볼륨을 이용하여 MongoDB Replica Set을 구성합니다.

기본 정보

시나리오 소개​

MongoDB Replica Set은 동일한 데이터 집합을 여러 노드에 복제해 장애 상황에서도 서비스를 지속할 수 있도록 하는 고가용성 구성입니다. 이 시나리오에서는 카카오클라우드 VM 서비스와 볼륨을 활용해 3개 노드로 구성된 Replica Set 환경을 구축합니다.

주요 내용은 다음과 같습니다.

  • Bastion 호스트와 Nginx Proxy Manager를 사용한 MongoDB 인스턴스 SSH 접근 경로 구성
  • MongoDB 인스턴스 3개와 각 인스턴스별 500GB 데이터 볼륨 구성
  • MongoDB 데이터 디렉터리 마운트와 Replica Set 배포

시작하기 전에​

사전 작업으로 VPC, 서브넷, 보안 그룹을 준비하고 실습에 필요한 인스턴스와 볼륨을 생성합니다.

1. VPC와 서브넷 생성​

인스턴스를 생성하기 전, 인스턴스가 생성될 VPC 및 서브넷을 생성해야 합니다. VPC와 서브넷이 없다면, VPC 생성, 서브넷 생성 문서를 참고하여 VPC 및 서브넷을 생성합니다.

2. 보안 그룹 설정​

카카오클라우드 콘솔 > Networking > VPC > 보안 그룹으로 이동합니다. 아래 정보를 참고하여 보안 그룹과 인바운드 정책을 설정합니다.

보안 그룹: tutorial-bastion-sg
  1. 보안 그룹 이름과 설명을 아래와 같이 입력합니다.

    이름설명
    tutorial-bastion-sgBastion 호스트용
  2. 하단의 [+ 추가하기] 버튼을 클릭한 뒤 인바운드 조건을 아래와 같이 설정하고 [적용] 버튼을 클릭합니다.

    나의 퍼블릭 IP 확인하기

    다음 버튼을 클릭하면 현재 사용 중인 나의 퍼블릭 IP를 확인할 수 있습니다.

    추가할 인바운드 규칙항목설정값
    bastion inbound policy 1프로토콜ICMP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호ALL
    정책 설명(선택)ping-bastion
    bastion inbound policy 2프로토콜TCP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호22
    정책 설명(선택)ssh-bastion
    bastion inbound policy 3프로토콜TCP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호81
    정책 설명(선택)manage-bastion
    bastion inbound policy 4프로토콜TCP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호10000-10010
    정책 설명(선택)fwd-bastion
보안 그룹: tutorial-mongodb-sg
  1. 보안 그룹 이름과 설명을 아래와 같이 입력합니다.

    이름설명
    tutorial-mongodb-sgMongoDB 노드용
  2. 하단의 [+ 추가하기] 버튼을 클릭한 뒤 인바운드 조건을 아래와 같이 설정하고 [적용] 버튼을 클릭합니다.

    나의 퍼블릭 IP 확인하기

    다음 버튼을 클릭하면 현재 사용 중인 나의 퍼블릭 IP를 확인할 수 있습니다.

    추가할 인바운드 규칙항목설정값
    mongodb inbound policy 1프로토콜ICMP
    패킷 출발지SUBNET_CIDR
    포트 번호ALL
    정책 설명(선택)ping-mongo
    mongodb inbound policy 2프로토콜TCP
    패킷 출발지{BASTION_PRIVATE_IP}/32
    포트 번호22
    정책 설명(선택)ssh-mongo
    mongodb inbound policy 3프로토콜TCP
    패킷 출발지SUBNET_CIDR
    포트 번호27017
    정책 설명(선택)conn-mongo

3. 인스턴스 생성 및 볼륨 추가​

인스턴스 생성​

이 단계에서 생성하는 인스턴스는 MongoDB Replica Set 구축을 위한 기본 인프라 설정으로, Bastion 호스트 역할을 하며 포트 포워딩과 네트워크 및 보안 그룹 설정을 담당합니다. 이는 후속 작업에서 MongoDB 노드를 배치하고 설정할 환경을 준비하는 과정입니다.

인스턴스 이름인스턴스 유형루트 볼륨(GB)퍼블릭 IP이미지보안 그룹
tutorial-bastionm2a.large  30     Y    Ubuntu 24.04    tutorial-bastion-sg
tutorial-mongodb-1m2a.large30NUbuntu 24.04tutorial-mongodb-sg
tutorial-mongodb-2m2a.large30NUbuntu 24.04tutorial-mongodb-sg
tutorial-mongodb-3m2a.large30NUbuntu 24.04tutorial-mongodb-sg

볼륨 추가​

MongoDB Replica Set 구성에서 볼륨 추가 설정은 MongoDB 데이터베이스의 데이터를 저장하기 위해 필요한 스토리지 용량을 제공합니다. 후속 작업에서 MongoDB 인스턴스에 대해 별도의 볼륨을 연결하여 안정적이고 지속적인 데이터 저장 공간을 확보할 수 있습니다.

볼륨 이름연결할 인스턴스크기(GB)
tutorial-mongodb-data-1tutorial-mongodb-1500
tutorial-mongodb-data-2tutorial-mongodb-2500
tutorial-mongodb-data-3tutorial-mongodb-3500

시작하기​

Step 1. Bastion 호스트 생성​

이 문서에서는 Nginx Proxy Manager를 이용하여 SSH 요청을 설정한 호스트에 포워딩하는 방법으로 Bastion 호스트를 구현합니다. Bastion 호스트를 생성하는 방법은 다음과 같습니다.

  1. 카카오클라우드 콘솔 > Compute > Beyond Compute Service > Virtual Machine에서 Bastion 호스트로 사용할 인스턴스를 생성합니다.

    구분항목설정/입력값비고
    기본 정보이름tutorial-bastion
    개수1
    이미지Ubuntu 24.04
    인스턴스 유형m2a.large
    볼륨루트 볼륨30GB
    키 페어{USER_KEYPAIR}⚠️ 키 페어는 최초 1회 안전하게 보관해야 합니다.
    잃어버린 키는 복구할 수 없으며, 재발급이 필요합니다.
    네트워크VPCtutorial
    서브넷main (10.0.0.0/20)
    보안 그룹tutorial-bastion-sg
  2. 터미널 실행 후 다음 명령어를 실행하여 Bastion 호스트에 SSH 접근합니다.

    ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP}
  3. 터미널에 하단의 명령을 실행하여 Docker와 Docker Compose 설치 및 Nginx Proxy Manager를 실행합니다.

    curl -o install-bastion.sh https://raw.githubusercontent.com/kakaoenterprise/kc-handson-config/bastion-host/install-bastion.sh
    bash install-bastion.sh
  4. 브라우저에서 http://${BASTION_PUBLIC_IP}:81 주소를 입력하여 Nginx Proxy Manager 관리 페이지에 접속할 수 있습니다. 접속을 위한 초기 계정 정보는 다음과 같습니다.

    구분입력값
    Email addressadmin@example.com
    Passwordchangeme

Step 2. MongoDB 인스턴스 생성​

카카오클라우드 콘솔 > Compute > Beyond Compute Service > Virtual Machine에서 MongoDB 인스턴스로 사용할 인스턴스를 생성합니다.

구분항목설정/입력값비고
기본 정보이름tutorial-mongodb
개수3
이미지Ubuntu 24.04
인스턴스 유형m2a.large
볼륨루트 볼륨30GB
키 페어{USER_KEYPAIR}⚠️ 키 페어는 최초 1회 안전하게 보관해야 합니다.
잃어버린 키는 복구할 수 없으며, 재발급이 필요합니다.
네트워크VPCtutorial
서브넷main (10.0.0.0/20)
보안 그룹tutorial-mongodb-sg

Step 3. MongoDB 데이터 저장용 볼륨 생성​

MongoDB 데이터를 저장할 별도의 볼륨을 사용하는 것을 권장합니다. MongoDB 데이터를 저장할 볼륨을 생성하는 방법은 다음과 같습니다.

  1. 카카오클라우드 콘솔 > Compute > Beyond Compute Service > Virtual Machine 에서 볼륨을 생성합니다.

    MongoDB 호스트 정보​
    볼륨 이름볼륨 유형볼륨 크기
    tutorial-mongodb-data-1SSD       500
    tutorial-mongodb-data-2SSD500
    tutorial-mongodb-data-3SSD500
  2. 다음을 참고하여 인스턴스의 상세 페이지의 볼륨 탭에서 MongoDB 인스턴스에 연결할 볼륨을 선택합니다. (MongoDB 인스턴스에 생성한 볼륨을 추가합니다.)

    인스턴스볼륨 연결 정보
    tutorial-mongodb-1tutorial-mongodb-data-1
    tutorial-mongodb-2tutorial-mongodb-data-2
    tutorial-mongodb-3tutorial-mongodb-data-3

Step 4. 포워딩 정보 업데이트​

Bastion 호스트의 특정 포트에 접속하면 내부 MongoDB 인스턴스에 SSH로 접속할 수 있도록 포워딩을 구성할 수 있습니다. 이 작업은 외부에서 MongoDB 노드에 접근하기 위한 연결 설정 단계로, Nginx Proxy Manager를 통해 포트 포워딩 정보를 설정합니다.

  1. 브라우저에서 http://${BASTION_PUBLIC_IP}:81 주소를 입력하여 Nginx Proxy Manager 관리 페이지에 접속합니다.

  2. Nginx Proxy Manager(관리 페이지) > Streams 탭에서 [Add Stream] 버튼을 클릭하여 Streams를 추가합니다.

    • 내부 호스트를 추가 시 Bastion 호스트를 통해 내부 호스트로 접속할 수 있습니다.
    Incoming PortForward HostForward Port프로토콜
    10000     {MONGODB_NODE_1_PRIVATE_IP}22    TCP
    10001{MONGODB_NODE_2_PRIVATE_IP}22TCP
    10002{MONGODB_NODE_3_PRIVATE_IP}22TCP
  3. Bastion 호스트의 포트를 통해 내부 MongoDB 인스턴스에 접근되는지 확인합니다.

    • MONGODB_SSH_PORT: Nginx Proxy Manager에서 MongoDB 노드에 매핑한 포트 번호
    ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p ${MONGODB_SSH_PORT}

    예시: tutorial-mongodb-1 인스턴스에 접속하려면 아래와 같이 실행합니다.

    ssh -i ${PRIVATE_KEY}.pem ubuntu@${BASTION_PUBLIC_IP} -p 10000
  4. 이후 단계에서는 각 MongoDB 인스턴스(tutorial-mongodb-1, tutorial-mongodb-2, tutorial-mongodb-3)에 SSH로 접속하여 MongoDB 설치 및 볼륨 마운트 작업을 수행합니다. 아래 Step 5의 작업은 모든 노드에 대해 동일하게 진행되어야 합니다.

Step 5. MongoDB 환경 구축​

MongoDB를 설치하고 데이터를 저장할 볼륨을 마운트하며, Replica Set 구성을 위한 환경을 설정합니다.

정보

본 단계에서 수행하는 MongoDB 설치 및 환경 설정 작업은 tutorial-mongodb-1, tutorial-mongodb-2, tutorial-mongodb-3 모든 인스턴스에 대해 동일하게 수행해야 합니다. 아래 작업은 각 노드에 SSH로 접속하여 반복 실행해야 하며, 이후 Step 6에서 Replica Set 구성을 위해 준비가 완료된 상태여야 합니다.

DNS 설정​

변수 설정

아래 값은 /etc/hosts 파일 설정 시 사용되며, 사용자의 환경에 맞게 입력해야 합니다.

  • MONGODB_NODE_1_PRIVATE_IP: tutorial-mongodb-1 인스턴스의 프라이빗 IP
  • MONGODB_NODE_2_PRIVATE_IP: tutorial-mongodb-2 인스턴스의 프라이빗 IP
  • MONGODB_NODE_3_PRIVATE_IP: tutorial-mongodb-3 인스턴스의 프라이빗 IP
  1. Replica Set을 관리하기 위해 인스턴스 IP 주소 대신 DNS 호스트 이름을 사용하여 도메인 이름을 정의합니다. 이때 /etc/hosts 파일을 수정하여 임의로 도메인 이름을 정의합니다.

    cat << EOF | sudo tee -a /etc/hosts

    ${MONGODB_NODE_1_PRIVATE_IP} node1.rs.in
    ${MONGODB_NODE_2_PRIVATE_IP} node2.rs.in
    ${MONGODB_NODE_3_PRIVATE_IP} node3.rs.in
    EOF
    환경 변수설명
    MONGODB_NODE_1_PRIVATE_IP🖌︎ node1의 프라이빗 IP 입력
    MONGODB_NODE_2_PRIVATE_IP🖌︎ node2의 프라이빗 IP 입력
    MONGODB_NODE_3_PRIVATE_IP🖌︎ node3의 프라이빗 IP 입력
  2. ping 명령을 실행하여 정의한 도메인 이름과 호스트가 일치하는지 확인합니다.

    ping node2.rs.in
    # PING node2.rs.in (172.16.0.221) 56(84) bytes of data.
    # 64 bytes from node2.rs.in (172.16.0.221): icmp_seq=1 ttl=64 time=2.18 ms
    # 64 bytes from node2.rs.in (172.16.0.221): icmp_seq=2 ttl=64 time=0.752 ms
    # ...

볼륨 마운트​

데이터 및 로그를 저장하기 위해 생성한 볼륨을 데이터 디렉터리에 마운트합니다.

  1. /dev/vdb 볼륨을 xfs 파일 시스템을 통해 /data 데이터 디렉터리에 마운트합니다.

    cat <<EOF | sudo fdisk /dev/vdb
    n
    p
    1


    w
    EOF
    sudo mkfs -t xfs /dev/vdb1
    sudo mkdir -p /data
    sudo mount /dev/vdb1 /data
  2. 볼륨이 데이터베이스의 데이터를 저장할 디렉터리에 마운트되었는지 확인합니다.

    df -h
    # Filesystem Size Used Avail Use% Mounted on
    # ...
    # /dev/vdb1 500G 3.6G 497G 1% /data
    # ...

MongoDB 설치​

Ubuntu 24.04 환경에서는 apt-key가 deprecated 되었으므로, keyring 기반 방식으로 MongoDB 저장소를 구성합니다.

  1. 인스턴스에 MongoDB를 설치합니다.

    # 필수 패키지 설치
    sudo apt-get update
    sudo apt-get install -y gnupg curl

    # GPG 키 등록 (keyring 방식)
    curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc \
    | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor --yes

    # MongoDB 저장소 추가 (Ubuntu 24.04 - noble)
    echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] http://repo.mongodb.com/apt/ubuntu noble/mongodb-enterprise/8.0 multiverse" \
    | sudo tee /etc/apt/sources.list.d/mongodb-enterprise.list

    # 패키지 설치
    sudo apt-get update
    sudo apt-get install -y mongodb-enterprise=8.0.7 \
    mongodb-enterprise-server=8.0.7 \
    mongodb-enterprise-shell=8.0.7 \
    mongodb-enterprise-mongos=8.0.7 \
    mongodb-enterprise-tools=8.0.7

    # 서비스 중지 (설정 변경을 위해)
    sudo service mongod stop
  2. MongoDB의 데이터와 로그는 별도로 생성한 볼륨에 저장합니다. 데이터 및 로그를 저장할 디렉터리를 생성합니다.

    sudo mkdir -p /data/mongodb
    sudo mkdir -p /data/log/mongodb
  3. 생성된 디렉터리에서 작업할 수 있도록 권한을 설정합니다.

    sudo chown -R mongodb:mongodb /data/*
  4. MongoDB 프로세스가 생성한 디렉터리에 정보를 저장하도록 값을 수정합니다. /data/mongodb에 데이터를 저장하고 /data/log/mongodb/mongod.log 파일에 로그를 작성합니다.

    cat <<EOF | sudo tee /etc/mongod.conf
    storage:
    dbPath: /data/mongodb

    systemLog:
    destination: file
    logAppend: true
    path: /data/log/mongodb/mongod.log

    net:
    port: 27017
    bindIp: 0.0.0.0

    processManagement:
    timeZoneInfo: /usr/share/zoneinfo

    replication:
    oplogSizeMB: 2000
    replSetName: "tutorial-replicaset"
    EOF
  5. MongoDB 프로세스를 시작합니다.

    sudo service mongod start

Step 6. MongoDB Replica Set 배포​

tutorial-mongodb-1, tutorial-mongodb-2, tutorial-mongodb-3 인스턴스에 MongoDB 프로비저닝을 완료했다면, 인스턴스 중 한 노드에 접속하여 Replica Set을 구축합니다.

  1. tutorial-mongodb-1 인스턴스에 접속하여 Replica Set을 구축합니다.

    Replica Set 생성 (Remote - tutorial-mongodb-1)
    mongosh --eval 'rs.initiate({
    _id : "tutorial-replicaset",
    members: [
    { _id: 0, host: "node1.rs.in:27017" },
    { _id: 1, host: "node2.rs.in:27017" },
    { _id: 2, host: "node3.rs.in:27017" }
    ]
    })'
  2. tutorial-mongodb-1 인스턴스에 생성된 Replica Set의 설정을 확인합니다.

    Replica Set 설정 확인
    mongosh --eval 'rs.config()'