lahuman 2021. 2. 22. 18:04
728x90

오랜만에 MongoDB를 설치해야 할 일이 생겼습니다.

기존의 MongoDB를 이전설치해야 할 일이 발생했습니다. 기존의 경우 shard와 mongos(router)로 사용했지만, sharding을 하지 않아서 P(Primary)-S(slave)-S(slave) 형식으로 구성하기로 했습니다.

하위 내용을 4.4 번의 AWS LINUX 기준으로 작성되었습니다.

1. repo 파일 생성

root 계정으로 mongodb-org-4.4.repo파일을 생성하고 다음 내용을 작성합니다.

vi /etc/yum.repos.d/mongodb-org-4.4.repo

[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc

2. mongoDB 설치

yum 명령어로 mongoDB 4.4를 설치 합니다.

yum install -y mongodb-org

3. mongodb 설정파일 셋팅

설치 기준 디렉토리를 /applications/으로 잡아서 진행하였습니다.

기준 디렉토리 생성

mkdir /applications
cd /applications
mkdir mongodb
cd mongodb
mkdir config
mkdir log
mkdir data

mongod.conf 설정 파일 생성

replication > replSetName 은 Replica Set 구성을 위해서 P-S 모두 동일 해야 합니다. 접근 port는 27019로 설정했습니다.

vi /applications/config/mongod.conf

systemLog:
   destination: file
   path: "/applications/mongodb/log/mongod.log"
   logAppend: true
   logRotate: rename
storage:
   engine: wiredTiger
   directoryPerDB: true
   wiredTiger:
      engineConfig:
         journalCompressor: snappy
      collectionConfig:
         blockCompressor: snappy
      indexConfig:
         prefixCompression: true
   dbPath: "/applications/mongodb/data"
   journal:
      enabled: true
      commitIntervalMs: 300
processManagement:
   fork: true
   pidFilePath: "/tmp/mongod.pid"
net:
   port: 27019
   bindIpAll: true
   maxIncomingConnections: 20000
   unixDomainSocket:
      enabled: false
replication:
    oplogSizeMB: 10240
    replSetName: "replset"

4. mongodb 시작하기

다음 명령어로 MongoDB 데몬을 실행합니다.

mongod -f /applications/mongodb/config/mongod.conf 

만약 아래와 같은 경고가 발생한다면,

MongoDB server version: 4.4.3
---
The server generated these startup warnings when booting:
        2021-02-08T11:18:39.873+09:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
        2021-02-08T11:18:39.873+09:00: Soft rlimits too low
        2021-02-08T11:18:39.873+09:00:         currentValue: 8192
        2021-02-08T11:18:39.873+09:00:         recommendedMinimum: 64000

root 계정으로 /etc/security/limits.conf 파일에 다음과 같이 변경하세요.

vi /etc/security/limits.conf

*               soft    nproc   1024000
*               hard    nproc   1024000
*               -       nofile  64000

변경이 완료 되었다면 재기동을 하여서 변경내역을 반영하세요.

shutdown -r now

5. Replica Set 구성하기

Primary로 생각한 서버에서 다음의 명령어로 mongo shell에 접근하세요

mongo localhost:27019/admin

다음 명령어로 Replica Set을 설정합니다.

rs.initiate(
           {
      _id: "replset", // config 에서 설정했던, replSetName 입니다.
      version: 1,
      members: [
         { _id: 0, host : "<primaryIP>:<PORT>" },
         { _id: 1, host : "<SecondaryIP>:<PORT>" },
         { _id: 2, host : "<SecondaryIP>:<PORT>" },
      ]
   }
)

# 결과 

{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1612755725, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1612755725, 1)

성공이후에는 mongo shell에서 "replset:PRIMARY > " 혹은 "replset:SECONDARY> " 으로 표기 됩니다.

6. 계정 생성하기

이후 로그인 처리를 위해서 root 권한을 가진 계정을 mongo shell에서 생성합니다.

use admin
db.createUser(
   {
     user: "rootUser",
     pwd: "rootPass",
     roles: ["root"]
   }
)

7. mongoDB 인증모드 설정

꼭 계정을 생성 후에 인증모드를 설정해야 합니다.

7.1 key 파일 생성하기

key 파일이 없을 경우 올바른 인증이 되지 않아서 Replica Set에 참여가 되지 않습니다.
openssl 명령어를 이용해서 key 파일을 생성합니다.
생성된 키는 최소한의 권한만 가지도록 합니다.

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

생성된 파일은 모든 서버에 복제합니다.

7.2 key 파일 설정과 security 활성화 하기

/applications/mongodb/config/mongod.conf 파일 하단에 아래 내용을 추가 합니다.

그리고 모든 mongoDB 서버를 재기동 합니다.

/applications/mongodb/config/mongod.conf

security:
    authorization: enabled
    keyFile: <path-to-keyfile>

7.3 로그인 해보기

모든 처리가 완료 되었다면, 로그인을 해봅니다.

mongo --port 27019 -u "rootUser" -p

또는 

mongo localhost:27019/admin
db.auth('rootUser', 'rootPass');

마치며

이전에 keyFile을 설정 하지 못해서 삽질을 한적이 있는데.. 이번에 다시 정리하면서 확실하게 이해했습니다.

참고자료

728x90