Spring MongoDB 연동(docker) 1편

1. Docker MongoDB replica Setting 하기

docker 설치 방법은! 다른 블로그에서 참고하자(잘 정리되어있는 블로그가 많다… 귀찮아도.. 찾아서 하시길..)

1. docker 이미지 받아오기(최신 버전을 받아옴, 특정 버젼을 받아온다하여도 문제되지 않음)

1
docker pull mongo

2. docker images (해당 명령어를 통해 정상적으로 설치되었음을 확인)

1
2
3
4
5
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
mongo latest 2b2cc1f48aed 3 weeks ago 388MB
docker.elastic.co/elasticsearch/elasticsearch 7.7.1 830a894845e3 6 weeks ago 804MB
redis latest 44d36d2c2374 5 months ago 98.2MB
mysql 5.7 a1aa4f76fab9 13 months ago 373MB

3. docker 네트워크 생성

1
docker network create mongo-cluster-dev
1
2
3
docker network ls 명령어를 치게 되면 아래처럼 mongo-cluster-dev가 보임

fbcc93ab4ca3 mongo-cluster-dev bridge local

4. mongodb 컨테이너를 생성해보자 (터미널 3개를 열어서 해야한다 다른방법 아시는분?)

1
2
3
4
5
6
7
8
1번
docker run -p 20001:27017 --name mongo-dev1 --net mongo-cluster-dev mongo mongod --replSet mongo-replica

2번
docker run -p 20002:27017 --name mongo-dev2 --net mongo-cluster-dev mongo mongod --replSet mongo-replica

3번
docker run -p 20003:27017 --name mongo-dev3 --net mongo-cluster-dev mongo mongod --replSet mongo-replica

5. 정상적으로 컨테이너가 기동되었는지 확인

1
2
3
4
5
6
docker ps 명령어 입력하면 아래처럼 나온다

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7deb4a92e83b mongo "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:20003->27017/tcp mongo-dev3
ace5ceba26c4 mongo "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:20002->27017/tcp mongo-dev2
31ab9062e419 mongo "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:20001->27017/tcp mongo-dev1

6. mongodb replica setting하기

mongo-dev1 컨네이너 접속

1. mongon-dev1 컨테이너 접근

  • docker exec -it mongo-dev1 mongo

2. 디비 생성

  • db = (new Mongo(‘localhost:27017’)).getDB(‘beanbroker’)

3. replica set config

  • config = {“_id” : “mongo-replica”,”members” : [{“_id” : 0,”host” : “mongo-dev1:27017”},{ “_id” : 1, “host” : “mongo-dev2:27017”}, {“_id” : 2, “host” : “mongo-dev3:27017”}]}

4. 레플리카 실행

  • rs.initiate(config)

5. command c를 통해 나온다, 또는 터미널을 끄고 다시 킨다.

6. 설정되었는지 확인

  • docker exec -it mongo-dev1 mongo
    • mongo-replica:PRIMARY 접근시 PRIMARY라 나옴
  • docker exec -it mongo-dev2 mongo
    • mongo-replica:SECONDARY 접근시 SECONDARY라 나옴
  • docker exec -it mongo-dev3 mongo
    • mongo-replica:SECONDARY 접근시 SECONDARY라 나옴

7. 2번 3번에 접근 하여

1
2
3
4
5
db = (new Mongo('mongo-dev2:27017')).getDB('beanbroker')
db.setSlaveOk()

db = (new Mongo('mongo-dev3:27017')).getDB('beanbroker')
db.setSlaveOk()

8. 레플리카 정상 작동 확인 방법

2번 또는 3번에서 아래를 입력

1
db.mycollection.insert({name : 'test-data-beanbroker'})

당연히 안된다 slave 며 read만 가능한 노드이다.

1번에 접속하여 위의 insert 입력

1번 2번 3번에 접속하여

1
db.mycollection.find()

위를 입력하면 { “_id” : ObjectId(“5f0af7f488f68fcdd45f7b66”), “name” : “test-data-beanbroker” } 가 나온다

레플리카 셋팅완료

  • 마스터 노드에만 insert update가 작동한다
  • 슬레이브 노드들에서만 read만 된다.
  • 마스터 노드에 데이터 변경이 이뤄지었을 경우 slave로 전파 된다

아…. 스프링 연동을 하기전에 도커 셋팅하느라 시간이 다간다… 그냥 무료 mongodb 클라우드를 찾아서 직접 연동해야겠다. 다음 편에는 위처럼 안하고 무료 mongodb 클라우드 찾아서 편하게 스프링 연동하는 글을…. 작성하겠습니다.