PromleeBlog
sitemap
aboutMe

posting thumbnail
MongoDB 샤딩 클러스터 구성 - MongoDB 올인 9일차
MongoDB Sharded Cluster Configuration - All-in Day 9

📅

🚀

들어가기 전에 🔗

안녕하세요! MongoDB 올인 9일차입니다.
지난 8일차에는 MongoDB의 고가용성을 위한 복제 세트 구성과 장애 복구에 대해 자세히 알아보았습니다. 데이터의 안전성과 서비스 연속성을 확보하는 방법을 익혔죠.
오늘은 MongoDB가 자랑하는 또 다른 강력한 기능, 바로
샤딩(Sharding)
에 대해 깊이 파고들어 보겠습니다.
샤딩은 데이터베이스의
수평 확장(Horizontal Scaling)
을 가능하게 하여, 상상 이상의 대규모 데이터와 높은 트래픽을 처리할 수 있게 해주는 기술입니다.
데이터가 폭발적으로 증가하는 현대 애플리케이션 환경에서 샤딩은 선택이 아닌 필수가 될 수 있습니다. 오늘은 이 샤딩 클러스터를 어떻게 구성하고 운영하는지 그 원리와 단계를 살펴보겠습니다.

🚀

샤딩, 왜 필요하고 언제 사용할까요? 🔗

샤딩의 개념은 2일차 아키텍처 시간에도 간략히 언급되었습니다. 다시 한번 정리하면, 샤딩은 매우 큰 데이터셋을
샤드(Shard)
라고 불리는 작은 단위로 분할하여, 여러 MongoDB 서버(보통 복제 세트로 구성됨)에 분산 저장하고 처리하는 방식입니다.
샤딩이 필요한 주요 상황은 다음과 같습니다.
단, 샤딩은 시스템 복잡도를 높이고 관리 포인트를 늘리기 때문에, 모든 상황에 샤딩이 필요한 것은 아닙니다.
충분한 성능 최적화(인덱싱, 쿼리 튜닝)와 하드웨어 업그레이드(수직 확장)로 해결할 수 있다면 그 방법을 먼저 고려하는 것이 좋습니다.
샤딩은 이러한 노력으로도 한계에 도달했을 때 선택하는 강력한 해결책입니다.

🚀

샤드 클러스터의 주요 구성 요소 🔗

샤딩된 환경, 즉 샤드 클러스터는 다음과 같은 세 가지 주요 구성 요소로 이루어집니다.
  1. 샤드 (Shard)
    실제 데이터의 일부(청크 Chunk)를 저장하는 MongoDB 서버입니다.
    각 샤드는 반드시
    복제 세트(Replica Set)
    로 구성하여 해당 샤드 데이터의 고가용성과 안정성을 보장해야 합니다.
    클러스터에는 두 개 이상의 샤드가 존재합니다.
  2. 몽고스 (Mongos - MongoDB Shard)
    애플리케이션(클라이언트)의 요청을 받아들이는
    라우터(Router)
    역할을 합니다.
    클라이언트가 어떤 데이터를 요청하면, 몽고스는 해당 데이터가 어느 샤드에 저장되어 있는지
    컨피그 서버
    로부터 정보를 얻어 해당 샤드로 요청을 전달합니다.
    클라이언트는 샤드의 존재를 직접 알 필요 없이 몽고스에만 접속하면 됩니다.
    몽고스 자체는 상태를 저장하지 않으므로(stateless), 여러 대를 실행하여 가용성과 처리량을 높일 수 있습니다.
  3. 컨피그 서버 (Config Servers)
    클러스터의
    메타데이터(Metadata)
    를 저장하고 관리합니다. 이 메타데이터에는 각 샤드의 정보, 데이터가 샤드 간에 어떻게 분산되어 있는지(청크 분포) 등의 중요한 정보가 포함됩니다.
    컨피그 서버의 데이터는 매우 중요하므로, 반드시
    복제 세트(Replica Set)
    로 구성해야 합니다.
    (MongoDB 3.4 버전부터는 CSRS - Config Server Replica Set - 필수)
    보통 3대의 멤버로 구성된 복제 세트를 사용합니다.
샤드 클러스터 아키텍처 다이어그램
샤드 클러스터 아키텍처 다이어그램

🚀

데이터를 나누는 기준: 샤드 키 (Shard Key) 🔗

샤딩을 하려면 MongoDB가 문서를 어떤 기준으로 여러 샤드에 분산시킬지 알려줘야 합니다. 이 기준이 되는 필드(또는 필드들의 조합)를
샤드 키(Shard Key)
라고 합니다.

좋은 샤드 키의 조건 🔗

샤딩 전략 🔗

MongoDB는 샤드 키를 기반으로 데이터를 분산시키는 두 가지 주요 전략을 제공합니다.
➡️

1. 범위 기반 샤딩 (Range-based Sharding) 🔗

➡️

2. 해시 기반 샤딩 (Hashed Sharding) 🔗

MongoDB 4.0 부터는 특정 샤드 키 값이나 범위의 데이터를 특정 샤드에 고정하는
존 샤딩(Zone Sharding)
기능도 제공되어, 지리적 데이터 분산 등 고급 요구사항을 만족시킬 수 있습니다.

🚀

로컬 샤드 클러스터 구성 단계 🔗

실제 운영 환경에서 샤드 클러스터를 구성하는 것은 복잡하고 신중한 계획이 필요합니다.
전체 클러스터를 로컬에서 완벽하게 구성하는 것은 리소스 문제로 어려울 수 있지만, 핵심 요소인 컨피그 서버 복제 세트 부분은 이전 복제 세트 실습과 유사하게 직접 구성해 볼 수 있습니다.
👨‍💻
Windows 사용자는 터미널로 명령 프롬프트(cmd) 또는 PowerShell을 사용하시면 됩니다. 경로에 공백이 포함된 경우 큰따옴표(" ")로 경로 전체를 감싸주세요.

1단계: 컨피그 서버 복제 세트 시작 🔗

컨피그 서버는 샤드 클러스터의 뇌와 같습니다. 최소 3대의 mongod 인스턴스를 서로 다른 포트, 데이터 경로로 실행하고, 이들을 하나의 복제 세트로 초기화합니다.
➡️

1.1. 컨피그 서버용 디렉토리 준비 🔗

macOS/Linux
mkdir -p ~/mongodb/sharding/configsvr/csrs1/data ~/mongodb/sharding/configsvr/csrs1/log
mkdir -p ~/mongodb/sharding/configsvr/csrs2/data ~/mongodb/sharding/configsvr/csrs2/log
mkdir -p ~/mongodb/sharding/configsvr/csrs3/data ~/mongodb/sharding/configsvr/csrs3/log
윈도우에서는 예시로 C:\mongodb\sharding 디렉토리 아래에 생성하겠습니다.
Windows
mkdir C:\mongodb\sharding\configsvr\csrs1\data
mkdir C:\mongodb\sharding\configsvr\csrs1\log
mkdir C:\mongodb\sharding\configsvr\csrs2\data
mkdir C:\mongodb\sharding\configsvr\csrs2\log
mkdir C:\mongodb\sharding\configsvr\csrs3\data
mkdir C:\mongodb\sharding\configsvr\csrs3\log
➡️

1.2. 컨피그 서버 설정 파일 작성 🔗

각 컨피그 서버 인스턴스에 대한 설정 파일(mongod.conf 또는 mongod.cfg - Windows에서는 보통 .cfg 사용)을 준비합니다.
MongoDB 4.2 이상에서는 sharding.clusterRole: configsvr 설정을 사용하는 것이 권장됩니다.
각 폴더, 여기서는 csrs1mongod.conf 파일을 생성하고 다음 내용을 입력합니다.
 # 스토리지 설정
storage:
  dbPath: <각 OS에 맞는 csrs1 데이터 디렉토리 절대 경로> 
  # macOS/Linux 예: /Users/your_username/mongodb/sharding/configsvr/csrs1/data
  # Windows 예: C:\mongodb\sharding\configsvr\csrs1\data
 
 # 시스템 로그 설정
systemLog:
  destination: file
  path: <각 OS에 맞는 csrs1 로그 파일 절대 경로>
  # macOS/Linux 예: /Users/your_username/mongodb/sharding/configsvr/csrs1/log/mongod.log
  # Windows 예: C:\mongodb\sharding\configsvr\csrs1\log\mongod.log
  logAppend: true
 
 # 네트워크 설정
net:
  port: 27019 # 컨피그 서버 포트 1
  bindIp: 127.0.0.1
 
 # 복제 설정
replication:
  replSetName: "myConfigRS" # 컨피그 서버 복제 세트 이름
 
 # 샤딩 설정 (MongoDB 4.2+ 권장)
sharding:
  clusterRole: configsvr
🖐️
dbPath / path 부분에는 실제 환경에 맞게 절대 경로를 정확히 입력해주세요. your_username 부분도 실제 사용자 이름으로 변경해야 합니다.
컨피그 서버 2, 3 설정 파일은 위 csrs1 설정 파일을 복사하여, storage.dbPath, systemLog.path, net.port (각각 27020, 27021로 변경) 부분만 각 노드(csrs2, csrs3)에 맞게 수정합니다.
csrs2 설정 파일 예시(macOS/Linux)
storage:
  dbPath: /Users/your_username/mongodb/sharding/configsvr/csrs2/data
systemLog:
  destination: file
  path: /Users/your_username/mongodb/sharding/configsvr/csrs2/log/mongod.log
  logAppend: true
net:
  port: 27020
  bindIp: 127.0.0.1
replication:
  replSetName: "myConfigRS"
sharding:
  clusterRole: configsvr
csrs3 설정 파일 예시(macOS/Linux)
storage:
  dbPath: /Users/your_username/mongodb/sharding/configsvr/csrs3/data
systemLog:
  destination: file
  path: /Users/your_username/mongodb/sharding/configsvr/csrs3/log/mongod.log
  logAppend: true
net:
  port: 27021
  bindIp: 127.0.0.1
replication:
  replSetName: "myConfigRS"
sharding:
  clusterRole: configsvr
➡️

1.3. 각 컨피그 서버 mongod 인스턴스 실행 🔗

터미널 창(Windows는 명령 프롬프트 또는 PowerShell 창) 3개를 열고 각각 다음 명령어를 실행합니다.
macOS/Linux
 # 터미널 1: 컨피그 서버 1 실행
mongod --config ~/mongodb/sharding/configsvr/csrs1/mongod.conf
 
 # 터미널 2: 컨피그 서버 2 실행
mongod --config ~/mongodb/sharding/configsvr/csrs2/mongod.conf
 
 # 터미널 3: 컨피그 서버 3 실행
mongod --config ~/mongodb/sharding/configsvr/csrs3/mongod.conf
Windows
 # 창 1: 컨피그 서버 1 실행
mongod --config C:/mongodb/sharding/configsvr/csrs1/mongod.cfg
 
 # 창 2: 컨피그 서버 2 실행
mongod --config C:/mongodb/sharding/configsvr/csrs2/mongod.cfg
 
 # 창 3: 컨피그 서버 3 실행
mongod --config C:/mongodb/sharding/configsvr/csrs3/mongod.cfg
config 서버 3개 실행 완료(mac)
config 서버 3개 실행 완료(mac)
➡️

1.4. 컨피그 서버 복제 세트 초기화 🔗

하나의 컨피그 서버 멤버(예: 포트 27019)에 mongosh로 접속하여 복제 세트를 초기화합니다.
mongosh --port 27019
접속 후, 다음 명령어를 실행합니다.
config = {
  _id: "myConfigRS",
  members: [
    { _id: 0, host: "127.0.0.1:27019" },
    { _id: 1, host: "127.0.0.1:27020" },
    { _id: 2, host: "127.0.0.1:27021" }
  ]
}
rs.initiate(config)
성공하면 ok: 1 이 반환되고, 프롬프트가 컨피그 서버 복제 세트의 프라이머리로 변경됩니다.
rs.status() 명령어로 상태를 확인할 수 있습니다.
여기까지 Windows와 macOS/Linux 환경에서 컨피그 서버 복제 세트 구성 실습이었습니다. 이제 샤드 클러스터의 핵심 두뇌가 준비되었습니다.
컨피그 서버 복제 세트 구성
컨피그 서버 복제 세트 구성

2단계: 샤드 서버 복제 세트 구성 🔗

이제 실제 데이터를 분산 저장할
샤드 서버
들을 구성합니다.
각 샤드는 반드시 복제 세트로 구성해야 합니다.
여기서는 예시로 2개의 샤드(shard1RS, shard2RS)를 만들고, 각 샤드는 3개의 멤버로 구성한다고 가정하겠습니다.
➡️

2.1. 샤드 1 (shard1RS) 구성 🔗

macOS/Linux
mkdir -p ~/mongodb/sharding/shard1/s1rs1/data ~/mongodb/sharding/shard1/s1rs1/log
mkdir -p ~/mongodb/sharding/shard1/s1rs2/data ~/mongodb/sharding/shard1/s1rs2/log
mkdir -p ~/mongodb/sharding/shard1/s1rs3/data ~/mongodb/sharding/shard1/s1rs3/log
Windows
mkdir C:\mongodb\sharding\shard1\s1rs1\data
mkdir C:\mongodb\sharding\shard1\s1rs1\log
mkdir C:\mongodb\sharding\shard1\s1rs2\data
mkdir C:\mongodb\sharding\shard1\s1rs2\log
mkdir C:\mongodb\sharding\shard1\s1rs3\data
mkdir C:\mongodb\sharding\shard1\s1rs3\log
➡️

2.2. 샤드 1 - 멤버 1 설정 파일 작성 🔗

sharding.clusterRole: shardsvr 설정을 사용합니다.
위처럼 shard1/s1rs1 디렉토리에 mongod.conf 파일을 생성하고 다음 내용을 입력합니다.
샤드 1 - 멤버 1 설정 파일 예시(macOS/Linux)
storage:
  dbPath: <각 OS에 맞는 shard1-s1rs1 데이터 디렉토리 절대 경로>
  # macOS/Linux 예: /Users/your_username/mongodb/sharding/shard1/s1rs1/data
  # windows 예: C:\mongodb\sharding\shard1\s1rs1\data
systemLog:
  destination: file
  path: <각 OS에 맞는 shard1-s1rs1 로그 파일 절대 경로>
  # macOS/Linux 예: /Users/your_username/mongodb/sharding/shard1/s1rs1/log/mongod.log
  # windows 예: C:\mongodb\sharding\shard1\s1rs1\log\mongod.log
  logAppend: true
net:
  port: 27061 # 샤드1-멤버1 포트
  bindIp: 127.0.0.1
replication:
  replSetName: "shard1RS" # 샤드1 복제 세트 이름
sharding:
  clusterRole: shardsvr # 샤드 서버 역할(중요!)
➡️

2.3. 샤드 1 - 멤버 2, 3 설정 파일: 🔗

위 s1rs1 설정 파일을 복사하여, storage.dbPath, systemLog.path, net.port (각각 27062, 27063으로 변경)만 각 노드에 맞게 수정합니다.
➡️

2.4. 샤드 1 멤버 mongod 인스턴스 실행 🔗

macOS/Linux
 # 터미널 1: 샤드 1 멤버 1 실행
mongod --config ~/mongodb/sharding/shard1/s1rs1/mongod.conf
 
 # 터미널 2: 샤드 1 멤버 2 실행
mongod --config ~/mongodb/sharding/shard1/s1rs2/mongod.conf
 
 # 터미널 3: 샤드 1 멤버 3 실행
mongod --config ~/mongodb/sharding/shard1/s1rs3/mongod.conf
Windows
 
 # 창 1: 샤드 1 멤버 1 실행
mongod --config C:/mongodb/sharding/shard1/s1rs1/mongod.cfg
 
 # 창 2: 샤드 1 멤버 2 실행
mongod --config C:/mongodb/sharding/shard1/s1rs2/mongod.cfg
 
 # 창 3: 샤드 1 멤버 3 실행
mongod --config C:/mongodb/sharding/shard1/s1rs3/mongod.cfg
샤드1 멤버 3개 실행
샤드1 멤버 3개 실행
➡️

2.5. 샤드 1 복제 세트 초기화 🔗

샤드 1 멤버 중 하나(예: 포트 27061)에 mongosh로 접속하여 초기화합니다.
mongosh --port 27061
config_s1 = {
  _id: "shard1RS",
  members: [
    { _id: 0, host: "127.0.0.1:27061" },
    { _id: 1, host: "127.0.0.1:27062" },
    { _id: 2, host: "127.0.0.1:27063" }
  ]
}
rs.initiate(config_s1)
rs.status() 로 상태를 확인합니다.
샤드1 복제 세트 초기화
샤드1 복제 세트 초기화
➡️

2.6. 샤드 2 (shard2RS) 구성 🔗

샤드 1 구성과 동일한 방식으로 샤드 2를 구성합니다.
샤드 1, 2 구성 완료
샤드 1, 2 구성 완료

3단계: 몽고스 라우터 시작 🔗

시작 전, 다음 명령어로 해당 포트에 몽고스가 실행 중인지 확인합니다.
lsof -i :27017
만약 실행 중이라면, 해당 프로세스를 종료합니다.
kill $(lsof -t -i:27017)
다음 명령어로 로그 파일을 저장할 폴더를 생성합니다.
몽고스 프로세스를 실행합니다. 이때 --configdb 옵션으로 컨피그 서버 복제 세트 주소를 알려줍니다.
macOS/Linux
mkdir -p ~/mongodb/logs
mongos --configdb myConfigRS/127.0.0.1:27019,127.0.0.1:27020,127.0.0.1:27021 --logpath ~/mongodb/logs/mongod.log --port 27017
Windows
mkdir C:\mongodb\logs
mongos --configdb myConfigRS/127.0.0.1:27019,127.0.0.1:27020,127.0.0.1:27021 --logpath C:/mongodb/logs/mongod.log --port 27017
1, 2, 3단계 결과
1, 2, 3단계 결과

4단계: 샤드 추가 (sh.addShard) 🔗

몽고스 라우터에 접속하여, 실제로 데이터를 분산 저장할 샤드 서버(들)를 샤드 클러스터에 등록합니다. 이 명령어는 반드시
몽고스(mongos) 프로세스에 접속된 mongosh 에서 실행
해야 합니다.
➡️

sh.addShard() 명령어란? 🔗

sh.addShard() 명령어는 몽고스에게 "이 샤드(복제 세트)를 우리 샤드 클러스터의 새로운 데이터 저장소 멤버로 추가해줘"라고 지시하는 역할을 합니다.
sh.addShard("replicaSetName/seedMemberHost:port,...", { name: "optionalShardName" })
몽고스에 접속된 mongosh 에서 실행합니다.
mongosh --port 27017
sh.addShard("shard1RS/127.0.0.1:27061", { name: "primaryDataShard" })
sh.addShard("shard2RS/127.0.0.1:27071")
성공하면 { "shardAdded" : "...", "ok" : 1, ... } 메시지가 출력됩니다.
실행 후 확인:
sh.status() 명령어의 shards 섹션에서 추가된 샤드 정보를 확인합니다.
이미지 제안: sh.addShard() 명령어 성공 화면 및 sh.status() 결과 화면.
shard 추가 성공
shard 추가 성공
rs.status() 결과 화면
rs.status() 결과 화면

5단계: 데이터베이스 샤딩 활성화 (sh.enableSharding) 🔗

샤딩을 사용할 데이터베이스를 지정합니다.
sh.enableSharding("myShardedDB")

6단계: 컬렉션 샤딩 (sh.shardCollection) 🔗

샤딩할 컬렉션과 사용할 샤드 키를 지정합니다.
sh.shardCollection("myShardedDB.myCollection", { userId: "hashed" })
sh.shardCollection("myShardedDB.events", { timestamp: 1 })

7단계: 상태 확인 (sh.status) 🔗

몽고스에 접속된 상태에서 현재 샤드 클러스터의 상태, 샤드 목록, 청크 분배 정보 등을 확인할 수 있습니다.
sh.status()
컬렉션 샤딩이 적용된 결과
컬렉션 샤딩이 적용된 결과
👍
컨피그 서버 외의 샤드 서버와 몽고스 구성 및 전체 연동은 로컬에서 상당한 시스템 리소스를 요구하며 설정이 복잡합니다.
학습 시에는 각 단계의 개념과 명령어 위주로 이해하고, 실제 구성은 MongoDB Atlas와 같은 클라우드 서비스를 활용하거나 충분한 자원이 확보된 환경에서 시도하는 것이 좋습니다.

🚀

결론 🔗

오늘은 MongoDB의 수평 확장을 위한 핵심 기술인 샤딩(Sharding) 클러스터를 구성하고 운영하는 방법에 대해 알아보았습니다.
특히 샤드 클러스터의 두뇌 역할을 하는 컨피그 서버 복제 세트를 Windows와 macOS/Linux 환경에서 직접 구성해보는 실습을 통해 샤딩 구성의 첫 단추를 끼워보았습니다.
이어서 샤딩의 필요성과 주요 구성 요소, 그리고 샤딩 성공의 열쇠인 샤드 키 선택의 중요성과 샤딩 전략에 대해 배웠습니다.
샤딩은 복잡하지만, 제대로 이해하고 활용한다면 MongoDB를 통해 엄청난 규모의 데이터를 다루는 강력한 시스템을 구축할 수 있습니다.
다음 시간에는 MongoDB 고급 기능의 마지막 주제로, 우리 시스템의 데이터를 안전하게 지키는
MongoDB 보안(인증, 권한, 암호화)
에 대해 알아보겠습니다.

참고 🔗