본문 바로가기
DB/MongoDB

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

by devson 2021. 8. 9.

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/retryable-writes/

 

그래서 MongoDB를 사용하는 application에서 Transaction을 사용하고자한다면 여러대의 MongoDB를 띄워 설정을 해줘야하는데

이번 포스팅에서는 Local 개발을 위해 Docker를 사용하여 MongoDB Replica Set을 구축할 수 있는 방법에 대해 알아보도록 하겠다.

 

구글링하면 나오는 대부분의 예제들은 docker network 내부에서만 동작하고 Compass와 같은 외부 MongoDB Client가 사용하려면 Replica Set에 제대로 접근할 수 없다.

 

외부 Client가 Docker로 띄운 Replica Set에 접근하기 위해 몇가지 network 설정이 필요하고, 간단한 Docker network에 대한 지식도 필요하다.

 

전체적인 구성은 아래와 같다.

mongo-1, mongo-2, mongo-3 Container가 각각 30000, 30001, 30002 포트로 기동 중이고 같은 Docker network 내에서 Replica Set으로 구성되어 있다.

이제 하나 씩 구성방법에 대해 알아보자.

 

MongoDB instance 실행

다음과 같이 docker-compose.yml 파일을 작성한다.

(replica set name은 replset 으로 지정하였다)

version: "3.6"

services:
  mongo-1:
    image: mongo:4.4
    container_name: mongo-1
    ports:
      - "30000:30000"
    command: mongod --replSet replset --port 30000

  mongo-2:
    image: mongo:4.4
    container_name: mongo-2
    ports:
      - "30001:30001"
    command: mongod --replSet replset --port 30001

  mongo-3:
    image: mongo:4.4
    container_name: mongo-3
    ports:
      - "30002:30002"
    command: mongod --replSet replset --port 30002

 

이때 container 내 MongoDB instance의 port를 바인딩되는 port와 동일하게 설정한다.

 

그리고 해당 설정을 사용하여 docker-compose를 실행한다.

$ docker-compose up

 

Replica Set 설정하기

MongoDB Replica Set을 설정하기 위해선 직접 MongoDB 인스턴스에 접속해줘야한다.

 

앞서 docker-compose.yml 파일에 설정했던 첫번째 MongoDB container에 접속한다.

# Mongo CLI 접속
$ docker exec -it mongo-1 mongo --port 30000

 

그리고 아래와 같이 Replica Set에 대한 config를 지정한 후 이를 적용하면 된다.

> config = {
	"_id" : "replset", // docker-compose에 있는 replSet과 동일하게
	"members" : [
		{
			"_id" : 0,
			"host" : "mongo-1:30000"
		},
		{
			"_id" : 1,
			"host" : "mongo-2:30001"
		},
		{
			"_id" : 2,
			"host" : "mongo-3:30002"
		}
	]
}

> rs.initiate(config);
{ "ok" : 1 }

 

ok 메세지를 확인하면 정상적으로 Replica Set이 적용된 것이다.

 

host 설정하기

/etc/hosts 파일을 건드려 각 container 내 MongoDB host name과 localhost를 매핑하는 작업을 해준다.

$ sudo vi /etc/hosts

# 아래 내용 추가
# MongoDB Replica Set
127.0.0.1 mongo-1
127.0.0.1 mongo-2
127.0.0.1 mongo-3

 

이 설정을 하는 이유는 바로 직전 단계까지만 진행한 Replica Set의 MongoDB instance들은 Docker network 내에 있기 때문에 host가 mongo-1, mongo-2, mongo-3 으로 설정이 되어있다.

이러한 환경에서 Client로 Replica Set에 접근하려고하면 아래와 같이 host에 대한 정보를 얻을 수 없어 접근이 되지 않는다.

(이렇게까지 해야하나 싶긴하지만 로컬 개발용으로 구성하는 것이기 때문에 처음 세팅만 해놓으면 계속 사용할 수 있고 MongoDB를 직접 설치하는 것 보다는 빠르게 구축가능하기 때문에 이렇게 하여도 나쁘진 않을 것 같다는 생각이다)

 

Replica Set 접속

/etc/hosts 파일을 수정하였다면 Compass로 Replica Set에 접속하여 보자.

 

Replica Set Name 지정

 

위와 같이 Replica Set으로 잘 연결된 것을 확인할 수 있다.

 


참고

- https://www.sohamkamani.com/blog/2016/06/30/docker-mongo-replica-set/

- https://docs.mongodb.com/manual/tutorial/force-member-to-be-primary/

- https://gist.github.com/asoorm/7822cc742831639c93affd734e97ce4f

- https://www.gyanblog.com/docker/how-run-mongodb-replicaset-docker/

 

'DB > MongoDB' 카테고리의 다른 글

DocumentDB는 MongoDB가 아니다  (0) 2021.11.25
MongoDB Index  (0) 2021.06.05
MongoDB Performance Tips  (0) 2021.06.05

댓글