모종닷컴

[MongoDB] Replication 본문

Programming/데이터베이스

[MongoDB] Replication

모종 2022. 10. 18. 21:37
반응형

MongoDB 준비

MongoDB replication 세팅을 위해서는 2개 이상의 몽고 인스턴스가 필요합니다. 문서를 보면 일반적으로는 3개의 인스턴스로 구성하는 게 가장 일반적인 설정인 것 같습니다. 

https://www.mongodb.com/docs/v6.0/replication/

테스트 편의를 위해 도커를 사용하도록 하겠습니다. 도커가 없다면 로컬에 몽고DB 인스턴스를 3개 준비해주셔도 무방 할 겁니다.

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

위의 스크립트를 복해서 docker-compose.yml 파일을 만들어주시면 됩니다. 저는 USER_HOME/docker_script/mongo_replication 디렉터리를 만들고 해당 디렉터리에 파일을 생성해주었습니다.

docker 앱을 실행시켜줍니다. 그리고 파일이 있는 디렉토리에 가서 아래 명령어로 docker-compose를 실행해줍시다.

docker compose up -d

위의 명령어를 실행시키고 난 뒤 mongodb 인스턴스 3개가 도커로 띄워져 있는지 확인해주세요.

docker ps

이제 mongodb에 아래 설정을 통해 replication 구성을 마무리하도록 하겠습니다.

# mongodb 접속
mongo --port 30000

# config 
config = {"_id": "replset", "members": [{"_id":0, "host": "mongo-1:30000"},{"_id":1, "host": "mongo-2:30001"},{"_id":2, "host": "mongo-3:30002"}]}

# 설정 적용
rs.initiate(config)

이제 replication 세팅이 끝이 났습니다.

Host 등록해주기

저는 앞으로도 이 replication 된 몽고를 사용해야 하기 때문에 미리 host(경로 /etc/hosts)에 아래와 같이 등록을 해주었습니다.

127.0.0.1 mongo-1
127.0.0.1 mongo-2
127.0.0.1 mongo-3

테스트

replication이 제대로 구성되었다면 이제 데이터를 하나 넣고 나머지 인스턴스에도 제대로 데이터가 존재하는지 확인해보면 될 것 같습니다. terminal을 열고 mongo-1(port= 30000), mongo-2(port=30001)에 접속합니다. 각각 인스턴스에 해당 명령어들을 통해 replication이 되는지 확인하면 완료입니다.

mongo-1

# connect mongo-1
mongo --port 30000

# create database and use it
use test

# create collection and insert data
db.user.insert({'name':'mojong'})

# find
db.user.find()

mongo-2

# connect mongo-2
mongo --port 30001

# enable read operations on replica set’s secondary node
rs.slaveOk()

use test

db.user.find()

 

반응형