단계별 가이드: 기본 MongoDB 샤딩 클러스터 배포
인기 있는 NoSQL 문서 데이터베이스인 MongoDB는 대량의 데이터를 고성능과 유연성으로 처리하는 데 탁월합니다. 하지만 데이터가 증가함에 따라 단일 서버나 복제본 세트는 확장 한계에 도달할 수 있습니다. 이때 샤딩이 중요한 역할을 하며, 데이터를 여러 서버 또는 샤드로 분산하여 수평 확장을 가능하게 합니다.
이 포괄적인 가이드는 기능적인 MongoDB 샤딩 클러스터를 설정하는 전체 과정을 안내합니다. 설정 서버(config servers), mongos 라우터, 샤드 복제본 세트와 같은 필수 구성 요소를 구성하는 방법을 배우게 됩니다. 이 튜토리얼이 끝나면 높은 수평 확장성과 가용성을 위해 설계된 샤딩 클러스터를 배포하는 데 대한 기본적인 이해와 실질적인 경험을 갖게 될 것입니다.
MongoDB 샤딩 클러스터 이해하기
MongoDB 샤딩 클러스터는 데이터를 분산하고 라우팅하기 위해 함께 작동하는 세 가지 주요 구성 요소로 구성됩니다.
- 샤드 복제본 세트 (Shard Replica Sets): 실제 데이터를 보유하는 노드입니다. 각 샤드는 고가용성과 데이터 중복성을 제공하기 위한 복제본 세트입니다. 데이터는 이러한 샤드에 분할됩니다.
- 설정 서버 (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 4.2+가 설치되어 있어야 합니다. 설치 지침은 MongoDB 문서에서 찾을 수 있습니다. - 네트워킹: 모든 머신이 필요한 포트(설정 서버, 샤드 및
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옵션이 필요합니다.```bash
설정 서버 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 주소 또는 호스트 이름으로 바꾸십시오. -
설정 복제본 세트 초기화: 설정 서버 인스턴스 중 하나에 연결하고 복제본 세트를 초기화합니다.
bash mongo --port 27019mongo 셸 안에서:
javascript rs.initiate({ _id: "cfgReplSet", configsvr: true, members: [ { _id : 0, host : "localhost:27019" }, { _id : 1, host : "localhost:27020" }, { _id : 2, host : "localhost:27021" } ] });상태 확인:
javascript rs.status();
2단계: 샤드 복제본 세트 설정
클러스터의 각 샤드는 복제본 세트입니다. 세 개의 멤버로 두 개의 샤드(shard01 및 shard02)를 설정합니다.
-
샤드 1 멤버용
mongod인스턴스 시작: 각 인스턴스에는--shardsvr및--replSet옵션이 필요합니다.```bash
샤드 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 인스턴스 중 하나에 연결합니다.
bash mongo --port 27030mongo 셸 안에서:
javascript rs.initiate({ _id : "shard01", members: [ { _id : 0, host : "localhost:27030" }, { _id : 1, host : "localhost:27031" }, { _id : 2, host : "localhost:27032" } ] }); -
샤드 2 멤버용
mongod인스턴스 시작 (추가 샤드의 경우 반복):```bash
샤드 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 인스턴스 중 하나에 연결합니다.
bash mongo --port 27040mongo 셸 안에서:
javascript 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옵션을 제공하여 설정 복제본 세트 멤버를 나열합니다.```bash
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에 지정한 사용자 지정 포트를 사용합니다.bash mongo --port 27017 -
샤드 추가:
sh.addShard()명령을 사용하고 복제본 세트 이름과 해당 멤버 중 하나를 지정합니다.javascript sh.addShard("shard01/localhost:27030"); sh.addShard("shard02/localhost:27040");
5단계: 데이터베이스 및 컬렉션에 대한 샤딩 활성화
샤드가 추가되면 특정 데이터베이스에 대한 샤딩을 활성화하고 해당 데이터베이스 내의 특정 컬렉션에 대한 샤딩을 활성화해야 합니다. 이를 위해서는 샤드 키(shard key)를 선택해야 합니다.
-
데이터베이스에 대한 샤딩 활성화: 샤딩하려는 데이터베이스로 전환하고
sh.enableSharding()을 실행합니다.javascript use mydatabase; sh.enableSharding("mydatabase"); -
컬렉션 샤딩:
샤드 키를 선택하고sh.shardCollection()을 사용합니다.경고: 효과적인 샤드 키를 선택하는 것은 성능과 균등한 데이터 분산에 매우 중요합니다. 잘못된 샤드 키는 핫스팟이나 비효율적인 쿼리를 유발할 수 있습니다. 일반적인 전략에는 해시 키, 범위 키 또는 복합 키가 포함됩니다.
이 예시에서는
_id필드가 있는mycollection컬렉션을 가정합니다.```javascript
sh.shardCollection("mydatabase.mycollection"