단계별 가이드: 기본 MongoDB 샤드 클러스터 배포

이 단계별 가이드로 기본 MongoDB 샤드 클러스터를 배포하여 수평적 확장성을 확보하세요. 구성 서버 설정, 샤드 복제 세트 구성, `mongos` 라우터 배포 방법을 알아보세요. 이 튜토리얼은 초기 설정 및 구성 요소 초기화부터 데이터베이스 및 컬렉션에 대한 샤딩 활성화까지 모든 것을 다룹니다. 개발자 및 관리자에게 적합하며, 강력하고 확장 가능한 MongoDB 환경을 보장하기 위한 실제 명령, 모범 사례 및 검증 단계를 제공합니다.

38 조회수

단계별 가이드: 기본 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 Sharded Cluster Architecture Diagram (Conceptual)
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 4.2+가 설치되어 있어야 합니다. 설치 지침은 MongoDB 문서에서 찾을 수 있습니다.
  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 옵션이 필요합니다.

    ```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 주소 또는 호스트 이름으로 바꾸십시오.

  2. 설정 복제본 세트 초기화: 설정 서버 인스턴스 중 하나에 연결하고 복제본 세트를 초기화합니다.

    bash mongo --port 27019

    mongo 셸 안에서:

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

클러스터의 각 샤드는 복제본 세트입니다. 세 개의 멤버로 두 개의 샤드(shard01shard02)를 설정합니다.

  1. 샤드 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
    ```

  2. 샤드 1 복제본 세트 초기화: 샤드 1 인스턴스 중 하나에 연결합니다.

    bash mongo --port 27030

    mongo 셸 안에서:

    javascript rs.initiate({ _id : "shard01", members: [ { _id : 0, host : "localhost:27030" }, { _id : 1, host : "localhost:27031" }, { _id : 2, host : "localhost:27032" } ] });

  3. 샤드 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
    ```

  4. 샤드 2 복제본 세트 초기화: 샤드 2 인스턴스 중 하나에 연결합니다.

    bash mongo --port 27040

    mongo 셸 안에서:

    javascript 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 옵션을 제공하여 설정 복제본 세트 멤버를 나열합니다.

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

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

    bash mongo --port 27017

  2. 샤드 추가: sh.addShard() 명령을 사용하고 복제본 세트 이름과 해당 멤버 중 하나를 지정합니다.

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

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

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

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

    javascript use mydatabase; sh.enableSharding("mydatabase");

  2. 컬렉션 샤딩: 샤드 키를 선택하고 sh.shardCollection()을 사용합니다.

    경고: 효과적인 샤드 키를 선택하는 것은 성능과 균등한 데이터 분산에 매우 중요합니다. 잘못된 샤드 키는 핫스팟이나 비효율적인 쿼리를 유발할 수 있습니다. 일반적인 전략에는 해시 키, 범위 키 또는 복합 키가 포함됩니다.

    이 예시에서는 _id 필드가 있는 mycollection 컬렉션을 가정합니다.

    ```javascript
    sh.shardCollection("mydatabase.mycollection"