Docs Menu
Docs Home
/
MongoDB Atlas
/ /

Atlas Search 인덱스 성능

이 페이지의 내용

  • 리소스 요구 사항
  • 인덱스 크기 및 구성
  • 고려 사항
  • Atlas Search 인덱스 생성 및 업데이트
  • 궁극적 일관성 및 인덱싱 지연 시간
  • 문서 매핑 폭발
  • 소스 필드 저장
  • 확장 고려 사항
  • Atlas Search 업그레이드
  • 인덱싱 성능 확장
  • Atlas 클러스터 구성 변경

중요

2,100,000,000 이상의 인덱스 객체가 있거나 곧 갖게 될 컬렉션에 대해 Atlas Search 인덱스를 생성하는 경우클러스터샤딩해야 합니다.

Atlas Search 인덱스를 생성할 때 필드 매핑은 기본적으로 동적으로 설정되며, 컬렉션에서 동적으로 인덱싱할 수 있는 모든 데이터 유형이 인덱싱됩니다. 강조 표시 활성화와 같은 다른 옵션을 사용하면 인덱스가 더 많은 디스크 공간을 차지할 수도 있습니다. 다음과 같은 방법으로 Atlas Search 인덱스의 크기와 성능 공간을 줄일 수 있습니다:

  • 사용자 지정 인덱스 정의 를 통해 인덱싱되는 데이터의 양과 유형을 제한합니다.

  • 인덱스 정의에서 문자열 유형을 지정할 때 store 옵션을 false 로 설정합니다.

참고

일부 제한 사항은 M0, M2M5 cluster에 대한 Atlas 검색에만 적용됩니다. 자세히 알아보려면 Atlas Search 무료 및 공유 티어 제한을 참조하세요.

일부 인덱스 구성 옵션으로 인해 인덱스가 디스크 공간의 상당 부분을 차지할 수 있습니다. 경우에 따라 인덱스가 데이터 크기보다 몇 배 더 커질 수 있습니다. 이는 예상된 동작이지만 다음과 같은 인덱싱 중심 기능을 알고 있어야 합니다.

Atlas Search autocomplete 연산자는 애플리케이션에서 입력할 때 검색과 유사한 기능을 빌드하는 데 사용할 수 있습니다. Atlas Search autocomplete 완성 필드 유형은 특히 다음과 같은 경우에 큰 인덱스를 생성할 수 있습니다:

  • nGram 토큰화사용

  • minGrams에서maxGrams 까지의 범위를 넓게 설정합니다.

  • 수백만 개의 문서가 있는 컬렉션에서 minGram 값을 1 로 설정합니다.

다음을 수행하여 autocomplete 유형 인덱스에 사용되는 공간을 줄일 수 있습니다.

  • minGramsmaxGrams의 범위를 최소로 줄이세요. 일반적으로 쿼리하려는 필드에서 가장 긴 단어의 글자 수를 maxGrams로 설정하는 것을 권장합니다. 확실하지 않은 경우 영어 필드의 경우 maxGrams 값을 10로 시작하는 것이 좋습니다.

  • Atlas Search는 지정된 문자열에 대해 edgeGram 또는 rightEdgeGram 토큰화보다 nGram에 대해 더 많은 토큰을 생성하므로 nGram 토큰화 전략을 피합니다.

string 필드를 자동 완성 유형으로 인덱싱할 때 다음과 같은 이점을 위해 필드를 Atlas Search 문자열 유형으로 인덱싱하는 것이 좋습니다.

Atlas Search는 복제본 세트 또는 단일 샤드에서 2,100,000,000 보다 큰 인덱스에 대한 변경 사항 복제를 중지하며, 여기서 인덱싱된 각 내장된 문서는 단일 객체로 계산됩니다. embeddedDocuments 필드 유형을 사용하면 이 제한을 초과하는 객체 인덱싱이 발생하여 인덱스가 Stale 쿼리 가능 상태로 전환되고 오래된 결과가 발생할 수 있습니다.

정확한 인덱스 객체 수는 문서 변경 및 삭제 속도에 따라 달라질 수 있습니다. Lucene Docs의 최대 검색 수 지표는 모든 인덱스에서 복제본 세트 또는 샤드당 현재 인덱스 객체 수의 상한을 제공합니다. 다음을 수행하여 단일 인덱스의 예상 인덱스 객체 수를 추정할 수 있습니다.

  1. 문서당 인덱스 객체 수를 계산합니다. 모든 중첩 수준에서 각 내장된 문서는 별도의 인덱스 객체로 계산됩니다.

    total number of index objects = 1 + number of nested embedded documents
  2. 문서당 인덱스 객체 수에 컬렉션의 총 문서 수를 곱합니다.

    total number of index objects x total number of documents in collection

이 근사치는 하한입니다.

예제

튜토리얼 에 설명된 라는 이름의 컬렉션schools 있고 컬렉션에 1000 다음과 유사한 문서가 포함되어 있다고 가정해 보겠습니다.

{
"_id": 0,
"name": "Springfield High",
"mascot": "Pumas",
"teachers": [
{
"first": "Jane",
"last": "Smith",
"classes": [
{
"subject": "art of science",
"grade": "12th"
},
... // 2 more embedded documents
]
},
... // 1 more embedded document
],
"clubs": {
"stem": [
{
"club_name": "chess",
"description": "provides students opportunity to play the board game of chess informally and competitively in tournaments."
},
... // 1 more embedded document
],
... // 1 more embedded document
}
}

이제 schools 컬렉션의 다음 필드에 대한 인덱스 정의를 살펴보겠습니다.

teachers 문서 배열은 동적 매핑이 활성화된 embeddedDocuments 유형으로 인덱싱됩니다. 그러나 classes 필드 는 인덱싱되지 않습니다. 다음을 사용하여 인덱스 객체를 계산합니다.

  1. 문서당 인덱스 객체 수를 계산합니다.

    Number of ``teachers`` embedded documents = up to 2
    Total number of index objects per document = 1 + 2 = 3
  2. 컬렉션의 총 문서 수를 곱합니다.

    Number of documents in the collection = 1000
    Number of index objects per document = 3
    Total number of index objects for collection = 1000 x 3 = 3000

teachersteachers.classes 라는 이름의 문서 배열은 동적 매핑이 활성화된 embeddedDocuments 유형으로 인덱싱됩니다. 다음을 사용하여 인덱스 객체를 계산합니다.

  1. 문서당 인덱스 객체 수를 계산합니다.

    Number of documents = 1
    Number of ``teachers`` embedded documents = up to 2
    Number of ``classes`` embedded documents = up to 3
    Number of index objects per document = 1 + ( 2 x 3 ) = 7
  2. 컬렉션의 총 문서 수를 곱합니다.

    Number of documents in the collection = 1000
    Number of index objects per document = 7
    Total number of index objects: 1000 x 7 = 7000

컬렉션에 2,100,000,000 인덱스 객체를 생성할 수 있는 대규모 배열이 있는 경우 embeddedDocuments 유형의 인덱스가 포함된 클러스터를 샤딩 해야 합니다.

동일한 필드를 사용하여 데이터를 필터링하고 패싯하려면 다음 Atlas Search 유형으로 필드를 인덱싱하는 것이 좋습니다.

패싯을 위해 다른 필드를 기준으로 데이터를 필터링하는 예는 Atlas Search에서 패싯을 사용하는 방법 튜토리얼을 참조하세요.

multi분석기를 사용하여 동일한 필드를 여러 가지 방법으로 분석하면 특히 값이 매우 긴 필드를 분석할 때 큰 인덱스가 발생할 수 있습니다.

Atlas Search 언어 분석기 를 사용하여 여러 언어를 인덱싱할 수 있습니다. Atlas Search에서 내장 분석기를 제공하는 언어 목록은 언어 분석기 를 참조하세요. 예제는 다국어 Atlas Search 쿼리를 실행하는 방법 튜토리얼을 참조하세요. 현재 기본 제공 언어 분석기 목록에 없는 언어를 인덱싱하고 쿼리하려면 사용자 지정 분석기 를 만들면 됩니다. 예제는 사용자 지정 언어 분석기 예제를 참조하세요.

컬렉션 각 언어에 대해 하나의 문서가 있다고 가정해 보겠습니다. 다음 사항을 고려하세요.

  • 언어 분석기 를 사용하여 동일한 인덱스의 필드를 별도로 인덱싱할 수 있습니다. 단일 인덱스는 동일한 쿼리에서 여러 언어를 지원할 수 있습니다.

  • 또는 언어별로 인덱스를 생성할 수 있으며, 이는 다양한 언어의 문서를 격리하는 데 유용합니다. 각 인덱스는 변경 스트림 커서이므로 유지 관리 비용이 많이 들 수 있습니다.

  • 언어 문서가 상위 문서 안에 중첩되어 있는 경우 단일 인덱스를 만들 수 있습니다. 그러나 인덱스 정의 페이로드가 크고 쿼리가 복잡할 수 있습니다.

이러한 데이터 모델 및 인덱스 정의에 대해 자세히 알아보려면 MongoDB 블로그를 참조하세요.

동의어 소스 컬렉션이 작은 경우에만 동의어 소스 컬렉션에 대한 삽입 및 업데이트가 빠릅니다. 최상의 성능을 위해 동의어 소스 컬렉션에 대한 삽입 및 업데이트를 일괄 처리하는 것이 좋습니다.

동의어 매핑 정의에는 데이터베이스의 동의어 컬렉션에서 사용하는 디스크 공간 외에 추가 디스크 공간이 필요하지 않습니다. 그러나 동의어 매핑은 메모리에 아티팩트를 생성하므로 문서가 많은 동의어 컬렉션의 경우 Atlas Search는 메모리를 더 많이 차지하는 아티팩트를 생성합니다.

Atlas Search 인덱스를 만드는 데는 많은 리소스가 필요합니다. 인덱스가 빌드되는 동안 Atlas cluster의 성능이 영향을 받을 수 있습니다.

Atlas는 컬렉션의 모든 쓰기를 복제합니다. 즉, Atlas Search 인덱스가 있는 각 컬렉션에 대해 해당 컬렉션에 정의된 Atlas Search 인덱스의 양만큼 쓰기가 증폭됩니다.

경우에 따라 Atlas Search 인덱스를 다시 작성해야 하는 경우도 있습니다. Atlas Search 인덱스를 재구축하는 것도 리소스를 소비하며 데이터베이스 성능에 영향을 미칠 수 있습니다. Atlas Search는 다음과 같은 경우에만 인덱스를 자동으로 다시 작성합니다:

  • 인덱스 정의 변경

  • 중요한 변경 사항이 포함된 Atlas Search 버전 업데이트

  • 인덱스 손상과 같은 하드웨어 관련 문제

참고

Atlas Search는 다운타임 없는 인덱싱을 지원하므로 Atlas Search가 인덱스를 재구축하는 동안에도 검색 쿼리를 계속 실행할 수 있습니다. Atlas Search는 새 인덱스가 빌드되는 동안 기존 인덱스를 최신 상태로 유지합니다. 이 작업을 위해 이전 인덱스에서 사용하는 디스크 공간의 125%에 해당하는 디스크 여유 공간을 할당하는 것이 좋습니다. 인덱스가 현재 사용하고 있는 디스크 공간의 양은 사용된 디스크 공간 검색 메트릭에서 확인할 수 있습니다.

디스크 공간이 부족하여 인덱스 리빌드(rebuild)에 실패하는 경우, 증가된 수요를 충족하기 위해 cluster 용량을 일시적으로 확장하는 것이 좋습니다. 자동 스케일링이 활성화된 cluster의 경우에도 스토리지 문제 해결에 설명된 대로 이 변경을 수동으로 수행할 수 있습니다.

별도의 검색 노드를 배포한 경우, Atlas는 인덱스 재구축 기간 동안 추가 검색 노드를 자동으로 배포하므로 추가 디스크 여유 공간을 할당할 필요가 없습니다.

Atlas Search가 인덱스를 다시 빌드하면 사용자 측의 추가 조치 없이 이전 인덱스가 자동으로 교체됩니다.

Atlas Search는 궁극적 일관성을 지원하지만 더 강력한 일관성을 보장하지는 않습니다. 이는 MongoDB 컬렉션에 삽입되고 Atlas Search에 의해 인덱싱된 데이터를 $search 쿼리에 즉시 사용할 수 없음을 의미합니다.

Atlas Search는 MongoDB 변경 스트림 에서 데이터를 읽고 비동기 프로세스에서 해당 데이터를 인덱싱합니다. 이 프로세스는 일반적으로 매우 빠르지만 복제 지연 시간, 시스템 리소스 가용성 및 인덱스 정의의 복잡성에 의해 영향을 받을 수 있습니다. Atlas Search 인덱스가 많으면 Atlas Search 인덱스의 복제 지연 및 지연 시간이 발생할 수도 있습니다.

매핑 폭발은 Atlas Search가 임의의 키로 문서를 인덱싱하고 동적 매핑 이 있을 때 발생합니다. mongot 프로세스는 점점 더 많은 양의 메모리를 소비할 수 있으며 충돌할 수 있습니다. 인덱스에 너무 많은 필드를 추가하면 매핑 폭발이 발생할 수 있습니다. 이 문제를 해결하려면 클러스터를 업그레이드하거나 데이터의 모든 필드를 인덱싱하지 않는 정적 매핑 을 사용할 수 있습니다.

와일드카드 경로를 사용하여 필드를 검색할 때는 튜플과 유사한 스키마를 사용하도록 검색을 설계하세요. 키-값 스키마를 사용하는 와일드카드 경로 검색을 수행하는 경우 Atlas Search는 각 키를 자체 필드로 인덱스하므로 매핑이 폭발적으로 증가할 수 있습니다.

예제

키-값 스키마의 예는 다음과 같습니다:

ruleBuilder: {
ruleName1: <data>,
ruleName2: <data>,
.....
ruleName1025: <data>
}

동일한 데이터가 튜플형 스키마를 사용하도록 재구조화된 예는 다음과 같습니다:

{
ruleBuilder: [
{name: ruleName1, data: <data>},
{name: ruleName2, data: <data>},
...
{name: ruleName1025, data: <data>}
]
}

$sort, $match, $group, $skip과 같은 후속 집계 파이프라인 단계의 성능을 개선하고 Atlas Search에 저장할 필드를 구성할 수 있습니다. 원본 문서와 일치하는 데이터 세트가 너무 커서 전체 데이터 조회가 비효율적인 경우 이 최적화를 사용합니다. Atlas Search에 특정 필드를 저장하고 저장된 필드만 반환하는 방법에 대해 자세히 알아보려면 Atlas Search 인덱스에서 저장된 소스 필드 정의저장된 소스 필드 반환을 참조하세요.

후속 단계에 필요한 최소한의 필드만 저장하는 것이 좋습니다. 필요한 경우 파이프라인 단계 끝에 $lookup 을(를) 사용하여 예시 와 같이 전체 문서를 검색할 수 있습니다. 불필요한 필드를 저장하면 디스크 사용률이 증가하고 인덱싱 및 쿼리 중 성능에 부정적인 영향을 미칠 수 있습니다.

Atlas Search는 Atlas cluster에 배포됩니다. 새 버전의 Atlas Search를 배포할 때, Atlas cluster는 쿼리 결과를 반환하는 과정에서 잠시 네트워크 오류를 경험할 수 있습니다. 배포 중 문제를 완화하고 애플리케이션에 미치는 영향을 최소화하기 위해 다음 사항들을 고려하세요:

  • 애플리케이션에 재시도 로직을 구현하세요.

  • Atlas 유지 관리 기간을 구성합니다.

    참고

    Atlas Search 업그레이드는 유지 관리 기간 동안에만 시작되며, 유지 관리 기간 후에도 계속될 수 있습니다.

각 릴리스의 변경 사항에 대해 자세히 알아보려면 Atlas Search 변경 로그(Changelog)를 참조하세요.

Atlas Search 인덱스의 초기 동기화 및 정상 상태 인덱싱을 확장하기 위해 cluster를 더 많은 코어를 가진 상위 티어로 업그레이드할 수 있습니다. Atlas Search는 초기 동기화 및 정상 상태 인덱싱을 실행하기 위해 사용 가능한 모든 코어의 일정 비율을 사용합니다. cluster를 업그레이드하여 새로운 코어를 사용할 수 있게 되면 성능이 향상됩니다.

로컬 NVMe 스토리지 유형을 사용하도록 배포를 재구성하거나 NVMe 기반 클러스터를 업스케일링하는 경우, 각 노드가 기본 구성 또는 업스케일 작업을 완료한 후 Atlas Search는 구성된 모든 Atlas Search 인덱스의 초기 동기화를 수행합니다. Atlas Search 인덱스 초기 동기화가 클러스터 구성 변경을 완료하는 데 걸린 시간보다 오래 걸리는 경우 Atlas 클러스터의 모든 노드에서 초기 동기화가 완료될 때까지 $search 쿼리를 실행할 수 없습니다.

Atlas 클러스터와 $search 워크로드를 독립적으로 확장하려면 전용 검색 노드를 배포하는 것이 좋습니다. 전용 검색 노드는 mongot 프로세스만 실행하며 mongot 프로세스의 가용성과 워크로드 밸런싱을 개선합니다.

돌아가기

성능 개선