JSON 파쇄Compatible with Milvus 2.6.2+
JSON 파쇄는 기존의 행 기반 스토리지를 최적화된 컬럼형 스토리지로 변환하여 JSON 쿼리를 가속화합니다. 데이터 모델링에 대한 JSON의 유연성을 유지하면서 Milvus는 백그라운드에서 컬럼형 최적화를 수행하여 액세스 및 쿼리 효율성을 획기적으로 개선합니다.
JSON 파쇄는 대부분의 JSON 쿼리 시나리오에 효과적입니다. 성능 이점은 다음과 같은 경우에 더욱 두드러집니다:
더크고 복잡한 JSON 문서 - 문서 크기가 커질수록 성능이 크게 향상됩니다.
읽기가 많은 워크로드 - JSON 키에 대한 필터링, 정렬 또는 검색이 잦은 경우
혼합 쿼리 패턴 - 서로 다른 JSON 키에 대한 쿼리는 하이브리드 스토리지 접근 방식의 이점을 누릴 수 있습니다.
작동 방식
JSON 파쇄 프로세스는 데이터를 최적화하여 빠르게 검색할 수 있도록 세 가지 단계로 진행됩니다.
1단계: 수집 및 키 분류
새로운 JSON 문서가 작성되면 Milvus는 이를 지속적으로 샘플링하고 분석하여 각 JSON 키에 대한 통계를 구축합니다. 이 분석에는 키의 발생 비율과 유형 안정성(데이터 유형이 문서 간에 일관성이 있는지 여부)이 포함됩니다.
이러한 통계를 기반으로 JSON 키는 최적의 저장을 위해 다음과 같이 분류됩니다.
JSON 키의 카테고리
키 유형 |
설명 |
|---|---|
입력된 키 |
대부분의 문서에 존재하며 항상 동일한 데이터 유형(예: 모든 정수 또는 모든 문자열)을 갖는 키입니다. |
동적 키 |
자주 나타나지만 데이터 유형이 혼합된 키(예: 때로는 문자열, 때로는 정수)입니다. |
공유 키 |
구성 가능한 빈도 임계값 이하로 자주 나타나지 않거나 중첩된 키입니다. |
분류 예시
다음 JSON 키가 포함된 샘플 JSON 데이터를 생각해 보세요:
{"a": 10, "b": "str1", "f": 1}
{"a": 20, "b": "str2", "f": 2}
{"a": 30, "b": "str3", "f": 3}
{"a": 40, "b": 1, "f": 4} // b becomes mixed type
{"a": 50, "b": 2, "e": "rare"} // e appears infrequently
이 데이터를 기준으로 키는 다음과 같이 분류됩니다:
입력된키:
a및f(항상 정수)동적 키:
b(문자열/정수 혼합)공유 키:
e(드물게 나타나는 키)
2단계: 스토리지 최적화
1단계의 분류에 따라 스토리지 레이아웃이 결정됩니다. Milvus는 쿼리에 최적화된 열 형식을 사용합니다.
Json 파쇄 흐름
열을 파쇄합니다: 입력된 키와 동적 키의 경우, 데이터가 전용 열에 기록됩니다. 이 컬럼형 스토리지를 사용하면 Milvus가 전체 문서를 처리하지 않고 주어진 키에 필요한 데이터만 읽을 수 있으므로 쿼리 중에 빠르고 직접 스캔할 수 있습니다.
공유 열: 모든 공유 키는 하나의 컴팩트한 바이너리 JSON 열에 함께 저장됩니다. 공유 키 반전 인덱스는 이 열에 구축됩니다. 이 인덱스는 Milvus가 데이터를 빠르게 정리하여 지정된 키가 포함된 행으로만 검색 공간을 효과적으로 좁힐 수 있도록 함으로써 빈도가 낮은 키에 대한 쿼리를 가속화하는 데 매우 중요합니다.
3단계: 쿼리 실행
마지막 단계에서는 최적화된 스토리지 레이아웃을 활용하여 각 쿼리 술어에 대해 가장 빠른 경로를 지능적으로 선택합니다.
빠른 경로: 입력/동적 키(예:
json['a'] < 100)에 대한 쿼리는 전용 열에 직접 액세스합니다.최적화된 경로: 공유 키(예:
json['e'] = 'rare')에 대한 쿼리는 반전 인덱스를 사용해 관련 문서를 빠르게 찾습니다.
JSON 파쇄 사용
이 기능을 활성화하려면 milvus.yaml 구성 파일에서 common.enabledJSONShredding 을 true 으로 설정하세요. 새로운 데이터는 자동으로 파쇄 프로세스를 트리거합니다.
# milvus.yaml
...
common:
enabledJSONShredding: true # Indicates whether to enable JSON key stats build and load processes
...
이 기능을 활성화하면 Milvus는 수집 즉시 별도의 수동 개입 없이 JSON 데이터를 분석하고 재구성하기 시작합니다.
매개변수 튜닝
대부분의 사용자들은 JSON 파쇄가 활성화되면 다른 매개변수에 대한 기본 설정으로 충분합니다. 그러나 milvus.yaml 에서 다음 매개변수를 사용하여 JSON 파쇄의 동작을 미세 조정할 수 있습니다.
매개변수 이름 |
설명 |
기본값 |
튜닝 조언 |
|---|---|---|---|
|
JSON 파쇄 빌드 및 로드 프로세스의 활성화 여부를 제어합니다. |
false |
이 기능을 활성화하려면 true로 설정해야 합니다. |
|
밀버스가 가속을 위해 조각화된 데이터를 사용할지 여부를 제어합니다. |
true |
쿼리 실패 시 원래 쿼리 경로로 되돌아가는 복구 조치로 false로 설정합니다. |
|
Milvus가 조각화된 데이터를 로드할 때 mmap을 사용할지 여부를 결정합니다. 자세한 내용은 mmap 사용을 참조하세요. |
true |
이 설정은 일반적으로 성능에 최적화되어 있습니다. 시스템에 특정 메모리 관리가 필요하거나 제약이 있는 경우에만 이 설정을 조정하세요. |
|
파쇄된 열에 저장될 JSON 키의 최대 개수입니다. 자주 나타나는 키의 수가 이 제한을 초과하면 Milvus는 가장 빈번하게 나타나는 키에 우선순위를 지정하여 파쇄하고 나머지 키는 공유 열에 저장합니다. |
1024 |
이 정도면 대부분의 시나리오에 충분합니다. 자주 등장하는 키가 수천 개에 달하는 JSON의 경우, 이 값을 더 늘려야 할 수도 있지만 스토리지 사용량을 모니터링하세요. |
|
파쇄된 열로 파쇄하려면 JSON 키의 최소 발생 비율을 고려해야 합니다. 비율이 이 임계값을 초과하면 키가 자주 나타나는 것으로 간주됩니다. |
0.3 |
파쇄 기준을 충족하는 키의 수가 기본 30% 임계값보다 덜 자주 나타나는 키를 더 많이 파쇄하려면 임계값을낮추세요 (예: 0.1로낮추세요 ). |
성능 벤치마크
테스트 결과 다양한 JSON 키 유형과 쿼리 패턴에 걸쳐 상당한 성능 개선이 이루어졌습니다.
테스트 환경 및 방법론
하드웨어: 1코어/8GB 클러스터
데이터 세트: JSONBench의 문서 1백만 개
평균 문서 크기: 478.89바이트
테스트 기간: 100초 동안 QPS 및 지연 시간 측정
결과: 입력된 키
이 테스트는 대부분의 문서에 존재하는 키를 쿼리할 때의 성능을 측정했습니다.
쿼리 표현식 |
키 값 유형 |
QPS(파쇄 제외) |
QPS(파쇄 포함) |
성능 향상 |
|---|---|---|---|---|
|
정수 |
8.69 |
287.50 |
33x |
|
문자열 |
8.42 |
126.1 |
14.9x |
결과: 공유 키
이 테스트는 '공유' 범주에 속하는 희소하고 중첩된 키를 쿼리하는 데 중점을 두었습니다.
쿼리 표현식 |
키 값 유형 |
QPS(파쇄 제외) |
QPS(조각화 포함) |
성능 향상 |
|---|---|---|---|---|
|
중첩 정수 |
4.33 |
385 |
88.9x |
|
중첩 문자열 |
7.6 |
352 |
46.3x |
주요 인사이트
공유 키 쿼리가 가장 극적인 성능 향상(최대 89배 빨라짐)을 보여줍니다.
입력된 키 쿼리는 일관되게 15~30배의 성능 향상을 제공합니다.
모든 쿼리 유형에서 성능 저하 없이 JSON 파쇄의 이점을 누릴 수 있습니다.
FAQ
JSON 파쇄가 제대로 작동하는지 어떻게 확인하나요?
먼저, Birdwatcher 도구에서
show segment --format table명령을 사용하여 데이터가 작성되었는지 확인합니다. 성공하면 출력에 Json Key Stats 필드 아래에shredding_data/및shared_key_index/이 포함됩니다.
버드워처 출력 다음으로 쿼리 노드에서
show loaded-json-stats을 실행하여 데이터가 로드되었는지 확인합니다. 출력에는 각 쿼리 노드에 대해 로드된 조각화된 데이터에 대한 세부 정보가 표시됩니다.
오류가 발생하면 어떻게 하나요?
빌드 또는 로드 프로세스가 실패하는 경우
common.enabledJSONShredding=false을 설정하여 기능을 빠르게 비활성화할 수 있습니다. 남은 작업을 모두 지우려면 Birdwatcher에서remove stats-task <task_id>명령을 사용하세요. 쿼리가 실패하면common.usingjsonShreddingForQuery=false을 설정하여 파쇄된 데이터를 우회하여 원래 쿼리 경로로 되돌립니다.JSON 파쇄와 JSON 인덱싱 중에서 어떻게 선택하나요?
JSON 파 쇄는 문서에 자주 나타나는 키, 특히 복잡한 JSON 구조에 이상적입니다. 컬럼형 저장과 역 인덱싱의 장점을 결합한 것으로, 다양한 키를 쿼리하는 읽기 작업량이 많은 시나리오에 적합합니다. 그러나 아주 작은 JSON 문서에는 성능 향상이 미미하므로 권장되지 않습니다. JSON 문서의 전체 크기에서 키 값이 차지하는 비율이 작을수록 파쇄로 인한 성능 최적화가 더 잘 이루어집니다.
JSON 인덱싱은 특정 키 기반 쿼리의 타깃 최적화에 더 적합하며 스토리지 오버헤드가 더 낮습니다. 더 단순한 JSON 구조에 적합합니다. JSON 파쇄는 배열 내부의 키에 대한 쿼리를 다루지 않으므로 이러한 쿼리를 가속화하려면 JSON 인덱스가 필요합니다.
자세한 내용은 JSON 필드 개요를 참조하세요.