without haste but without rest

몽고디비 레플리카셋 구축하기 본문

Database/MongoDB

몽고디비 레플리카셋 구축하기

JinungKim 2021. 5. 11. 14:08

    복제 셋(replica set)을 구축하기 위한 단계는 다음과 같다.

 

  • 1. 각 노드에 몽고 디비 설치 (나는 전부 4.4.5로 버전으로 통일시켰다.)
  • 2. mongod.conf 설정
  • 3. 각 노드에서 몽고디비 실행
  • 4. Primary로 사용할 노드에서 복제 셋 설정 및 실행

1. 몽고 디비 설치

 

Install MongoDB Community Edition on Linux — MongoDB Manual

Install MongoDB > Install MongoDB Community Edition These documents provide instructions to install MongoDB Community Edition for supported Linux systems.For the best installation experience, MongoDB provides packages for popular Linux distributions. These

docs.mongodb.com

    몽고 디비 공식 문서는 설명이 굉장히 잘 되어 있다. 문서에서 시키는 대로만 하면 된다.

 


2. mongod.conf 설정


    mongod.conf 파일은 몽고 디비의 설정을 컨트롤하는 파일이다. 크게 디테일한 건 없으며 아래 코드 참조해서 변경하면 된다. (/etc/mongod.conf)

    아무래도 여러 노드들을 관리하다보니 데이터를 저장하는 dbpath는 전부 통일해주었다. 로그 저장은 기본 옵션에서 변경하지 않았다. (만약 컨테이너 기반으로 사용하고자 하는 경우 로그 디렉토리를 변경하거나 마운팅하는 게 좋을 것 같다.)

   port에서는 bindIp를 열어주어야 하는데, 보안이 상관없다면, 0.0.0.0을 지정해주고 그게 아니라면 현재 서버의 아이피와 복제 셋에 포함될 서버의 ip를 전부 추가해준다.

 

ex) bindIp: 127.0.0.1, secondary1, secondary2

net:
  port: 27017
  bindIp: 127.0.0.1, secondary1, secondary2

   

   복제 셋 설정은 이름만 간단히 설정해주었다.  security 옵션에 있는 autorization은 로그인 필수 여부에 대한 항목이며 keyFile은 인증 키의 path다.

 

  보안 설정은 여기서 다루지 않는다. "mongo db replica set auth & keyFile" 키워드로 검색하면 자료가 많이 나온다. 문제는 keyFile 권한 주는게 생각보다 잘 꼬이는지 badFile 에러를 해결하지 못해서 생략하고 진행했다.

# mongod.conf

# Where and how to store data.
storage:
  dbPath: /srv/mongo-rs/data/rs
  journal:
    enabled: true


# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0 


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

replication:
   replSetName: "mongo-rs"
   
   
#security:
  #authorization: enabled
  #keyFile: 


3. 각 노드에서 몽고 디비를 전부 실행한다.


    복제 셋에 포함시키고자 하는 모든 몽고디비를 아래 명령어로 실행한다. auth 설정을 진행하지 않았으므로 로그인 옵션은 주지 않는다.

sudo systemctl start mongod

 

 

    만약 auth 옵션을 사용한다면 초기에 admin 권한의 유저를 생성해야한다. 주의할 점은 몽고디비는 테이블마다 유저가 존재하므로 반드시 admin 테이블을 지정하고 유저를 생성해주어야 한다. 아래 코드 참조

use admin

db.createUser( {     
          user:'id', 
          pwd:'password', 
          roles: [ 
            { "role" : "userAdminAnyDatabase", "db" : "admin" }, 
            { "role" : "dbAdminAnyDatabase", "db" : "admin" }, 
            { "role" : "readWriteAnyDatabase", "db" : "admin" },
            { "role" : "clusterManager", "db" : "admin" },
          ] 
    }
)

4. Primary로 사용할 노드에서 복제 셋 설정 및 시작하기


    mongod.conf 파일에 복제 셋 설정을 주고 정상적으로 실행이 됐다면, 몽고디비 로그파일에 NotYetIntialize Replica Set과 유사한 로그가 보인다.

    Primary로 사용하고자 하는 노드의 몽고디비에 접속해서 아래와 같이 레플리카 셋에 대한 정보를 변수에 저장한다. _id는 mongod.conf에서 설정한 레플리카셋 명칭과 일치해야한다.

rsconf = {
    _id: "mongo-rs",
    member: [
        {_id: 0, host: "first.mongo:27017},
        {_id: 1, host: "second.mongo:27017},
        {_id: 2, host: "third.mongo:27017},
    ]
}

 

    이제 아래 명령어로 복제 셋을 시작할 수 있다.

rs.initiate(rsconf)

 

   설정한 복제 셋(레플리카 셋) 상태는 아래 명령어로 확인할 수 있다.

rs.status()

 

Appendix

    복제 셋을 구축하고 나서는 rs.add(), rs.remove(), re.stepDown() 등의 명령어를 이용해서 복제 셋을 추가, 삭제, 권한 조정을 진행할 수 있다. 자세한 정보는 아래 문서에서 참조

 

 

Replication Reference — MongoDB Manual

Allows read operations on secondary members for the MongoDB connection.

docs.mongodb.com

 

Comments