데이터 저장을 위해 확인 중에 생각보다 Disk 용량이 없는 걸 확인했다.
MongoDB 가 C:\ 에 저장되어 있는 관계로 데이터를 분산해야 할 필요성을 느껴서 확인해보니, 샤딩을 해주면 해결가능할 것 같다는 생각에 도전.... 근데 오늘 휴일이었는데 하루가 다갔다.... ㅠㅠ 해놓고 보니까 대단한 걸 해냈네....
1. 데이터 백업
먼저 샤딩을 하기 전에 기존 MongoDB data 들을 백업해줘야 한다. MongoDB에서 샤딩을 구성하고 나면, 기존에 단일 인스턴스나 레플리카 세트에서 사용하던 데이터가 새로 구성된 샤드 클러스터에서 바로 보이지 않기 때문이다. 샤딩 구성 과정에서 기존 데이터를 샤드 클러스터로 마이그레이션(이동)하는 단계를 별도로 수행해야한다.
mongodump 명령어를 사용하여 데이터베이스의 백업을 생성할 수 있다.
mongodump --host <기존_인스턴스_주소> --port <포트> --out <백업_경로>
그런데 mongodb 4.4 이후 버전부터는 mongodump 가 tool 에 들어있어서 커뮤니티가서 Database Tools를 별도로 설치 설치해줘야하는 번거로움이 있다.
https://www.mongodb.com/try/download/database-tools
Try MongoDB Tools - Download Free Here
Free download for MongoDB tools to do more with your database. MongoDB Shell, Compass, CLI for Cloud, BI Connector and other database tools available.
www.mongodb.com
2. 샤딩 작업
샤딩이란 MongoDB 에서 데이터를 분산하여 저장하는 개념이다. 한 대의 서버에 빅데이터를 저장하게 되면 I/O 가 한대에서 일어나지만 서버를 여러 개 둔다면 I/O 가 여러 대에서 일어나기 때문에 효율이 좋아진다.
보통은 데이터를 분산하여 부하 분산, 백업 및 복구 전략, 빠른 성능을 위해서 적용한다. (한 마디로 나처럼 Storage 때문에 쓰는 경우는 거의 없다.)
샤딩의 구성요소는 Shard, Mongos, Config Servers 이렇게 3가지
- Shard : 분산된 데이터 저장 공간
- Mongos : 라우트 서버로 각 샤드 서버한테 알맞은 일을 분배
- Config Servers : 샤드에 대한 메타 데이터 저장(인덱싱)/관리
그 외 샤딩 이론과 복구방법 등에 대해서 궁금하면 아래 블로그를 보도록 하자.
[ MongoDB ] 샤딩(Sharding)이란?
샤딩이란? 데이터를 분산하여 저장하는 개념 한대의 서버에 빅데이터를 저장하게 되면 I/O가 한대에서 일어남. 서버를 여러 개를 두고 분산 저장한다면 I/O 가 여러 대에서 일어나기 때문에 효율
dev-cini.tistory.com
어찌 되었는 내가 원하는 건 c:\와 d:\를 동시에 사용하는 거였고, MongoDB 에서는 샤딩 환경 구성만이 해결 방법이었다.
2.1 Config 서버 설정
일반적으로 3개의 Config 서버를 레플리카 세트로 구성한다.
Config 서버 데이터 디렉토리 생성 (각 Config 서버에 대해)
mkdir c:\data\configdb1
mkdir c:\data\configdb2
mkdir c:\data\configdb3
Config 서버 시작 (각 Config 서버에 대해)
mongod --configsvr --replSet configReplSet --dbpath c:\data\configdb1 --port 27019
mongod --configsvr --replSet configReplSet --dbpath c:\data\configdb2 --port 27020
mongod --configsvr --replSet configReplSet --dbpath c:\data\configdb3 --port 27021
레플리카 세트 구성
mongo --port 27019
rs.initiate({
_id: "configReplSet",
configsvr: true,
members: [
{ _id: 0, host: "localhost:27019" },
{ _id: 1, host: "localhost:27020" },
{ _id: 2, host: "localhost:27021" }
]
})
2.2 Shard 서버 설정 (각 Drive 에 대해)
Shard 1 (C 드라이브)
# 데이터 디렉토리 생성
mkdir c:\data\shard1db
# Shard 서버 시작
mongod --shardsvr --replSet shard1ReplSet --dbpath c:\data\shard1db --port 27018
# 레플리카 세트 구성
mongo --port 27018
rs.initiate({
_id: "shard1ReplSet",
members: [{ _id: 0, host: "localhost:27018" }]
})
Shard 2 (D 드라이브)
# 데이터 디렉토리 생성
mkdir d:\data\shard2db
# Shard 서버 시작
mongod --shardsvr --replSet shard2ReplSet --dbpath d:\data\shard2db --port 27022
# 레플리카 세트 구성
mongo --port 27022
rs.initiate({
_id: "shard2ReplSet",
members: [{ _id: 0, host: "localhost:27022" }]
})
2.3 Query Router 설정
# mongos 시작
mongos --configdb configReplSet/localhost:27019,localhost:27020,localhost:27021 --port 27017
# 샤드 추가
mongo --port 27017
# Shard 1 추가
sh.addShard("shard1ReplSet/localhost:27018")
# Shard 2 추가
sh.addShard("shard2ReplSet/localhost:27022")
# 상태확인
sh.status()
3. 샤드 클러스터로 데이터 복원
백업된 데이터를 새로 구성된 샤드로 복원한다. 이 과정에서 MongoDB는 데이터를 자동으로 적절한 샤드에 분산시킨다.
mongorestore --host <mongos_주소> --port 27017 <백업_경로>
# 백업 데이터 확인
mongos --host localhost --port 27017
# mongos 에서 명령어 날려서 확인
show dbs
use yourDatabaseName
show collections
db.yourCollectionName.find().limit(5)
4. Windows 서비스 등록
여태까지 수행한 내용은 모두 커맨드 창을 통하기 때문에 커맨드 창을 닫으면 서버가 죽는다고 보면 된다. 그러니 Windows 서비스에 반드시 등록해서 백그라운드에서 수행되고 자동 재기동 되도록 설정해주자.
# 서비스 등록
mongod --configsvr --replSet configReplSet --dbpath "C:\data\configdb1" --port 27019 --logpath "C:\data\log\configdb1.log" --logappend --serviceName "MongoDBConfigServer1" --serviceDisplayName "MongoDB Config Server1" --install
mongod --configsvr --replSet configReplSet --dbpath "C:\data\configdb2" --port 27020 --logpath "C:\data\log\configdb2.log" --logappend --serviceName "MongoDBConfigServer2" --serviceDisplayName "MongoDB Config Server2" --install
mongod --configsvr --replSet configReplSet --dbpath "C:\data\configdb3" --port 27021 --logpath "C:\data\log\configdb3.log" --logappend --serviceName "MongoDBConfigServer3" --serviceDisplayName "MongoDB Config Server3" --install
mongod --shardsvr --replSet shard1ReplSet --dbpath "C:\data\shard1db" --port 27018 --logpath "C:\data\log\shard1db.log" --logappend --serviceName "MongoDBShard1Server" --serviceDisplayName "MongoDB Shard 1 Server" --install
mongod --shardsvr --replSet shard2ReplSet --dbpath "D:\data\shard2db" --port 27022 --logpath "D:\data\log\shard2db.log" --logappend --serviceName "MongoDBShard2Server" --serviceDisplayName "MongoDB Shard 2 Server" --install
mongos --configdb configReplSet/localhost:27019,localhost:27020,localhost:27021 --port 27017 --logpath "c:\data\log\mongos.log" --logappend --serviceName "MongoDBRouter" --serviceDisplayName "MongoDB Query Router" --install
# 서비스 시작
net start MongoDBConfigServer1
net start MongoDBConfigServer2
net start MongoDBConfigServer3
net start MongoDBShard1Server
net start MongoDBShard2Server
net start MongoDBRouter
# 참고
# 실패했을 때 일괄삭제
net stop MongoDBConfigServer1
net stop MongoDBConfigServer2
net stop MongoDBConfigServer3
net stop MongoDBShard1Server
net stop MongoDBShard2Server
net stop MongoDBRouter
sc delete MongoDBConfigServer1
sc delete MongoDBConfigServer2
sc delete MongoDBConfigServer3
sc delete MongoDBShard1Server
sc delete MongoDBShard2Server
sc delete MongoDBRouter
'SystemTrading' 카테고리의 다른 글
BackTesting | Data Collector | 데이터 수집기 개발 (0) | 2024.04.10 |
---|---|
BackTesting | Data Collector | 데이터 수집 기획 (0) | 2024.04.05 |
BackTesting | Data Collector | 대신, 키움, eBset 증권 API 연결 (0) | 2024.04.01 |
BackTesting | Data Collection | Refrence (0) | 2024.04.01 |