Atlas Search 인덱스 성능
이 페이지의 내용
리소스 요구 사항
인덱스 크기 및 구성
중요
컬렉션에 대해 Atlas Search 인덱스를 생성하는 경우 해당 컬렉션이 이미 2,100,000,000 개 이상의 인덱스 객체가 있거나 곧 포함될 예정이라면 반드시 클러스터를 샤딩해야 합니다.
Atlas Search 인덱스를 생성할 때 필드 매핑은 기본적으로 동적으로 설정되며, 컬렉션에서 동적으로 인덱싱할 수 있는 모든 데이터 유형이 인덱싱됩니다. 강조 표시 활성화와 같은 다른 옵션을 사용하면 인덱스가 더 많은 디스크 공간을 차지할 수도 있습니다. 다음과 같은 방법으로 Atlas Search 인덱스의 크기와 성능 공간을 줄일 수 있습니다:
참고
일부 제한 사항은 M0
, M2
및 M5
cluster에 대한 Atlas 검색에만 적용됩니다. 자세히 알아보려면 Atlas Search 무료 및 공유 티어 제한을 참조하세요.
고려 사항
일부 인덱스 구성 옵션으로 인해 인덱스가 디스크 공간의 상당 부분을 차지할 수 있습니다. 경우에 따라 인덱스가 데이터 크기보다 몇 배 더 커질 수 있습니다. 이는 예상된 동작이지만 다음과 같은 인덱싱 중심 기능을 알고 있어야 합니다.
자동 완성 기능
Atlas Search autocomplete 연산자는 애플리케이션에서 입력할 때 검색과 유사한 기능을 빌드하는 데 사용할 수 있습니다. Atlas Search autocomplete 완성 필드 유형은 특히 다음과 같은 경우에 큰 인덱스를 생성할 수 있습니다:
nGram
토큰화사용minGrams
에서maxGrams
까지의 범위를 넓게 설정합니다.수백만 개의 문서가 있는 컬렉션에서
minGram
값을1
로 설정합니다.
다음을 수행하여 autocomplete
유형 인덱스에 사용되는 공간을 줄일 수 있습니다.
minGrams
와maxGrams
의 범위를 최소로 줄이세요. 일반적으로 쿼리하려는 필드에서 가장 긴 단어의 글자 수를maxGrams
로 설정하는 것을 권장합니다. 확실하지 않은 경우 영어 필드의 경우maxGrams
값을10
로 시작하는 것이 좋습니다.Atlas Search는 지정된 문자열에 대해
edgeGram
또는rightEdgeGram
토큰화보다nGram
에 대해 더 많은 토큰을 생성하므로nGram
토큰화 전략을 피합니다.
string
필드를 자동완성 유형으로 인덱싱할 때 다음과 같은 이점을 위해 Atlas Search 문자열 유형으로 필드를 인덱싱하는 것이 좋습니다.
autocomplete 연산자를 사용하면 정확한 일치 항목의 점수를 높일 수 있습니다. 예시에 대해서는 Atlas Search에서 자동 완성 기능을 사용하는 방법 튜토리얼의 고급 예시를 참조하세요.
자동 완성 연산자와 문자열 검색을 지원하는 다른 연산자(예: 텍스트 연산자)를 사용하여 동일한 쿼리에서 동일한 필드를 쿼리합니다. 예를 들어 여러 필드에서 검색 예시를 참조하세요.
내장된 문서
Atlas Search는 인덱싱된 임베디드 문서 각각이 단일 객체로 간주되는 복제본 세트 또는 단일 샤드에서 2,100,000,000 인덱스 객체보다 큰 인덱스에 대한 변경 사항 복제를 중단합니다. embeddedDocuments
필드 유형을 사용하면 이 제한을 초과하여 객체 인덱스가 생성될 수 있으며, 이로 인해 인덱스가 Stale
쿼리 가능 상태로 전환되어 결과가 부실해질 수 있습니다.
정확한 인덱스 객체 수는 문서 변경 및 삭제 속도에 따라 달라질 수 있습니다. Search Max Lucene Docs 지표는 복제본 세트 또는 샤드당 모든 인덱스의 현재 인덱스 객체 수의 상한을 제공합니다. 다음을 수행하여 단일 인덱스의 예상 인덱스 객체 수를 대략적으로 추정할 수 있습니다.
문서당 인덱스 객체 수를 계산합니다. 모든 수준의 중첩에 대해 각 내장된 문서는 별도의 인덱스 객체로 계산됩니다.
total number of index objects = 1 + number of nested embedded documents 문서당 인덱스 객체 수에 컬렉션의 총 문서 수를 곱합니다.
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
필드는 인덱싱되지 않았습니다. 다음을 사용하여 인덱스 객체를 계산합니다.
문서당 인덱스 객체 수를 계산합니다.
Number of ``teachers`` embedded documents = up to 2 Total number of index objects per document = 1 + 2 = 3 컬렉션의 총 문서 수에 곱합니다.
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
이름이 teachers
및 teachers.classes
인 문서 배열은 동적 매핑이 활성화된 embeddedDocuments
유형으로 인덱싱됩니다. 다음을 사용하여 인덱스 객체를 계산합니다.
문서당 인덱스 객체 수를 계산합니다.
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 컬렉션의 총 문서 수에 곱합니다.
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
분석기
multi
분석기를 사용하여 동일한 필드를 여러 가지 방법으로 분석하면 특히 값이 매우 긴 필드를 분석할 때 큰 인덱스가 발생할 수 있습니다.
다국어 검색
Atlas Search 언어 분석기를 사용하면 여러 언어를 인덱싱할 수 있습니다. Atlas Search가 내장 분석기를 제공하는 언어 목록은 언어 분석기를 참조하세요. 예시에 대해서는 Atlas Search 쿼리 실행 방법 튜토리얼을 참조하세요. 현재 내장 언어 분석기 목록에 없는 언어를 인덱싱하고 쿼리하기 위해 사용자 지정 분석기를 만들 수 있습니다. 예시에 대해서는 사용자 지정 언어 분석기 예시를 참조하세요.
컬렉션 각 언어에 대해 하나의 문서가 있다고 가정해 보겠습니다. 다음 사항을 고려하세요.
언어 분석기를 사용하여 동일한 인덱스에서 필드를 개별적으로 인덱싱할 수 있습니다. 단일 인덱스는 동일한 쿼리에서 여러 언어를 지원할 수 있습니다.
또는 언어별 인덱스를 만들 수 있습니다. 이 인덱스는 다양한 언어 문서를 분리하는 데 유용합니다. 각 인덱스는 변경 스트림 커서이므로, 유지 관리 비용이 많이 들 수 있습니다.
언어 문서가 상위 문서 안에 중첩되어 있는 경우 단일 인덱스를 만들 수 있습니다. 그러나 인덱스 정의 페이로드가 크고 쿼리가 복잡할 수 있습니다.
이러한 데이터 모델과 인덱스 정의에 대해 자세히 알아보려면 MongoDB Blog를 참조하세요.
동의어 컬렉션
동의어 소스 컬렉션이 작은 경우에만 동의어 소스 컬렉션에 대한 삽입 및 업데이트가 빠릅니다. 최상의 성능을 위해 동의어 소스 컬렉션에 대한 삽입 및 업데이트를 일괄 처리하는 것이 좋습니다.
동의어 매핑 정의에는 데이터베이스의 동의어 컬렉션에서 사용하는 디스크 공간 외에 추가 디스크 공간이 필요하지 않습니다. 그러나 동의어 매핑은 메모리에 아티팩트를 생성하므로 문서가 많은 동의어 컬렉션의 경우 Atlas Search는 메모리를 더 많이 차지하는 아티팩트를 생성합니다.
Atlas Search 인덱스 생성 및 업데이트
Atlas Search 인덱스를 만드는 데는 많은 리소스가 필요합니다. 인덱스가 빌드되는 동안 Atlas 클러스터의 성능이 영향을 받을 수 있습니다.
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 Search는 Atlas 클러스터에 배포됩니다. 새 버전의 Atlas Search를 배포할 때, Atlas 클러스터는 쿼리 결과를 반환하는 과정에서 잠시 네트워크 오류를 경험할 수 있습니다. 배포 중 문제를 완화하고 애플리케이션에 미치는 영향을 최소화하기 위해 다음 사항들을 고려하세요:
애플리케이션에 재시도 로직을 구현하세요.
Atlas 유지 관리 기간을 구성합니다.
참고
Atlas Search 업그레이드는 유지 관리 기간 중에만 시작되며 유지 관리 기간 이후에도 계속될 수 있습니다.
각 릴리스의 변경 사항에 대해 자세히 알아보려면 Atlas Search 변경 로그(Changelog)를 참조하세요.
인덱싱 성능 확장
Atlas Search 인덱스의 초기 동기화 및 정상 상태 인덱싱을 확장하기 위해 cluster를 더 많은 코어를 가진 상위 티어로 업그레이드할 수 있습니다. Atlas Search는 초기 동기화 및 정상 상태 인덱싱을 실행하기 위해 사용 가능한 모든 코어의 일정 비율을 사용합니다. cluster를 업그레이드하여 새로운 코어를 사용할 수 있게 되면 성능이 향상됩니다.
Atlas 클러스터 구성 변경
로컬 NVMe 스토리지 유형을 사용하도록 배포를 재구성하거나 NVMe 기반 클러스터를 업스케일링하는 경우, 각 노드가 기본 구성 또는 업스케일 작업을 완료한 후 Atlas Search는 구성된 모든 Atlas Search 인덱스의 초기 동기화를 수행합니다. Atlas Search 인덱스 초기 동기화가 클러스터 구성 변경을 완료하는 데 걸린 시간보다 오래 걸리는 경우 Atlas 클러스터의 모든 노드에서 초기 동기화가 완료될 때까지 $search
쿼리를 실행할 수 없습니다.
Atlas 클러스터와 $search
워크로드를 독립적으로 확장하려면 전용 검색 노드를 배포하는 것이 좋습니다. 전용 검색 노드는 mongot
프로세스만 실행하며 mongot
프로세스의 가용성과 워크로드 밸런싱을 개선합니다.