Cloud Engineering/Docker ๐Ÿณ

[MongoDB] Ubuntu ์—์„œ Docker Compose๋กœ MongoDB ReplicaSet ๊ตฌ์„ฑํ•˜๊ธฐ

minjiwoo 2023. 6. 18. 17:35
728x90

ํ”„๋กœ์ ํŠธ์—์„œ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์— ์žˆ๋Š” MongoDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ AWS DMS ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ S3๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค..!! DMS CDC ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ์œ„ํ•ด์„œ mongoDB ๋ ˆํ”Œ๋ฆฌ์นด ์…‹์„ ๊ตฌ์ถ•ํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. 


MongoDB ReplicaSet ์ด๋ž€ ?

Replica Set์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋„ ๋“ฑ์žฅํ•˜๋Š”๋ฐ, Mongo DB์—์„œ๋Š” ๊ด€์ ์ด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์…‹์„ ์ €์žฅํ•˜๊ณ  ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ํด๋Ÿฌ์Šคํ„ฐ์ด๋‹ค. Replica Set์„ ๊ตฌ์„ฑํ•ด์„œ, ํ•˜๋‚˜์˜ ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ์ผ์–ด๋‚˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์…‹์„ ์šด์˜ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Replica Set ์˜ ํŒจํ„ด 

MongoDB์—์„œ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ๊ตฌ์„ฑํ•˜๋Š” ํŒจํ„ด์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€์ด๋‹ค. 

1. PSS (Primary - Secondary - Secondary) ๊ตฌ์„ฑ 

 

๋ง๊ทธ๋Œ€๋กœ primary node 1๊ฐœ, secondary node 2๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ตฌ์„ฑ์ด๋‹ค. Primary Node ์—์„œ ์–ด๋– ํ•œ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๋ฉด oplog์— ์ž‘์—… ๋กœ๊ทธ๊ฐ€ ์ €์žฅ๋œ๋‹ค. Secondary Node ๋Š” oplog ๋ฅผ ๋ณด๊ณ  ์ž‘์—…์„ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

2. PSA (Primary - Secondary - Arbiter) ๊ตฌ์„ฑ 

Arbiter Node 

Arbiter Node ๋Š” Primary Node ๋‚˜ Secondary Node์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ €์žฅํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ Primary , Secondary์— ๋น„ํ•ด ์‚ฌ์–‘์ด ๋‚ฎ์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. Arbiter ๋Š” Primary Node์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ด์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ๋‚จ์•„์žˆ๋Š” Secondary Node๋“ค ์ค‘์—์„œ Primary Node ์—ญํ• ์„ ๋ˆ„๊ฐ€ ์ˆ˜ํ–‰ํ• ์ง€ ์ •ํ•˜๋Š” 'Election'์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 


Docker Compose ๋กœ MongoDB ReplicaSet ๊ตฌ์„ฑํ•˜๊ธฐ 

์‚ฌ์ „ ์ค€๋น„๋ฌผ : docker, docker compose ์„ค์น˜ 

MongoDB ๋ ˆํ”Œ๋ฆฌ์นด ์…‹ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ง์ ‘ ์ธ์Šคํ„ด์Šค ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋„์›Œ์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ docker copmose๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๊ตฌ์„ฑ, ์„ค์น˜, ๊ด€๋ฆฌํ•˜๋ฉด ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์„œ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. Docker Compose ๋Š” yaml ํŒŒ์ผ (docker-copmose.yml)๋กœ ๋„์ปค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ด๋‹ค.  

docker ์™€ docker compose ๋ฅผ ์„ค์น˜ํ•˜๊ณ , docker ๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก bridge type์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ•˜๋‚˜ ๊ตฌ์„ฑํ•œ๋‹ค !! 

$ sudo docker network create mongoCluster

๋„คํŠธ์›Œํฌ๊ฐ€ ์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•œ๋‹ค. 

$ sudo docker network ls

 

mongoDB ๋ ˆํ”Œ๋ฆฌ์นด์…‹์— ์ฐธ์—ฌํ•œ node๋“ค ๋ผ๋ฆฌ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, key ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋‹ค. key ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ๊ถŒํ•œ์„ chmod 400์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. 

$ openssl rand -base64 756 > mongodb.key
$ chmod 400 mongodb.key
$ ls -ld mongodb.key
-r-------- 1 ubuntu ubuntu 1024 Jun 16 05:21 mongodb.key

 

docker-compose.yml ํŒŒ์ผ ๊ตฌ์„ฑํ•˜๊ธฐ 

version: '3.5'
services:  
  mongo1:
    image: mongo:latest
    hostname: mongo1
    container_name: mongo1 # primary node 
    restart: always 
    environment: # MongoDB root ๊ณ„์ • & ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • 
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 1234
    ports:
      - 27017:27017
    volumes:
      - ./data/db/replica/mongo1:/data/db
      - ./mongodb.key:/etc/mongodb.key
    entrypoint:
      - bash 
      - -c
      - |
          chmod 400 /etc/mongodb.key
          chown 999:999 /etc/mongodb.key
          exec docker-entrypoint.sh $$@
    command: "mongod --bind_ip_all --replSet myReplicaSet --keyFile /etc/mongodb.key"
  mongo2:
    image: mongo:latest
    hostname: mongo2
    container_name: mongo2 # secondary node (1)
    restart: always # ์ปจํ…Œ์ด๋„ˆ ์ •์ฑ… ์„ค์ • - ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ restart ํ•˜๊ธฐ 
    environment:
      MONGO_INITDB_ROOT_USERNAME: root 
      MONGO_INITDB_ROOT_PASSWORD: 1234
    depends_on:
      - mongo1
    ports: # ์™ธ๋ถ€์—์„œ 27018 ํฌํŠธ๋กœ ์ ‘์†ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ 27017 ํฌํŠธ๋กœ ํฌํŠธํฌ์›Œ๋”ฉ 
      - 27018:27017
    volumes:
      - ./data/db/replica/mongo2:/data/db
      - ./mongodb.key:/etc/mongodb.key
    entrypoint:
      - bash
      - -c
      - |
          chmod 400 /etc/mongodb.key
          chown 999:999 /etc/mongodb.key
          exec docker-entrypoint.sh $$@
    command: "mongod --bind_ip_all --replSet myReplicaSet --keyFile /etc/mongodb.key"
  mongo3:
    image: mongo:latest
    hostname: mongo3
    container_name: mongo3 # secondary node (2)
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 1234
    depends_on:
      - mongo2
    ports:
      - 27019:27017 # ์™ธ๋ถ€์—์„œ 27018 ํฌํŠธ๋กœ ์ ‘์†ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ 27017 ํฌํŠธ๋กœ ํฌํŠธํฌ์›Œ๋”ฉ 
    volumes: # key ํŒŒ์ผ ๋งˆ์šดํŠธ ํ•˜๊ธฐ && mongoDB ์ €์žฅ ๊ณต๊ฐ„ ๋งˆ์šดํŠธ ํ•˜๊ธฐ 
      - ./data/db/replica/mongo3:/data/db
      - ./mongodb.key:/etc/mongodb.key
    entrypoint: # key ํŒŒ์ผ ๊ถŒํ•œ ์„ค์ • 
      - bash
      - -c
      - |
          chmod 400 /etc/mongodb.key
          chown 999:999 /etc/mongodb.key
          exec docker-entrypoint.sh $$@
    command: "mongod --bind_ip_all --replSet myReplicaSet --keyFile /etc/mongodb.key"
networks:
  default:
    name: mongoCluster

 

docker-compose.yml ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰์‹œํ‚จ๋‹ค. 

$ sudo docker-compose up -d

 

Docker-Compose.yml ํŒŒ์ผ ์„ค๋ช… 

IP Binding 

--bind_ip ์˜ต์…˜์€ MongoDB ๋ ˆํ”Œ๋ฆฌ์นด์…‹์— ์ฐธ์—ฌํ•˜๋Š” ๋…ธ๋“œ๋“ค ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ๋ชจ๋“  ip ์—์„œ listen ์ƒํƒœ๋กœ ๋Œ€๊ธฐ์‹œํ‚ค๋Š” ์„ค์ •์ด๋‹ค. 

mongodb.key Permission 

entrypoint:
      - bash 
      - -c
      - |
          chmod 400 /etc/mongodb.key
          chown 999:999 /etc/mongodb.key
          exec docker-entrypoint.sh $$@

๋ ˆํ”Œ๋ฆฌ์นด ์…‹์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋‚ ๋ฆฌ๊ธฐ ์ „์— key ํŒŒ์ผ ํผ๋ฏธ์…˜์„ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ mongoDB๊ฐ€ key ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ ๋ ˆํ”Œ๋ฆฌ์นด ์…‹์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

primary node ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

mongo1 ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•œ ํ›„ , ๋ ˆํ”Œ๋ฆฌ์นด ์…‹์˜ primary node ๋กœ ์ดˆ๊ธฐํ™” ์ง„ํ–‰ํ•œ๋‹ค. 

 

$ sudo docker exec mongo1 -it /bin/bash 
$ rs.initiate()
728x90