단계별 가이드: 기본 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 샤드 클러스터의 개념적 다이어그램(이미지 출처: MongoDB 공식 문서)

사전 요구 사항

시작하기 전에 다음 사항이 준비되었는지 확인하세요:

  1. 여러 대의 머신/VM: 실제 분산 샤드 클러스터를 위해서는 최소 6-9대의 머신/VM/Docker 컨테이너가 필요합니다. 이 기본 튜토리얼에서는 다른 포트를 사용하여 단일 머신에서 시뮬레이션할 수 있지만, 프로덕션 환경에서는 전용 리소스가 필요합니다.
    • 구성 서버 3대 (configSrv01, configSrv02, configSrv03)
    • 각 샤드에 최소 2-3대 (예: Shard01-RS01, Shard01-RS02, Shard01-RS03; Shard02-RS01, ...)
    • mongos 라우터 1대 이상
  2. MongoDB 설치: mongod 또는 mongos를 호스팅할 모든 머신에 지원되는 MongoDB 서버 버전을 설치하세요. 셸 명령에는 mongosh를 사용하세요.
  3. 네트워킹: 모든 머신이 필요한 포트(기본적으로 구성 서버, 샤드, mongos에 대해 각각 27017, 27018, 27019, 27020 또는 사용자 정의 포트)를 통해 서로 통신할 수 있는지 확인하세요.
  4. 디렉토리 구조: 각 mongodmongos 인스턴스에 대해 전용 데이터 및 로그 디렉토리를 생성하세요.

이 가이드에서는 단순화를 위해 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)

구성 서버는 샤드 클러스터의 메타데이터를 저장합니다. 복제 세트로 실행되어야 합니다.

  1. 구성 서버용 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 주소나 호스트 이름으로 바꾸세요.

  2. Config Replica Set 초기화: 구성 서버 인스턴스 중 하나에 연결하여 복제 세트를 초기화합니다.

    mongosh --port 27019
    

    mongo 셸 내부:

    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단계: 샤드 복제 세트 설정

클러스터의 각 샤드는 복제 세트입니다. 각각 세 개의 멤버로 구성된 두 개의 샤드(shard01shard02)를 설정하겠습니다.

  1. 샤드 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
    
  2. 샤드 1 복제 세트 초기화: 샤드 1 인스턴스 중 하나에 연결합니다.

    mongosh --port 27030
    

    mongo 셸 내부:

    rs.initiate({
       _id : "shard01",
       members: [
          { _id : 0, host : "localhost:27030" },
          { _id : 1, host : "localhost:27031" },
          { _id : 2, host : "localhost:27032" }
       ]
    });
    
  3. 샤드 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
    
  4. 샤드 2 복제 세트 초기화: 샤드 2 인스턴스 중 하나에 연결합니다.

    mongosh --port 27040
    

    mongo 셸 내부:

    rs.initiate({
       _id : "shard02",
       members: [
          { _id : 0, host : "localhost:27040" },
          { _id : 1, host : "localhost:27041" },
          { _id : 2, host : "localhost:27042" }
       ]
    });
    

3단계: mongos 라우터 설정

mongos 인스턴스는 클라이언트 애플리케이션의 진입점입니다. 구성 서버의 위치를 알아야 합니다.

  1. 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 인스턴스에 연결하고 샤드 복제 세트를 클러스터에 추가합니다.

  1. mongos에 연결: 기본 MongoDB 포트 27017 또는 mongos에 지정한 사용자 정의 포트를 사용합니다.

    mongosh --port 27017
    
  2. 샤드 추가: sh.addShard() 명령을 사용하여 복제 세트 이름과 멤버 중 하나를 지정합니다.

    sh.addShard("shard01/localhost:27030");
    sh.addShard("shard02/localhost:27040");
    

5단계: 데이터베이스 및 컬렉션에 대해 샤딩 활성화

샤드가 추가되면 특정 데이터베이스와 해당 데이터베이스 내의 특정 컬렉션에 대해 샤딩을 활성화해야 합니다. 이를 위해서는 샤드 키를 선택해야 합니다.

  1. 데이터베이스에 대해 샤딩 활성화: 샤딩하려는 데이터베이스로 전환하고 sh.enableSharding()을 실행합니다.

    use mydatabase;
    sh.enableSharding("mydatabase");
    
  2. 컬렉션 샤딩: 샤드 키를 선택하고 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는 클라이언트 트래픽을 라우팅합니다. 먼저 이러한 역할이 작동하도록 한 다음, 샤드 키 설계에 대부분의 시간을 투자하세요. 이 선택이 클러스터가 부하를 깔끔하게 분산하는지 아니면 핫 샤드를 생성하는지를 결정하기 때문입니다.