MongoDB에서 Transaction을 사용하기 위해서는 Replica Set이나 Sharded Cluster를 사용해야한다.
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으로 잘 연결된 것을 확인할 수 있다.
참고
- 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 |
댓글