MongoDB 샤딩: 예제가 포함된 단계별 튜토리얼

⚡ 스마트 요약

MongoDB 샤딩은 대규모 데이터 세트를 여러 서버에 분산된 더 작은 하위 집합으로 분할합니다. MongoDB 인스턴스를 분할하여 단일 서버의 CPU 부하를 줄입니다. 샤드 클러스터는 샤드, 구성 서버 및 라우터를 결합하여 스토리지 및 쿼리 처리량을 수평적으로 확장합니다.

  • 🧩 핵심 개념: 샤딩은 하나의 논리적 컬렉션을 여러 샤드에 분산시키지만, 쿼리는 여전히 데이터를 단일 컬렉션으로 처리합니다.
  • 🏗️ Cluster 구성 요소 : 샤딩 클러스터는 데이터용 샤드, 메타데이터용 구성 서버, 클라이언트 명령을 전달하는 라우터가 필요합니다.
  • ⚙️ 구현 흐름: 설정 서버를 시작하고, MongoDB 라우터를 실행하고, 샤드를 추가한 다음, 데이터베이스와 컬렉션에서 샤딩을 활성화합니다.
  • 🔑 조각 키: 샤드 키는 문서가 어떻게 배포되는지를 결정하므로 높은 카디널리티와 균일한 액세스 패턴이 필수적입니다.
  • 📈 주요 이점 : 샤딩은 단일 서버를 업그레이드하는 대신 스토리지와 워크로드를 분산시켜 수평적 확장성을 제공합니다.

MongoDB 샤딩: 예제가 포함된 단계별 튜토리얼

샤딩이란? MongoDB?

샤딩은 개념이다. MongoDB, 대규모 데이터 세트를 여러 개의 작은 데이터 세트로 분할합니다. MongoDB 인스턴스.

때로는 내부 데이터 MongoDB 데이터 세트의 규모가 매우 커서 이러한 대규모 데이터 세트에 대한 쿼리는 서버의 CPU 사용률을 크게 높일 수 있습니다. 이러한 상황을 해결하기 위해, MongoDB 기본적으로 여러 데이터 세트를 분할하는 샤딩(Sharding)이라는 개념이 있습니다. MongoDB 인스턴스.

규모가 클 수 있는 컬렉션은 실제로 여러 컬렉션, 또는 샤드라고 불리는 것들로 분할됩니다. 논리적으로 모든 샤드는 하나의 컬렉션처럼 작동합니다.

샤딩의 장점 MongoDB

샤딩 클러스터를 구현하기 전에 팀이 샤딩을 도입하는 이유를 이해하는 것이 도움이 됩니다. 주요 이점은 다음과 같습니다.

  • 수평적 확장성: 데이터는 단일 머신의 용량을 계속해서 늘리는 대신 여러 범용 서버에 분산됩니다.
  • 더 높은 처리량: 읽기 및 쓰기 작업은 샤드 전체에서 병렬로 실행되므로 클러스터는 초당 더 많은 요청을 처리할 수 있습니다.
  • 저장 용량 증가: 모든 샤드의 디스크를 합치면 단일 서버가 저장할 수 있는 것보다 훨씬 큰 데이터 세트를 저장할 수 있습니다.
  • 고가용성: 각 샤드가 복제 세트로 배포될 경우, 단일 노드의 장애가 클러스터 전체에 영향을 미치지 않습니다.
  • 균형 부하: The MongoDB 로드 밸런서는 특정 샤드가 핫스팟이 되는 것을 방지하기 위해 데이터 청크를 자동으로 재분배합니다.

이러한 장점들을 종합해 볼 때, 샤딩은 확장성을 확보하는 표준적인 접근 방식이 되었습니다. MongoDB 단일 서버의 한계를 넘어섭니다.

샤딩을 구현하는 방법

샤드는 클러스터를 사용하여 구현되는데, 클러스터는 샤드들의 그룹에 불과합니다. MongoDB 인스턴스.

샤드의 구성 요소는 다음과 같습니다.

  1. 파편 – 이게 기본이고, 이건 별거 아니다. MongoDB 데이터의 하위 집합을 보유하는 인스턴스입니다. 프로덕션 환경에서는 모든 샤드가 복제본 세트의 일부여야 합니다.
  2. 구성 서버 - 이것은 MongoDB 클러스터에 대한 메타데이터, 즉 다양한 정보에 대한 내용을 담고 있는 인스턴스입니다. MongoDB 샤드 데이터를 저장할 인스턴스입니다.
  3. 라우터 - 이것은 MongoDB 이 인스턴스는 기본적으로 클라이언트가 보낸 명령을 올바른 서버로 전달하는 역할을 합니다.

단계별 샤딩 Cluster 예시

단계 1) 구성 서버에 대해 별도의 데이터베이스를 만듭니다.

mkdir /data/configdb

단계 2) 시작 MongoDB 구성 모드의 인스턴스입니다. 예를 들어, 구성 서버로 사용할 Server D라는 서버가 있다고 가정해 보겠습니다. 이 서버를 구성 서버로 구성하려면 아래 명령을 실행해야 합니다.

mongod --configdb ServerD:27019

단계 3) 구성 서버를 지정하여 MongoDB 인스턴스를 시작합니다.

mongos --configdb ServerD:27019

단계 4) mongo 셸에서 mongos 인스턴스에 연결합니다.

mongo --host ServerD --port 27017

단계 5) 클러스터에 추가해야 할 서버 A와 서버 B가 있는 경우 아래 명령을 실행하십시오.

sh.addShard("ServerA:27017")
sh.addShard("ServerB:27017")

단계 6) 데이터베이스에 샤딩을 활성화합니다. 예를 들어 Employeedb 데이터베이스를 샤딩해야 하는 경우 아래 명령어를 실행합니다.

sh.enableSharding("Employeedb")

단계 7) 컬렉션에 샤딩을 활성화합니다. 예를 들어 Employee 컬렉션을 샤딩해야 하는 경우 아래 명령을 실행합니다.

sh.shardCollection("Employeedb.Employee", { "Employeeid": 1, "EmployeeName": 1 })

샤드 키를 선택하는 방법 MongoDB

샤드 키는 인덱싱된 필드 또는 필드 집합입니다. MongoDB 키는 각 문서를 어느 샤드에 저장할지 결정하는 데 사용됩니다. 키가 데이터 분산을 좌우하기 때문에, 샤딩 환경에서 키를 잘 선택하는 것은 가장 중요한 결정입니다. 잘못된 키를 사용하면 데이터와 트래픽이 하나의 샤드에 집중되어 샤딩의 이점이 상쇄됩니다.

강력한 샤드 키는 일반적으로 다음과 같은 특징을 가지고 있습니다.

  • 높은 카디널리티: 해당 필드는 다양한 값을 가질 수 있어야 데이터를 여러 개의 세분화된 덩어리로 나눌 수 있습니다.
  • 저주파: 어떤 단일 값도 지배적이어서는 안 됩니다. 그렇지 않으면 해당 값을 공유하는 문서들이 하나의 샤드에 몰리게 됩니다.
  • 비단조적 변화: 타임스탬프처럼 항상 증가하는 키는 모든 새로운 쓰기 작업을 동일한 샤드로 전송하여 핫스팟을 생성합니다.

MongoDB 이 시스템은 키를 기반으로 두 가지 샤딩 전략을 지원합니다. 범위 샤딩은 데이터를 연속적인 범위로 나누어 범위 쿼리에 적합하며, 해시 샤딩은 해시 함수를 적용하여 쓰기 작업을 샤드 전체에 고르게 분산합니다. 일반적으로 쓰기 작업이 많을 때는 해시 샤딩으로 시작하고, 범위 기반 읽기 작업이 많아지면 범위 샤딩으로 전환합니다. 어떤 전략을 선택하든, 데이터가 로드된 후에는 샤드 키를 쉽게 변경할 수 없으므로 적용하기 전에 실제 쿼리 패턴을 사용하여 키를 테스트해야 합니다.

샤딩과 복제의 차이점 MongoDB

샤딩과 복제는 상호 보완적이지만 서로 다른 기능입니다. 아래 표는 두 기능의 차이점을 명확히 보여주므로, 이를 통해 각 기능을 올바르게 적용할 수 있습니다. 실제 운영 환경에서는 프로덕션 클러스터에서 샤딩과 복제를 함께 사용합니다.

아래 샤딩 복제
목적 데이터를 분할하여 수평적으로 확장합니다. 데이터를 보호하고 언제든지 사용할 수 있도록 유지하세요.
각 노드의 데이터 데이터의 부분집합(하나의 샤드) 데이터의 전체 사본
주요 이점 더 많은 저장 용량 및 처리량 내결함성 및 읽기 확장
주요 구성 요소 샤드, 설정 서버, 몽고메리 라우터 주요 및 보조 구성원

요약하자면, 샤딩은 확장성에 대한 요구를 충족하고, 복제는 가용성에 대한 요구를 충족하며, 안정적인 배포는 이 둘을 모두 결합한 것입니다.

자주 묻는 질문

예. AI 도구는 쿼리 패턴과 필드 카디널리티를 분석하여 샤드 키 후보를 제안하고 단조 증가 필드에 대해 경고할 수 있습니다. 키는 나중에 변경하기 어렵기 때문에 권장 사항을 적용하기 전에 실제 워크로드를 통해 검증해야 합니다.

예. AI 기반 모니터링은 가능합니다. trac데이터 증가, CPU 부하 및 쿼리 지연 시간을 분석하여 단일 서버가 과부하될 시점을 예측합니다. 이를 통해 샤딩을 실행해야 할 적절한 시점을 파악할 수 있지만, 엔지니어는 실행 전에 용량 계획을 확인해야 합니다.

범위 기반 샤딩은 데이터를 연속적인 값 범위로 분할하여 범위 쿼리에 적합하지만, 데이터 덩어리가 고르지 않을 위험이 있습니다. 해시 기반 샤딩은 키를 해시하여 쓰기 작업을 샤드 전체에 고르게 분산시켜 쓰기 분산을 개선하지만, 범위 스캔 효율성은 떨어집니다.

예. 데이터베이스에서 샤딩을 활성화하고, 선택한 샤드 키에 인덱스가 있는지 확인한 다음, 네임스페이스에서 sh.shardCollection()을 실행하십시오. MongoDB 기존 문서를 사용 가능한 샤드에 자동으로 여러 조각으로 분산시키기 시작합니다.

이 게시물을 요약하면 다음과 같습니다.