이전 글: MongoDB - 샤딩 기본 개념
| 1. 샤딩 클러스터 아키텍처 |
|---|
이전 글에서 샤딩 클러스터의 기본 개념을 다뤘습니다. 여기서는 간단한 샤딩 클러스터를 구축해 보겠습니다:
라우팅 서비스: Mongos1 포트: 27017 Mongos2 포트: 27117
구성 서버 복제 세트: 주 노드 포트: 27018 보조 노드 1 포트: 27118 보조 노드 2 포트: 27218
샤드 복제 세트: 복제 세트 1 주 노드 포트: 27019 보조 노드 포트: 27119 중재 노드 포트: 27219
복제 세트 2 주 노드 포트: 27319 보조 노드 포트: 27419 중재 노드 포트: 27519
- 2개의 Mongos 라우팅 서비스를 구축하여, 하나의 라우팅 서비스가 다운되더라도 전체 샤딩 클러스터를 계속 사용할 수 있도록 하여 클러스터의 장애 허용성을 향상시킵니다.
- 구성 서버 복제 세트에서 중재 노드는 데이터를 저장하지 않으므로, 보조 노드로 설정할 수 있습니다.
- 샤드 복제 세트는 총 2개를 구축하며, 실제 프로젝트에서는 필요에 따라 더 많은 샤드 클러스터를 추가할 수 있습니다.
| 2. 샤딩 클러스터 구축 |
|---|
1. 샤드 복제 세트 구축
-
Linux에서
MongoDB가 설치된 디렉토리로 이동합니다: -
첫 번째 샤드 복제 세트의
data/db및log디렉토리 생성
mkdir -p sharded_cluster/sharded01_27019/log \ &
mkdir -p sharded_cluster/sharded01_27019/data/db
mkdir -p sharded_cluster/sharded01_27119/log \ &
mkdir -p sharded_cluster/sharded01_27119/data/db
mkdir -p sharded_cluster/sharded01_27219/log \ &
mkdir -p sharded_cluster/sharded01_27219/data/db
- 설정 파일 생성
vi sharded_cluster/sharded01_27019/mongod.conf
설정 파일에 다음 내용을 붙여넣으세요(경로와 포트 번호를 수정해야 합니다):
storage:
# mongod 프로세스 데이터 저장 디렉토리, 이 설정은 mongod 프로세스에만 적용됩니다
dbPath: "/usr/local/mongodb-4.0.9/sharded_cluster/sharded01_27019/data/db"
# journal 로지컬 영구 저장 활성화 여부, journal 로지컬은 데이터 복구에 사용되며 mongod의 기본 특성입니다. 64비트 시스템에서 기본값은 true, 32비트에서는 false이며 권장 설정입니다.
journal:
enabled: true
# 저장 엔진 유형, mongodb 3.0 이후 "mmapv1", "wiredTiger" 두 가지 엔진을 지원하며 기본값은 "mmapv1"입니다. 공식 문서에 따르면 wiredTiger 엔진이 더 우수합니다.
engine: mmapv1
systemLog:
# 로그 출력 대상, "file" 또는 "syslog"로 지정할 수 있으며, 지정하지 않으면 표준 출력(standard output)으로 출력됩니다.
destination: file
# true인 경우 mongod/mongos 재시작 후 기존 로그의 끝에 로그가 추가됩니다. 그렇지 않으면 현재 로그 파일을 백업하고 새 로그 파일을 생성합니다. 기본값은 false입니다.
logAppend: true
# 로그 경로
path: "/usr/local/mongodb-4.0.9/sharded_cluster/sharded01_27019/log/mongod.log"
processManagement:
# 백그라운드에서 mongos 또는 mongod 프로세스를 실행하는 데몬 모드 활성화
fork: true
net:
# 외부 바인딩 IP, 여러 개는 쉼표로 구분, 기본값은 localhost
bindIp: 0.0.0.0
# 포트 번호 지정
port: 27019
replication:
# 복제 세트 이름, 동일한 복제 세트의 주 노드, 보조 노드, 중재 노드는 동일한 이름을 가져야 합니다
replSetName: sharded01
sharding:
# 샤드 역할
clusterRole: shardsvr
- 27019, 27119, 27219 포트로 서비스 시작
/usr/local/mongodb-4.0.9/bin/mongod -f sharded_cluster/sharded01_27019/mongod.conf
첫 번째 샤드 복제 세트가 성공적으로 시작되었습니다:
동일한 단계를 사용하지만 포트 번호와 설정 파일의 경로를 수정하여 두 번째 샤드 복제 세트를 구축하고 시작합니다:
이제 두 개의 샤드 복제 세트가 성공적으로 구축되고 시작되었습니다.
2. 구성 서버 복제 세트 구축
data\db및log디렉토리 생성
mkdir -p sharded_cluster/configServer_27018/log \ &
mkdir -p sharded_cluster/configServer_27018/data/db
mkdir -p sharded_cluster/configServer_27118/log \ &
mkdir -p sharded_cluster/configServer_27118/data/db
mkdir -p sharded_cluster/configServer_27218/log \ &
mkdir -p sharded_cluster/configServer_27218/data/db
mongod.conf설정 파일 생성(포트와 경로 수정)
storage:
# mongod 프로세스 데이터 저장 디렉토리, 이 설정은 mongod 프로세스에만 적용됩니다
dbPath: "/usr/local/mongodb-4.0.9/sharded_cluster/configServer_27018/data/db"
# journal 로지컬 영구 저장 활성화 여부, journal 로지컬은 데이터 복구에 사용되며 mongod의 기본 특성입니다. 64비트 시스템에서 기본값은 true, 32비트에서는 false이며 권장 설정입니다.
journal:
enabled: true
# 저장 엔진 유형, mongodb 3.0 이후 "mmapv1", "wiredTiger" 두 가지 엔진을 지원하며 기본값은 "mmapv1"입니다.
engine: mmapv1
systemLog:
# 로그 출력 대상, "file" 또는 "syslog"로 지정할 수 있으며, 지정하지 않으면 표준 출력으로 출력됩니다.
destination: file
# true인 경우 mongod/mongos 재시작 후 기존 로그의 끝에 로그가 추가됩니다. 그렇지 않으면 현재 로그 파일을 백업하고 새 로그 파일을 생성합니다. 기본값은 false입니다.
logAppend: true
# 로그 경로
path: "/usr/local/mongodb-4.0.9/sharded_cluster/configServer_27018/log/mongod.log"
processManagement:
# 백그라운드에서 mongos 또는 mongod 프로세스를 실행하는 데몬 모드 활성화
fork: true
net:
# 외부 바인딩 IP, 여러 개는 쉼표로 구분, 기본값은 localhost
bindIp: 0.0.0.0
# 포트 번호 지정
port: 27018
replication:
# 복제 세트 이름, 동일한 복제 세트의 주 노드, 보조 노드, 중재 노드는 동일한 이름을 가져야 합니다
replSetName: configServer
sharding:
# 샤드 역할
clusterRole: configsvr
- 구성 서버 복제 세트 시작(포트와 경로 수정)
/usr/local/mongodb-4.0.9/bin/mongod -f sharded_cluster/configServer_27018/mongod.conf
구성 서버 복제 세트가 성공적으로 시작되었습니다.
3. 복제 세트 초기화
1. Windows 명령 프롬프트에서 MongoDB 서버에 연결
2. 복제 세트 초기화
rs.initiate()
3. 보조 노드 추가
rs.add("IP주소:포트번호")
4. 중재 노드 추가
rs.addArb("IP주소:포트번호")
첫 번째 샤드 복제 세트 초기화가 완료되었습니다. 5. 27319 포트에 연결하여 동일한 단계로 두 번째 샤드 복제 세트 초기화
6. 구성 서버 복제 세트 초기화
구성 서버도 복제 세트이므로, 위에서 설명한 샤드 복제 세트 초기화 방법을 동일하게 반복합니다(구성 서버 복제 세트의 mongod.conf 설정 파일은 샤드 복제 세트와 차이가 있습니다).
3. 라우팅 서비스 구축
1. 로그 저장 디렉토리 생성
라우팅 노드는 데이터를 저장하지 않으므로 log 디렉토리만 필요합니다.
mkdir -p sharded_cluster/mongos_27017/log
2. 라우팅 설정 파일 생성
vi sharded_cluster/mongos_27017/mongos.conf
systemLog:
# 로그 출력 대상, "file" 또는 "syslog"로 지정할 수 있으며, 지정하지 않으면 표준 출력으로 출력됩니다.
destination: file
# true인 경우 mongod/mongos 재시작 후 기존 로그의 끝에 로그가 추가됩니다. 그렇지 않으면 현재 로그 파일을 백업하고 새 로그 파일을 생성합니다. 기본값은 false입니다.
logAppend: true
# 로그 경로
path: "/usr/local/mongodb-4.0.9/sharded_cluster/mongos_27017/log/mongod.log"
processManagement:
# 백그라운드에서 mongos 또는 mongod 프로세스를 실행하는 데몬 모드 활성화
fork: true
pidFilePath: "/usr/local/mongodb-4.0.9/sharded_cluster/mongos_27017/log/mongod.pid"
net:
# 외부 바인딩 IP, 여러 개는 쉼표로 구분, 기본값은 localhost
bindIp: 0.0.0.0
# 포트 번호 지정
port: 27017
sharding:
# 구성 노드 복제 세트 지정
configDB: configServer/120.76.215.19:27018,120.76.215.19:27118,120.76.215.19:27218
3. 라우팅 서비스 시작
/usr/local/mongodb-4.0.9/bin/mongos -f sharded_cluster/mongos_27017/mongos.conf
4. 샤드 서비스를 라우팅 노드에 추가
sharded01 및 sharded02 두 개의 샤드 복제 세트를 각각 라우팅 노드에 추가합니다.
sh.addShard("sharded01/120.76.215.19:27019,120.76.215.19:27119,120.76.215.19:27219")
……
5. 샤딩 활성화 이전 글에서 설명했듯이 MongoDB의 샤딩 계층은 컬렉션 데이터를 샤딩하는 것이므로, 다음 명령을 사용하여 샤딩을 활성화할 수 있습니다: 데이터베이스에 샤딩 서비스 활성화:
sh.enableSharding("데이터베이스이름")
sh.shardCollection(namespace,key,unique)
| 파라미터 | 타입 | 설명 |
|---|---|---|
| namespace | String | (샤딩) 대상 컬렉션의 네임스페이스, 형식: 데이터베이스명.컬렉션명 |
| key | document | 샤딩 키로 사용될 인덱스 사양 문서. 샤딩 키는 MongoDB가 문서를 샤드 간에 어떻게 분배할지 결정합니다. 컬렉션이 비어 있지 않은 경우, 샤딩 컬렉션 명령 전에 인덱스가 존재해야 합니다. 컬렉션이 비어 있는 경우, MongoDB는 컬렉션을 샤딩하기 전에 샤딩 키를 지원하는 인덱스가 없는 경우 인덱스를 생성합니다. 간단히 말해, 필드와 필드의 인덱스 방향을 포함하는 문서로 구성됩니다. |
| unique | boolean | 값이 true인 경우, 샤딩 키 필드에 고유 인덱스로 제한됩니다. 해시 전략 샤딩 키는 고유 인덱스를 지원하지 않습니다. 기본값은 false입니다. |
참고: 컬렉션에 데이터가 있는 경우, MongoDB는 id 키를 사용하여 고유 인덱스를 생성합니다
샤딩을 수행할 때 샤딩 키(Shard Key)를 선택해야 합니다. 이 키는 모든 컬렉션 데이터에 포함되어 있어야 하며 인덱스가 생성된 필드여야 합니다. MongoDB는 샤딩 키를 기준으로 데이터를 다른 데이터 조각(chunk)으로 나누고, 데이터 조각을 모든 샤드에 균등하게 분배합니다. 데이터 조각을 생성하기 위해 MongoDB는 해시 기반 샤딩 방식(무작위 평균 분배) 또는 범위 기반 분배 방식(숫자 크기 기준 분배)을 사용합니다.
| 전략 | 구문 | 설명 |
|---|---|---|
| 해시 전략 | sh.shardCollection("데이터베이스명.컬렉션명",{"필드명":"hashed"}) | 해시 기반 샤딩의 경우, MongoDB는 필드의 해시 값을 계산하고 이 해시 값을 사용하여 데이터 조각을 생성합니다. 해시 기반 샤딩 시스템에서 "유사한" 샤딩 키를 가진 문서는 동일한 데이터 조각에 저장되지 않을 가능성이 높습니다. |
| 범위 전략 | sh.shardCollection("데이터베이스명.컬렉션명",{"필드명":1}) | 범위 기반 샤딩의 경우, MongoDB는 샤딩 키의 범위에 따라 데이터를 여러 부분으로 나눕니다. 숫자 샤딩 키를 가정하면: 음의 무한대에서 양의 무한대까지의 직선을 상상해 보세요. 각 샤딩 키 값은 이 직선에 점을 찍습니다. MongoDB는 이 직선을 더 짧은 중첩되지 않는 조각으로 나누며 이를 데이터 조각이라고 합니다. 범위 기반 샤딩 시스템에서 "유사한" 샤딩 키를 가진 문서는 동일한 데이터 조각에 저장될 가능성이 높습니다. |
동일한 컬렉션의 동일한 필드에는 동시에 하나의 샤딩 전략만 사용할 수 있습니다. 하나의 필드가 해시 전략으로 샤딩되고 다른 필드가 범위 전략으로 샤딩될 수 없습니다.
이제 간단한 MongoDB 샤딩 클러스터가 구축되었습니다. 이제 IDEA와 같은 도구를 사용하여 MongoDB 서버에 연결하려면 라우팅 노드에 직접 연결하면 됩니다.
spring:
data:
mongodb:
# 라우팅 노드의 IP 주소와 포트
uri: mongodb://IP주소:포트,IP주소:포트.../데이터베이스이름