mongos, config server(레플리카셋), 샤드 여러 개(각각 primary, secondary, arbiter)로 된 클러스터를 운영하며 정리한 내용이다. 호스트 이름과 <password>, appdb 는 예시다.
1. IP 대신 호스트 이름 쓰기
레플리카셋 설정에 IP 를 넣어 두면 서버 IP 가 바뀔 때 멤버를 찾지 못해 클러스터가 멈춘다. 각 서버의 /etc/hosts 에 같은 이름을 등록하고 이름으로 구성한다.
|
1 2 3 4 5 6 7 8 9 10 |
10.0.1.10 mongos 10.0.1.21 cfg1 10.0.1.22 cfg2 10.0.1.23 cfg3 10.0.1.31 s1-1 10.0.1.32 s1-2 10.0.1.33 s1-arb 10.0.1.41 s2-1 10.0.1.42 s2-2 10.0.1.43 s2-arb |
이 경우 MongoDB Compass 같은 외부 클라이언트는 이 이름을 모르기 때문에 레플리카셋으로 접속하면 멤버를 찾지 못한다. 외부에서는 directConnection=true 로 한 서버에 붙거나 mongos 로 접속한다.
2. 종료 순서
mongos를 먼저 내린다.config server를 내린다.- 각 샤드를 내린다. secondary → primary → arbiter 순서.
3. 시작 순서
config server를 먼저 올린다.- 각 샤드를 올린다. arbiter → primary → secondary 순서.
- 마지막으로
mongos를 올린다.
4. 열린 파일 수 늘리기
|
1 2 3 4 5 6 7 8 |
# 실행 중인 프로세스에 바로 적용 sudo prlimit --nofile=500000 --pid $(pgrep -o mongod) # 영구 적용: systemd 유닛에 설정 sudo systemctl edit mongod # [Service] # LimitNOFILE=500000 sudo systemctl restart mongod |
5. 설치 (Ubuntu)
|
1 2 3 4 5 6 |
VER=8.0 curl -fsSL https://www.mongodb.org/static/pgp/server-$VER.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-$VER.gpg echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-$VER.gpg] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/$VER multiverse" \ | sudo tee /etc/apt/sources.list.d/mongodb-org-$VER.list sudo apt update sudo apt install mongodb-org |
6. 레플리카셋 구성
|
1 2 3 4 5 6 7 8 9 10 11 |
// 샤드 1 의 primary 가 될 서버에서 rs.initiate({ _id: "shard1", members: [ { _id: 0, host: "s1-1:27017" }, { _id: 1, host: "s1-2:27017" } ] }) rs.addArb("s1-arb:27017") rs.status() rs.conf() |
arbiter 를 추가할 때 Reconfig attempted to install a config that would change the implicit default write concern 오류가 나면 기본 write concern 을 먼저 정한다.
|
1 2 |
db.adminCommand({ setDefaultRWConcern: 1, defaultWriteConcern: { w: "majority" } }) rs.addArb("s1-arb:27017") |
IP 로 만든 레플리카셋을 호스트 이름으로 바꿀 때는 rs.reconfig(새설정, { force: true }) 를 쓴다. 멤버 제거는 rs.remove("host:27017").
7. config server 와 샤드 등록
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// config server 3대 중 하나에서 rs.initiate({ _id: "configserver", configsvr: true, members: [ { _id: 0, host: "cfg1:27017" }, { _id: 1, host: "cfg2:27017" }, { _id: 2, host: "cfg3:27017" } ] }) // mongos 에서 sh.addShard("shard1/s1-1:27017,s1-2:27017") sh.addShard("shard2/s2-1:27017,s2-2:27017") db.adminCommand({ listShards: 1 }) |
8. 컬렉션 샤딩
|
1 2 3 4 5 6 7 |
sh.enableSharding("appdb") // 6.0 부터는 생략해도 됨 use appdb db.transactions.createIndex({ _id: "hashed" }) sh.shardCollection("appdb.transactions", { _id: "hashed" }) db.transactions.getShardDistribution() // 샤드별 분포 sh.status() |
- 범위 조회가 많으면
{ userId: "hashed", createdAt: 1 }처럼 복합 샤드 키를 쓴다. - 샤드 키를 잘못 골랐으면 5.0 부터
sh.reshardCollection("appdb.transactions", { _id: "hashed" })로 바꿀 수 있다.
9. balancer
|
1 2 3 4 |
sh.getBalancerState() // 켜져 있는지 sh.isBalancerRunning() // 지금 청크를 옮기는 중인지 sh.stopBalancer() // 백업, 점검 전에 멈춤 sh.startBalancer() |
10. 계정
|
1 2 3 4 5 6 7 8 9 |
use admin db.createUser({ user: "app", pwd: "<password>", roles: [ { role: "readWrite", db: "appdb" }, { role: "dbAdmin", db: "appdb" } ] }) db.updateUser("app", { roles: [ { role: "readWrite", db: "appdb" } ] }) db.changeUserPassword("app", "<new_password>") db.getUsers() |
11. 백업과 복원
|
1 2 3 4 5 6 7 8 9 10 |
# DB 전체 mongodump --host s1-1 --port 27017 -u root --authenticationDatabase admin --db appdb --out ./dump # 컬렉션 하나를 날짜 범위로 mongodump --host s1-1 -u root --authenticationDatabase admin --db appdb --collection transactions \ --query '{ "createdAt": { "$gte": { "$date": "2023-08-01T00:00:00Z" }, "$lt": { "$date": "2023-08-08T00:00:00Z" } } }' \ --out ./dump # 복원 (다른 DB 이름으로 넣을 때는 --nsFrom / --nsTo) mongorestore --host mongos -u root --authenticationDatabase admin --nsInclude "appdb.*" ./dump |
샤드 클러스터는 mongos 를 통해 백업하고 복원한다. 예전의 mongorestore --db … --dir … 형식은 deprecated 라 --nsInclude 를 쓴다.
12. 레플리카셋 설정을 지우고 단독 서버로 돌릴 때
|
1 2 3 |
// mongod.conf 에서 replication.replSetName 을 주석 처리하고 재시작한 뒤 use local db.system.replset.deleteMany({}) |
참고: Learn MongoDB The Hard Way – Sharding
관련 글: MongoDB 집계(aggregation) 정리 – count, distinct, $group, 파이프라인

Leave a Reply