단계별 가이드: 기본 MongoDB 샤드 클러스터 배포하기
구성 서버, 샤드 복제 세트, mongos 라우터 및 샤딩 확인을 포함한 기본 MongoDB 샤드 클러스터를 배포합니다.
단계별 가이드: 기본 MongoDB 샤드 클러스터 배포하기
MongoDB는 인기 있는 NoSQL 문서 데이터베이스로, 높은 성능과 유연성으로 대량의 데이터를 처리하는 데 탁월합니다. 그러나 데이터가 증가함에 따라 단일 서버나 복제 세트는 확장 한계에 도달할 수 있습니다. 이때 샤딩이 필요하며, 데이터를 여러 서버(샤드)에 분산하여 수평적 확장성을 가능하게 합니다.
이 가이드는 학습 목적으로 localhost에서 기본 MongoDB 샤드 클러스터를 설정하는 과정을 안내합니다. 구성 서버, 샤드 복제 세트, mongos 라우터를 구성한 후 컬렉션에 대해 샤딩을 활성화합니다.
MongoDB 샤드 클러스터 이해하기
MongoDB 샤드 클러스터는 데이터를 분산하고 라우팅하기 위해 함께 작동하는 세 가지 주요 구성 요소로 구성됩니다:
- 샤드 복제 세트: 실제 데이터를 보유하는 노드입니다. 각 샤드는 고가용성과 데이터 중복성을 제공하는 복제 세트입니다. 데이터는 이러한 샤드에 분할됩니다.
- 구성 서버(Config Servers): 클러스터의 메타데이터(데이터 청크와 샤드 간의 매핑)를 저장합니다. MongoDB 3.2부터 구성 서버는 고가용성과 일관성을 위해 복제 세트(CSRS - Config Server Replica Set)로 배포되어야 합니다.
mongos라우터: 쿼리 라우터 역할을 하여 클라이언트 애플리케이션에 인터페이스를 제공합니다.mongos인스턴스는 클러스터 메타데이터를 기반으로 클라이언트 작업을 적절한 샤드로 전달합니다. 애플리케이션은 샤드에 직접 연결하지 않고mongos에 연결합니다.
MongoDB 샤드 클러스터의 개념적 다이어그램(이미지 출처: MongoDB 공식 문서)
사전 요구 사항
시작하기 전에 다음 사항이 준비되었는지 확인하세요:
- 여러 대의 머신/VM: 실제 분산 샤드 클러스터를 위해서는 최소 6-9대의 머신/VM/Docker 컨테이너가 필요합니다. 이 기본 튜토리얼에서는 다른 포트를 사용하여 단일 머신에서 시뮬레이션할 수 있지만, 프로덕션 환경에서는 전용 리소스가 필요합니다.
- 구성 서버 3대 (configSrv01, configSrv02, configSrv03)
- 각 샤드에 최소 2-3대 (예: Shard01-RS01, Shard01-RS02, Shard01-RS03; Shard02-RS01, ...)
mongos라우터 1대 이상
- MongoDB 설치:
mongod또는mongos를 호스팅할 모든 머신에 지원되는 MongoDB 서버 버전을 설치하세요. 셸 명령에는mongosh를 사용하세요. - 네트워킹: 모든 머신이 필요한 포트(기본적으로 구성 서버, 샤드,
mongos에 대해 각각27017,27018,27019,27020또는 사용자 정의 포트)를 통해 서로 통신할 수 있는지 확인하세요. - 디렉토리 구조: 각
mongod및mongos인스턴스에 대해 전용 데이터 및 로그 디렉토리를 생성하세요.
이 가이드에서는 단순화를 위해 localhost와 다른 포트 및 디렉토리를 사용합니다. 프로덕션 환경에서는 실제 호스트 이름이나 IP 주소를 사용해야 합니다.
권장 디렉토리 구조 (localhost 설정 예시)
mkdir -p /data/db/configdb01 /data/db/configdb02 /data/db/configdb03
mkdir -p /data/db/shard01-rs01 /data/db/shard01-rs02 /data/db/shard01-rs03
mkdir -p /data/db/shard02-rs01 /data/db/shard02-rs02 /data/db/shard02-rs03
mkdir -p /data/log/config /data/log/shard01 /data/log/shard02 /data/log/mongos
배포 단계
1단계: 구성 서버 설정 (Config Replica Set)
구성 서버는 샤드 클러스터의 메타데이터를 저장합니다. 복제 세트로 실행되어야 합니다.
구성 서버용
mongod인스턴스 시작: 각 인스턴스는--configsvr및--replSet옵션이 필요합니다.# 구성 서버 1 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb01 --port 27019 --bind_ip localhost --logpath /data/log/config/configdb01.log --fork # 구성 서버 2 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb02 --port 27020 --bind_ip localhost --logpath /data/log/config/configdb02.log --fork # 구성 서버 3 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb03 --port 27021 --bind_ip localhost --logpath /data/log/config/configdb03.log --fork팁: 프로덕션에서는
localhost를 실제 IP 주소나 호스트 이름으로 바꾸세요.Config Replica Set 초기화: 구성 서버 인스턴스 중 하나에 연결하여 복제 세트를 초기화합니다.
mongosh --port 27019mongo 셸 내부:
rs.initiate({ _id: "cfgReplSet", configsvr: true, members: [ { _id : 0, host : "localhost:27019" }, { _id : 1, host : "localhost:27020" }, { _id : 2, host : "localhost:27021" } ] });상태 확인:
rs.status();
2단계: 샤드 복제 세트 설정
클러스터의 각 샤드는 복제 세트입니다. 각각 세 개의 멤버로 구성된 두 개의 샤드(shard01 및 shard02)를 설정하겠습니다.
샤드 1 멤버용
mongod인스턴스 시작: 각 인스턴스는--shardsvr및--replSet옵션이 필요합니다.# 샤드 1 멤버 1 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs01 --port 27030 --bind_ip localhost --logpath /data/log/shard01/shard01-rs01.log --fork # 샤드 1 멤버 2 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs02 --port 27031 --bind_ip localhost --logpath /data/log/shard01/shard01-rs02.log --fork # 샤드 1 멤버 3 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs03 --port 27032 --bind_ip localhost --logpath /data/log/shard01/shard01-rs03.log --fork샤드 1 복제 세트 초기화: 샤드 1 인스턴스 중 하나에 연결합니다.
mongosh --port 27030mongo 셸 내부:
rs.initiate({ _id : "shard01", members: [ { _id : 0, host : "localhost:27030" }, { _id : 1, host : "localhost:27031" }, { _id : 2, host : "localhost:27032" } ] });샤드 2 멤버용
mongod인스턴스 시작 (추가 샤드에 대해 반복):# 샤드 2 멤버 1 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs01 --port 27040 --bind_ip localhost --logpath /data/log/shard02/shard02-rs01.log --fork # 샤드 2 멤버 2 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs02 --port 27041 --bind_ip localhost --logpath /data/log/shard02/shard02-rs02.log --fork # 샤드 2 멤버 3 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs03 --port 27042 --bind_ip localhost --logpath /data/log/shard02/shard02-rs03.log --fork샤드 2 복제 세트 초기화: 샤드 2 인스턴스 중 하나에 연결합니다.
mongosh --port 27040mongo 셸 내부:
rs.initiate({ _id : "shard02", members: [ { _id : 0, host : "localhost:27040" }, { _id : 1, host : "localhost:27041" }, { _id : 2, host : "localhost:27042" } ] });
3단계: mongos 라우터 설정
mongos 인스턴스는 클라이언트 애플리케이션의 진입점입니다. 구성 서버의 위치를 알아야 합니다.
mongos인스턴스 시작:--configdb옵션을 제공하여 구성 복제 세트 멤버를 나열합니다.# Mongos 라우터 1 mongos --configdb cfgReplSet/localhost:27019,localhost:27020,localhost:27021 --port 27017 --bind_ip localhost --logpath /data/log/mongos/mongos01.log --fork참고: 로드 밸런싱 및 고가용성을 위해 여러
mongos인스턴스를 시작할 수 있습니다. 모두 동일한 구성 서버에 연결됩니다.
4단계: mongos에 연결하고 샤드 추가
이제 mongos 인스턴스에 연결하고 샤드 복제 세트를 클러스터에 추가합니다.
mongos에 연결: 기본 MongoDB 포트27017또는mongos에 지정한 사용자 정의 포트를 사용합니다.mongosh --port 27017샤드 추가:
sh.addShard()명령을 사용하여 복제 세트 이름과 멤버 중 하나를 지정합니다.sh.addShard("shard01/localhost:27030"); sh.addShard("shard02/localhost:27040");
5단계: 데이터베이스 및 컬렉션에 대해 샤딩 활성화
샤드가 추가되면 특정 데이터베이스와 해당 데이터베이스 내의 특정 컬렉션에 대해 샤딩을 활성화해야 합니다. 이를 위해서는 샤드 키를 선택해야 합니다.
데이터베이스에 대해 샤딩 활성화: 샤딩하려는 데이터베이스로 전환하고
sh.enableSharding()을 실행합니다.use mydatabase; sh.enableSharding("mydatabase");컬렉션 샤딩:
샤드 키를 선택하고sh.shardCollection()을 사용합니다.경고: 효과적인 샤드 키를 선택하는 것은 성능과 균등한 분배에 매우 중요합니다. 잘못된 샤드 키는 핫스팟이나 비효율적인 쿼리를 초래할 수 있습니다. 일반적인 전략에는 해시 키, 범위 키 또는 복합 키가 있습니다.
이 예제에서는
_id필드가 있는mycollection컬렉션을 가정합니다.sh.shardCollection("mydatabase.mycollection", { _id: "hashed" });해시된
_id샤드 키는 단조 증가하는 범위_id키보다 삽입을 샤드 전체에 더 잘 분산시키기 때문에 튜토리얼에 적합합니다. 실제 애플리케이션에서는 편의성보다는 쿼리 패턴과 쓰기 분배를 기반으로 샤드 키를 선택하세요.
6단계: 클러스터 확인
mongos에 연결된 mongosh에서 다음 명령을 실행합니다:
sh.status();
db.adminCommand({ listShards: 1 });
그런 다음 샘플 문서를 삽입하고 샤딩된 컬렉션이 존재하는지 확인합니다:
use mydatabase;
db.mycollection.insertMany([
{ _id: 1, name: "alpha" },
{ _id: 2, name: "beta" },
{ _id: 3, name: "gamma" }
]);
db.mycollection.getShardDistribution();
작은 테스트 데이터 세트는 즉시 분할되지 않을 수 있으므로 몇 개의 문서만으로 완벽한 분배를 기대하지 마십시오. 중요한 첫 번째 확인은 sh.status()가 두 샤드를 모두 나열하고 mydatabase.mycollection이 샤딩된 것으로 표시되는지 확인하는 것입니다.
프로덕션 참고 사항
이 localhost 설정은 구성 요소를 학습하는 데 유용하지만, 프로덕션에서는 더 많은 주의가 필요합니다:
- 복제 세트 멤버 이름이 클러스터 메타데이터에 저장되므로
localhost대신 실제 호스트 이름을 사용하세요. - 구성 서버를 세 멤버 복제 세트로 실행하세요.
- 각 샤드를 장애 도메인에 분산된 멤버로 구성된 복제 세트로 실행하세요.
- 클러스터를 노출하기 전에 인증 및 내부 키파일 또는 x.509 인증을 활성화하세요.
- 클러스터 인식 백업 계획의 일부로 구성 서버 메타데이터와 샤드 데이터를 백업하세요.
- 청크 분배, 밸런서 활동, 복제 지연 및 디스크 증가를 모니터링하세요.
최종 요약
MongoDB 샤드 클러스터는 세 가지 역할을 수행합니다: 구성 서버는 메타데이터를 추적하고, 샤드 복제 세트는 데이터를 저장하며, mongos는 클라이언트 트래픽을 라우팅합니다. 먼저 이러한 역할이 작동하도록 한 다음, 샤드 키 설계에 대부분의 시간을 투자하세요. 이 선택이 클러스터가 부하를 깔끔하게 분산하는지 아니면 핫 샤드를 생성하는지를 결정하기 때문입니다.