;

[Docker] Docker MongoDB Replica Set 구축하기 본문

Programing

[Docker] Docker MongoDB Replica Set 구축하기

WindowsHyun 2024. 5. 2. 23:52
반응형

"AuthenticationFailed: SCRAM authentication failed, storedKey mismatch" 이런 오류가 날시 해결 방법 및 keyfile 만들기

 

Deploy New Replica Set With Keyfile Access Control — MongoDB Manual

Navigation This version of the documentation is archived and no longer supported. Deploy New Replica Set With Keyfile Access Control Overview Enforcing access control on a replica set requires configuring: For this tutorial, each member of the replica set

www.mongodb.com

openssl rand -base64 756 > /home/docker/mongo/keyfile
chmod 400 /home/docker/mongo/keyfile
  • "/home/ubuntu/mongo/keyfile"을 만들어 주시면 됩니다.

준비 사항

  • 머신 Primary(A), Secondary(B), Secondary(C) 총 3개의 머신을 준비합니다.
  • 위에 keyfile을 각 머신 Primary(A), Secondary(B), Secondary(C)에 동일하게 복사해줍니다.

1. Primary(A) 아래와 같이 폴더 및 docker-compse.yml을 만들어 줍니다.

  • 명령어
mkdir -p /home/docker/mongo
  • File : docker-compose.yml
version: '3'
services:
  mongo-primary:
    container_name: mongo
    image: mongo:7.0.9
    restart: always
    volumes:
      - /home/docker/mongo/data:/data/db
      - /home/docker/mongo/config:/data/configdb
      - /home/docker/mongo/keyfile:/data/keyfile
    environment:
      MONGO_INITDB_ROOT_USERNAME: "admin"
      MONGO_INITDB_ROOT_PASSWORD: "password"
    command: >
      /bin/sh -c "
        chmod 400 /data/keyfile &&
        chown 0:0 /data/keyfile &&
        mongod --replSet rs0 --auth --keyFile /data/keyfile --bind_ip_all"
    user: "0:0"
    network_mode: host

 

2. Secondary(B) 아래와 같이 폴더 및 docker-compse.yml을 만들어 줍니다.

  • 명령어
mkdir -p /home/docker/mongo
  • File : docker-compose.yml
version: '3'
services:
  mongo-secondary-read:
    container_name: mongo
    image: mongo:7.0.9
    restart: always
    volumes:
      - /home/docker/mongo/data:/data/db
      - /home/docker/mongo/config:/data/configdb
      - /home/docker/mongo/keyfile:/data/keyfile
    environment:
      MONGO_INITDB_ROOT_USERNAME: "admin"
      MONGO_INITDB_ROOT_PASSWORD: "password"
      USER_ID: 0
      GROUP_ID: 0
    command: >
      /bin/sh -c "
        chmod 400 /data/keyfile &&
        chown 0:0 /data/keyfile &&
        mongod --auth --keyFile /data/keyfile --replSet rs0 --bind_ip_all"
    user: "0:0"
    network_mode: host

 

3. Secondary(C) 아래와 같이 폴더 및 docker-compse.yml을 만들어 줍니다.

  • 명령어
mkdir -p /home/docker/mongo
  • File : docker-compose.yml
version: '3'
services:
  mongo-secondary-rw:
    container_name: mongo
    image: mongo:7.0.9
    restart: always
    volumes:
      - /home/docker/mongo/data:/data/db
      - /home/docker/mongo/config:/data/configdb
      - /home/docker/mongo/keyfile:/data/keyfile
    environment:
      MONGO_INITDB_ROOT_USERNAME: "admin"
      MONGO_INITDB_ROOT_PASSWORD: "password"
      USER_ID: 0
      GROUP_ID: 0
    command: >
      /bin/sh -c "
        chmod 400 /data/keyfile &&
        chown 0:0 /data/keyfile &&
        mongod --auth --keyFile /data/keyfile --replSet rs0 --bind_ip_all"
    user: "0:0"
    network_mode: host

 

4. Primary(A)에서 Replica Setting을 진행합니다.

  • Docker에서 Mongo 컨테이너에 접근합니다.
docker exec -it mongo /bin/bash
mongosh
  • root 계정을 생성해 주고 mongosh를 나와 줍니다.
use admin 
db.createUser({user: "admin", pwd: "password", roles: ["root"]})
exit
  • 다시 한번 mongosh를 root 계정을 사용해 연결을 해줍니다.
  • Replica Set을 진행해 줍니다.
mongosh -u admin -p password
rs.initiate()
rs.add("10.138.6.16:27017")
rs.add("10.138.6.17:27017")
  • Replica 정상적으로 되었는지 확인해 봅니다.
rs.status()

정상적으로 연결 되었을 경우 위와 같이 나옵니다.

5. Secondary(B)를 읽기모드로 변경 하는 방법

  • 명령어
# 읽기모드 적용방법
db.getMongo().setReadPref("secondary", [{host: "10.138.6.16", port: 27017}])
# 읽기모드 해제방법
db.getMongo().setReadPref("primary")

 

6. MongoDB 에서 연결하는 방법

  • 명령어
mongodb://admin:password@A:27017,B:27017,C:27017/?replicaSet=rs0&authMechanism=DEFAULT&authSource=admin

 

7. MongoDB 연결시 "getaddrinfo ENOTFOUND mongodb-01"와 같은 메시지가 나올 경우

  • 명령어
docker exec -it mongo /bin/bash
mongosh -u admin -p password

cfg = rs.conf()
members = cfg.members
for (let i=0; i<members.length; i++) {
  if (members[i]._id == 0) {
    members[i].host = "새로운호스트이름:27017"
  }
}
rs.reconfig(cfg)
  • 위 와 같이 "새로운호스트이름"에 ip 주소를 넣어주고 적용을 해주면 됩니다.

8. Replica Set 연결 해지 하기

  • 명령어
rs.remove("10.138.6.16:27017")
rs.remove("10.138.6.17:27017")
반응형
Comments