안녕하세요 대무무입니다.
오늘은 Mongo DB 를 Docker 로 설치 및 운영하는 방법에 대해 소개하려 합니다.
MongoDB? Replica-Set?
MongoDB: 애플리케이션 데이터 플랫폼
업계 최고의 최신 데이터베이스를 토대로 구축된 애플리케이션 데이터 플랫폼을 사용해 아이디어를 더욱 빠르게 실현하세요. MongoDB는 데이터를 손쉽게 처리할 수 있도록 지원합니다.
www.mongodb.com
Mongo DB 는 Document 기반 NoSQL 데이터베이스 입니다. Relational DBMS 가 아니고 SQL 기반이 아니며 스키마가 고정되어 있지 않고 Json 형태의 동적 스키마 구조를 가집니다. MongoDB 에서는 이를 BSON(Binary Json) 이라는 독자적 형식을 사용하며 데이터가 이진(Binary) 형태로 저장됩니다. Mongo DB 에서는 가장 기본적인 데이터 구조를 Document 라 부르며 RDBMS 의 Row 에 해당합니다. Document 들의 모음을 Collection 이라 부르며 RDBMS 에서는 Table 에 해당합니다. Collection 의 모음을 DB 라 부르며 RDBMS 에서 DB 와 동일합니다.
OpenAI ChatGPT 는 Mongo DB 의 특징에 대해 다음과 같다고 알려주네요.
MongoDB 는 오픈 소스 기반으로 무료로 이용이 가능한데 라이센스로 보면 SSPL(Server Side Public License) 입니다. 기존에는 AGPL 이었다가 SSPL 로 변경된 것 같은데 MongoDB 블로그에 게시된 이유를 살펴보니 다음과 같았습니다 (Strip-Mining).
- AGPL 라이센스는 배포의 경우 서버 쪽 소스를 공개하는 의무사항이 클라우드 서비스(Amazon DocumentDB, ...) 에서의 해당 서비스 제공이 소스 공개의 의무에 해당하는지에 대한 논란의 소지가 있어서 명확하게 하기 위함
- 클라우드 서비스 업체(AWS, ...)에서 오픈소스 커뮤니티에 Contribution 을 하지 않고 이익 창출을 하는데 있어서의 비판
정리하자면 MongoDB 소스코드를 수정해서 배포하거나 서비스를 하는 경우 라이센스 위반으로 보입니다. 그대로 사용하는 건 문제 없어보여요.
Replica-Set 은 데이터의 안정성과 가용성을 확보하기 위한 전략 중 하나로 서비스(여기서는 mongoDB 가 되겠죠)를 여러개 실행시켜(scale-out) 하는 Primary 로 설정하고 나머지는 Secondary 로 설정합니다. Primary 는 Write 작업을 진행하고 작업의 결과를 자기 자신에게도 적용하고 Secondary 에게도 적용하는 역할(복제)을 합니다. Secondary 는 Read 를 지원하며 Primary 가 될 수 있는 자격을 가집니다. 그래서 Primary 가 어떤 이유로 고장이 난 경우 Secondary 중 하나가 Primary 가 되어 역할을 지속합니다.
해당 설명에서는 Docker Container 로 Scale Out 하여 Replica-Set 을 구성하겠습니다. 현 구성은 고가용성(High-Availablity) 보다는 Replica 에 초점을 맞추는 것으로 이해하시면 되겠습니다.
어떻게 구축해?
Docker-Compose 를 사용하여 Primary 서비스 1개, Secondary 서비스 2개로 구축하겠습니다.
Docker-Compose
version: '3.8'
services:
mongoPrimary:
image: mongo:latest
hostname: mongoPrimary
container_name: mongoPrimary
restart: unless-stopped
ports:
- 27017:27017
volumes:
- ./data/primary:/data/db
command:
- '--replSet'
- 'rs0'
- '--bind_ip_all'
mongoSecondary1:
image: mongo:latest
hostname: mongoSecondary1
container_name: mongoSecondary1
restart: unless-stopped
depends_on:
- mongoPrimary
ports:
- 27018:27017
volumes:
- ./data/secondary1:/data/db
command:
- '--replSet'
- 'rs0'
- '--bind_ip_all'
mongoSecondary2:
image: mongo:latest
hostname: mongoSecondary2
container_name: mongoSecondary2
restart: unless-stopped
depends_on:
- mongoPrimary
- mongoSecondary1
ports:
- 27019:27017
volumes:
- ./data/secondary2:/data/db
command:
- '--replSet'
- 'rs0'
- '--bind_ip_all'
networks:
default:
name: mongoCluster
- docker-compose.yml 디렉토리에 data 디렉토리가 mongo DB 모든 데이터가 존재하는 위치이며 data 폴더 하위에는 각 노드들 간의 데이터 디렉토리(primary, secondary1, secondary2) 가 위치한다.
- mongoSecondary1, mongoSecondary2 컨테이너는 mongoPrimary 컨테이너를 의존하며 mongoSecondary2 는 mongoSecondary1 또한 의존한다.
- 각 서비스 노드에서는 Replica-Set 설정을 위한 --replSet 명령을 통해 rs0 라는 이름의 Replica-Set 을 구성하였음.
다음 명령을 통해 컨테이너들을 켭니다.
$ sudo docker-compose up -d
이후 명령을 통해 mongoPrimary 컨테이너에 접속하고 Replica-Set 구성 명령(rs.initiate ...)을 실행해줍니다.
$ sudo docker exec -it mongoPrimary bash
root@mongoPrimary:/# mongosh
...
rs0 [direct: primary] test> rs.initiate({
_id: "rs0",
members: [
{_id: 0, host: "mongoPrimary"},
{_id: 1, host: "mongoSecondary1"},
{_id: 2, host: "mongoSecondary2"}
]
});
이후 mongoDB Client(MongoDB Compass) 를 통해 다음과 같은 URL 로 접속하면 됩니다.
mongodb://[SERVER_ADDRESS]:27017/?directConnection=true
Reference
'인프라' 카테고리의 다른 글
[게임 / Docker] 설날 기념! 팰월드 서버 Docker 로 운영하기 (0) | 2024.02.09 |
---|---|
[인프라 / Docker] Docker Container 통합 로그 뷰어 Dozzle (0) | 2024.01.10 |
[인프라 / Docker] 나만의 전자 도서관 Calibre-Web (1) | 2024.01.04 |
[인프라 / VPN] Tailscale 유사 Site-to-Site 설정(Subnet Router) (1) | 2024.01.03 |
[인프라 / VPN] Tailscale 설명 및 간단 사용 방법 (1) | 2024.01.01 |