[MongoDB] Docker로 replica-set 환경구축

Ricky·2023년 3월 22일
2
post-thumbnail

MySQL이나 oracle만 쓰다가 MongoDB로 백엔드를 만들어보면서 해당 환경을 구축하게 되었다.

처음에는 그냥 로컬용 디비는 docker로 하나만 올려서 사용하고 있었는데,
로직이 길어지면서 트랜잭션처리를 할 필요가 생겼는데 그 순간...
Transaction numbers are only allowed on a replica set member or mongos
이런 에러메세지를 발견했다.
말그대로 트랜잭션을 쓰려면 레플리카 셋을 구현해야 해서 docker로 만들어 보았다.

1. 디비 생성

기존에 하나만 사용하던 디비를 우선 3개를 생성해 준다.
간편하게 생성하고 관리하기 위헤서 docker-compose를 사용하기로 한다

//docker-compose.yml 

version: "3"

services:
  mongodb1:
    image: mongo
    container_name: mongodb1
    restart: always
    command: mongod --replSet rs0 --bind_ip_all
    ports:
      - 27017:27017
    volumes:
      - ./mongodb1:/data/db

  mongodb2:
    image: mongo
    container_name: mongodb2
    restart: always
    command: mongod --replSet rs0 --bind_ip_all --port 27018
    ports:
      - 27018:27018
    volumes:
      - ./mongodb2:/data/db

  mongodb3:
    image: mongo
    container_name: mongodb3
    restart: always
    command: mongod --replSet rs0 --bind_ip_all --port 27019
    ports:
      - 27019:27019
    volumes:
      - ./mongodb3:/data/db


networks:
  default:
    name: mongoCluster
 

위의 파일을 간단하게 살명하면
docker의 mongo이미지로 mongodb1, mongodb2, mongodb3 이렇게 3개의 몽고디비를 생성한다.

// 항상 실행
restart: always 
// 'rs0' 이름으로 리플리카셋
// bind_ip_all 바인드 ip 전체
// 포트 설정 
command: mongod --replSet rs0 --bind_ip_all --port 27019
// 저장되는 데이터
volumes:
- ./mongodb3:/data/db

해당 파일을 실행시켜준다.

docker-compose up -d

이렇게 실행하면 도커가 실행된다.

2. 레플리카 설정

실행된 도커인스턴스에 접근한다.
docker ps > docker exec -it ${containerId} bash 이렇게 실행해도 되지만 간단하게 도커툴로 실행해 보겠다.


위의 이미지에서 첫번째 터미널에 open in termial로 터미널로 들어가준다.
그 후 리플리카 셋 설정을 해주면 된다 .

// 몽고sh 접속
# mongosh 

// 생성한 도커들 설정 (container_name:port)
> rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongodb1:27017" },
    { _id: 1, host: "mongodb2:27018" },
    { _id: 2, host: "mongodb3:27019" }
  ]
})
// 출력데이터 
{ ok: 1 }

이렇게 됬다면 설정이 완료 된것이다.
설정된 부분을 확인하려면. rs.status() 명령어를 사용하면 확인가능하다.

>rs.status()

{
  set: 'rs0',
  ...
}

3. 호스트 설정

이제 마지막으로 생성해준 컨테이너들 호스트 설정만 해주면 끝이다.
터미널에서 접속한 다음에 호스트 설정해주면 끝이다.

sudo vi /etc/hosts

// 호스트 추가 
127.0.0.1       mongodb1
127.0.0.1       mongodb2
127.0.0.1       mongodb3

이러면 기본 설정은 다 끝났다.
이제는 디비 툴이든 서버든 접속이 가능하다.

mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/db?replicaSet=rs0

내가 사용하는 studio 3T 에서도 접속 확인가능.

이렇게 3개의 리플리카 구성을 완료해보았다.

또 쓸만한게 생기면 적어보도록 하겠다.

PS

테스트 코드 작성할때 메모리디비를 사용하는데 거기서도 레플리카로 사용하면 된다.

this.mongo = await MongoMemoryReplSet.create({ replSet: { count: 3 } });
const url = this.mongo.getUri();
await mongoose.connect(url, { dbName: 'test' });

profile
Developer

0개의 댓글