MongoDB - 샤딩: 초보자 가이드
안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 MongoDB 샤딩의 세상으로 흥미로운 여행을 떠납니다. 프로그래밍에 새로운 사람이라고 걱정하지 마세요 - 나는 당신의 친절한 안내자가 되겠습니다. 우리는 이 주제를 단계별로 탐구하겠습니다. 이 튜토리얼의 끝까지 배우면, 프로처럼 샤딩할 수 있을 것입니다! 시작해 보겠습니다!
샤딩의 이유
자, 바쁜 도서관을 운영하고 있다고 상상해 보세요. 책의 수가 점점 늘어나면서, 모든 책을 하나의 큰 방에 두는 것이 문제가 되기 시작합니다. 너무 혼잡해지고, 책을 찾는 데 더 많은 시간이 걸립니다. 이럴 때 어떻게 하세요? 다양한 카테고리의 책을 담는 여러 방으로 확장을 고려할 수 있습니다. 샤딩이 데이터베이스에 하는 일은 바로 이와 같습니다!
샤딩은 데이터를 여러 대의 기계로 분산하는 방법입니다. 데이터베이스에 초능력을 부여하여, 더 많은 데이터를 처리하고 단일 서버보다 더 많은 요청을 처리할 수 있게 합니다.
샤딩을 사용하는 주요 이유는 다음과 같습니다:
- 확장성: 데이터가 증가하면, 더 많은 서버를 추가하여 처리할 수 있습니다.
- 성능: 쿼리가 여러 서버에서 병렬적으로 처리됩니다.
- 높은 가용성: 하나의 서버가 다운되더라도 다른 서버들이 여전히 요청을 처리할 수 있습니다.
MongoDB에서의 샤딩
이제 샤딩이 왜 중요한지 이해했으므로, MongoDB가 어떻게 이를 구현하는지 살펴보겠습니다.
기본 개념
코드로 들어가기 전에, 몇 가지 중요한 용어를 알아보겠습니다:
- 샤드: 데이터의 일부를 저장하는 단일 서버나 레플리카 셋.
- 샤드 키: 데이터를 샤드로 분산하는 데 사용되는 필드.
- 청크: 샤드 키 값의 연속 범위.
- 설정 서버: 클러스터에 대한 메타데이터를 저장하는 특별한 MongoDB 인스턴스.
- Mongos: 요청을 적절한 샤드로 yönlendiren 라우팅 서비스.
샤드 클러스터 설정
샤드 클러스터를 기본적으로 설정하는 과정을 단계별로 따라보겠습니다. 처음에는 복잡하게 보일 수 있지만, 단계별로 풀어보겠습니다!
단계 1: 설정 서버 시작
먼저, 설정 서버를 시작해야 합니다. 실제 환경에서는 일반적으로 세 개를 사용하지만, 이 예제에서는 하나를 사용하겠습니다:
mongod --configsvr --replSet configReplSet --port 27019 --dbpath /data/configdb
이 명령은 설정 서버로 MongoDB 인스턴스를 시작하고, 포트 27019를 사용하며 /data/configdb
에 데이터를 저장합니다.
단계 2: 설정 서버 레플리카 셋 시작
이제 설정 서버 레플리카 셋을 시작해 보겠습니다:
rs.initiate({
_id: "configReplSet",
members: [{ _id: 0, host: "localhost:27019" }]
})
이 명령은 설정 서버를 단일 멤버 레플리카 셋으로 설정합니다.
단계 3: 샤드 서버 시작
다음으로 두 개의 샤드 서버를 시작하겠습니다:
mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/shard1
mongod --shardsvr --replSet shard2 --port 27020 --dbpath /data/shard2
이 명령은 두 개의 MongoDB 인스턴스를 샤드 서버로 시작하고, 각각 다른 포트를 사용하며 /data/shard1
과 /data/shard2
에 데이터를 저장합니다.
단계 4: 샤드 레플리카 셋 시작
각 샤드에 대해 레플리카 셋을 시작해야 합니다:
// shard1에 대해
rs.initiate({
_id: "shard1",
members: [{ _id: 0, host: "localhost:27018" }]
})
// shard2에 대해
rs.initiate({
_id: "shard2",
members: [{ _id: 0, host: "localhost:27020" }]
})
이 명령은 각 샤드를 단일 멤버 레플리카 셋으로 설정합니다.
단계 5: Mongos 라우터 시작
이제 mongos 라우터를 시작하겠습니다:
mongos --configdb configReplSet/localhost:27019 --port 27017
이 명령은 mongos 인스턴스를 시작하고, 설정 서버의 위치를 지정합니다.
단계 6: 클러스터에 샤드 추가
마지막으로, 클러스터에 샤드를 추가하겠습니다:
sh.addShard("shard1/localhost:27018")
sh.addShard("shard2/localhost:27020")
이 명령은 mongos에 우리의 샤드를 알립니다.
데이터베이스 및 컬렉션에 샤딩 활성화
이제 샤드 클러스터가 설정되었으므로, 데이터베이스와 컬렉션에 샤딩을 활성화하겠습니다:
// 'mydb' 데이터베이스에 샤딩 활성화
sh.enableSharding("mydb")
// 'users' 컬렉션을 'username' 필드를 샤드 키로 사용하여 샤딩
sh.shardCollection("mydb.users", { "username": 1 })
이 명령은 'mydb' 데이터베이스에 샤딩을 활성화하고, 'users' 컬렉션을 'username' 필드를 기준으로 샤딩합니다.
데이터 삽입 및 쿼리
이제 샤드 설정이 완료되었으므로, 데이터를 삽입하고 어떻게 작동하는지 보겠습니다:
// mongos에 연결
mongo --port 27017
// 데이터베이스로 전환
use mydb
// 몇 가지 사용자 삽입
for (let i = 0; i < 10000; i++) {
db.users.insertOne({ username: "user" + i, age: Math.floor(Math.random() * 100) })
}
// 특정 사용자 검색
db.users.find({ username: "user5000" })
이 쿼리를 실행할 때, mongos는 요청을 적절한 샤드로 라우팅합니다.
샤딩 방법
MongoDB는 데이터를 샤드로 분산하는 여러 가지 샤딩 방법을 제공합니다:
방법 | 설명 | 사용 사례 |
---|---|---|
범위 샤딩 | 샤드 키 값에 따라 데이터를 범위로 나누는 방법 | 샤드 키가 좋은 카디널리티를 가지고 자주 변경되지 않는 경우에 적합 |
해시 샤딩 | 샤드 키의 해시를 사용하여 데이터를 분산 | 데이터 분산이 균형 잡혀 있고 단조增하는 샤드 키에 적합 |
존 샤딩 | 샤드 키 범위를 특정 샤드와 연결 | 데이터 로컬리티나 티어드 스토리지에 유용 |
결론
축하합니다! MongoDB 샤딩의 세상으로 첫 걸음을 뗐습니다. 우리는 샤딩이 중요한 이유, 기본 샤드 클러스터 설정 방법, 그리고 샤드 컬렉션과의 작업 방법을 다루었습니다.
샤딩은 강력한 도구이지만, 데이터베이스 설정에 복잡성을 추가합니다. 항상 특정 사용 사례에 샤딩이 필요한지 신중하게 고려하세요. MongoDB 여정을 계속하면서 더 고급 샤딩 개념과 기술을 만나게 될 것입니다.
계속 연습하고, 호기심을 유지하면, 얼마 지나지 않아 샤딩 전문가가 될 것입니다! 미래의 데이터베이스 건축가 여러분, 행복하게 코딩하세요!
Credits: Image by storyset