본문 바로가기
DataBase/mongoDB

MongoDB) Replica Set 구성

by 박채니 2024. 1. 15.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.

 

Replica Set

→ DB의 데이터들을 여러 서버에 동기화하는 것을 의미

 

장점

 

  • 하나의 서버가 다운되어도 데이터 유지 가능 (다른 서버에 동기화 되어 있으므로)
  • 데이터 복구/백업 설정 가능
  • 데이터 안전하게 보존 가능
  • 서비스 운영 시 다운타임이 없음

사용 배경

mongoose를 이용하여 DB 작업을 처리하던 중, transaction 처리가 필요했는데 반드시 Replica Set 설정이 필요하다.
Replica Set 설정을 하지 않고 트랜잭션 처리를 할 경우, 아래와 같은 오류 발생
"message": "Transaction numbers are only allowed on a replica set member or mongos"

 

⭐️ stanlone 모드에서는 트랜잭션 처리가 불가하여 사용 ⭐️

 

Docker로 MongoDB 개발 환경이 구성되어 있었기 때문에, 아래와 같이 docker-compose.yml 파일을 구성한다.

docker-compose.yml

version: "3.0"
services:
    mongo1:
        container_name: mongo1
        image: mongo
        command: mongod --replSet replset --port 27017
        ports:
            - "27017:27017"
        environment:
            MONGO_HOST: "127.0.0.1"
            MONGO_PORT: 27017
            MONGO_DATABASE: dev

    mongo2:
        container_name: mongo2
        image: mongo
        command: mongod --replSet replset --port 27018
        ports:
            - "27018:27018"
        environment:
            MONGO_HOST: "127.0.0.1"
            MONGO_PORT: 27017
            MONGO_DATABASE: dev

    mongo3:
        container_name: mongo3
        image: mongo
        command: mongod --replSet replset --port 27019
        ports:
            - "27019:27019"
        environment:
            MONGO_HOST: "127.0.0.1"
            MONGO_PORT: 27017
            MONGO_DATABASE: dev

위와 같이 docker-compose.yml 파일을 생성했다면, 생성한 container에 접속해서 Replica Set 설정을 해줘야 한다.

 

mongo1 Container 접속

$ docker exec -it mongo1 mongosh --port 27017

 

Replica Set에 대한 config 지정

> config = {
    "_id" : "replset", // docker-compose에 있는 replSet과 동일하게
    "members" : [
        {
            "_id" : 0,
            "host" : "mongo1:27017"
        },
        {
            "_id" : 1,
            "host" : "mongo2:27018"
        },
        {
            "_id" : 2,
            "host" : "mongo3:27019"
        }
    ]
}

> rs.initiate(config);

Replica Set 설정이 된 MongoDB 접속 url을 업데이트 해주고 DB 작업을 하면, 정상적으로 트랜잭션 처리가 되는 것을 확인할 수 있다.

mongodb://${host}:${port}/${database}?replicaSet=${replicaName}

 

Local 접속 시 getaddrinfo ENOTFOUND chat-mongo1 오류가 발생하는 경우

 

host 설정하기

$ sudo vi /etc/hosts

# 아래 내용 추가
# MongoDB Replica Set
127.0.0.1 chat-mongo1
127.0.0.1 chat-mongo2
127.0.0.1 chat-mongo3

 

 

✅ 참고 사이트

MongoDB Transaction 트랜잭션 개념부터 실습까지 (2) - 로컬에서 Replica Set 구성하기
docker-compose로 MongoDB ReplicaSet 환경 구축하기 | by Key Kim | Medium
Local Client에서 접속가능한 Replica Set 구성하기 (with Docker)

 

Local Client에서 접속가능한 Replica Set 구성하기 (with Docker)

MongoDB에서 Transaction을 사용하기 위해서는 Replica Set이나 Sharded Cluster를 사용해야한다. https://dba.stackexchange.com/questions/265236/how-can-we-use-transaction-in-mongodb-standalone-connection https://docs.mongodb.com/manual/core/

devs0n.tistory.com

 

docker-compose로 MongoDB ReplicaSet 환경 구축하기

docker-compose로 3개의 node를 가지는 mongodb replicaset (P-S-S)환경을 구축해봅니다.

keyhyuk-kim.medium.com

 

[MongoDB] Transaction 트랜잭션 개념부터 실습까지 (2) - 로컬에서 Replica Set 구성하기

https://bcoding-lab.tistory.com/293?category=868268 [MongoDB] Transaction 트랜잭션 개념부터 실습까지 (1) - Transaction numbers are only allowed on a replica set member Transaction이란 예를 들어, 위 그림과 같이 4개의 데이터를

bcoding-lab.tistory.com