Elasticsearch로 최고 성능을 발휘하세요! 이 가이드는 인덱싱 전략, 쿼리 최적화, 하드웨어 고려 사항, 글로벌 검색 성공을 위한 고급 기술을 다룹니다.
Elasticsearch 최적화: 글로벌 확장을 위한 포괄적인 가이드
Elasticsearch는 전자 상거래 제품 검색에서 로그 분석 대시보드에 이르기까지 모든 것을 지원하는 현대 검색 인프라의 초석이 되었습니다. 분산된 특성과 강력한 쿼리 기능을 통해 대규모 데이터 세트 및 복잡한 검색 요구 사항을 처리하는 데 이상적입니다. 그러나 Elasticsearch에서 최적의 성능을 달성하려면 신중한 계획, 구성 및 지속적인 최적화가 필요합니다. 이 포괄적인 가이드는 지리적 위치나 산업에 관계없이 Elasticsearch 배포의 효율성과 확장성을 극대화하기 위한 실행 가능한 전략과 모범 사례를 제공합니다.
Elasticsearch 아키텍처 이해
최적화 기술을 살펴보기 전에 Elasticsearch의 기본 아키텍처를 이해하는 것이 중요합니다.
- 노드: Elasticsearch를 실행하는 개별 서버 또는 가상 머신입니다.
- 클러스터: 데이터를 저장하고 인덱싱하기 위해 함께 작동하는 노드 모음입니다.
- 인덱스: 관계형 데이터베이스의 테이블과 유사한 문서의 논리적 그룹화입니다.
- 문서: JSON 객체로 표현되는 Elasticsearch의 기본 데이터 단위입니다.
- 샤드: 인덱스는 확장성 및 중복성을 위해 여러 노드에 분산되는 샤드로 나뉩니다.
- 레플리카: 샤드의 복사본으로, 내결함성을 제공하고 읽기 성능을 향상시킵니다.
효과적인 Elasticsearch 최적화는 성능, 확장성 및 내결함성 간의 원하는 균형을 달성하기 위해 이러한 구성 요소를 조정하는 데 관련됩니다.
인덱싱 최적화
인덱싱은 원시 데이터를 검색 가능한 형식으로 변환하는 프로세스입니다. 인덱싱 성능을 최적화하는 것은 대기 시간을 줄이고 전체 시스템 처리량을 개선하는 데 중요합니다.
1. 매핑 설계
매핑은 Elasticsearch가 문서의 각 필드를 해석하고 저장하는 방법을 정의합니다. 올바른 데이터 유형과 분석기를 선택하면 인덱싱 및 쿼리 성능에 큰 영향을 미칠 수 있습니다.
- 데이터 유형: 각 필드에 가장 적합한 데이터 유형을 사용합니다. 예를 들어, 정확히 일치하는 데 사용되는 필드에는
keyword
를 사용하고, 전체 텍스트 검색이 필요한 필드에는text
를 사용합니다. - 분석기: 분석기는 텍스트 필드를 토큰화하고 정규화하는 데 사용됩니다. 올바른 분석기를 선택하는 것은 검색 애플리케이션의 특정 요구 사항에 따라 다릅니다. 예를 들어,
standard
분석기는 일반적인 텍스트 검색에 적합하고,whitespace
분석기는 공백으로 구분된 토큰을 포함하는 필드에 적합합니다. 다국어 콘텐츠의 경우, 향상된 어간 처리 및 불용어 제거를 위해 언어별 분석기(예:english
,spanish
,french
)를 고려합니다.
예시: 제품 카탈로그 색인을 고려해 보십시오. 제품 이름 필드는 검색 정확도를 향상시키기 위해 언어별 분석기로 분석해야 합니다. 제품 ID 필드는 정확히 일치하는 keyword
유형으로 매핑해야 합니다.
2. 대량 인덱싱
개별적으로 문서를 인덱싱하는 대신 bulk API를 사용하여 단일 요청으로 여러 문서를 인덱싱합니다. 이렇게 하면 오버헤드가 줄어들고 인덱싱 속도가 크게 향상됩니다. bulk API는 모든 데이터 로딩 프로세스에 필수적입니다.
예시: 1000개의 개별 인덱스 요청을 보내는 대신 1000개의 문서를 단일 대량 요청으로 일괄 처리합니다. 이렇게 하면 성능이 크게 향상될 수 있습니다.
3. 새로 고침 간격
새로 고침 간격은 Elasticsearch가 새로 인덱싱된 문서를 얼마나 자주 검색 가능하게 만들지를 제어합니다. 새로 고침 간격을 줄이면 인덱싱 속도가 빨라지지만 검색 대기 시간도 늘어날 수 있습니다. 애플리케이션의 특정 요구 사항에 따라 새로 고침 간격을 조정합니다. 즉시 검색 가능성이 중요하지 않은 대량 수집 시나리오의 경우, 자동 새로 고침을 비활성화하고 필요에 따라 수동 새로 고침을 수행하려면 새로 고침 간격을 -1
로 설정하는 것을 고려하십시오.
4. 인덱싱 버퍼 크기
Elasticsearch는 디스크로 플러시하기 전에 인덱싱 데이터를 메모리에 저장하기 위해 버퍼를 사용합니다. 인덱싱 버퍼 크기를 늘리면 인덱싱 성능이 향상되지만 메모리 사용량도 늘어납니다. 사용 가능한 메모리와 인덱싱 처리량 요구 사항에 따라 인덱싱 버퍼 크기를 조정합니다.
5. Translog 지속성
translog는 인덱싱 작업에 대한 지속성을 제공하는 트랜잭션 로그입니다. 기본적으로 Elasticsearch는 각 작업 후에 translog를 fsync하여 오류가 발생할 경우 데이터가 손실되지 않도록 합니다. 그러나 이는 인덱싱 성능에 영향을 미칠 수 있습니다. 데이터 지속성이 약간 감소하는 대신 인덱싱 속도를 향상시키려면 translog 지속성을 async
로 설정하는 것을 고려하십시오. 데이터 손실은 여전히 발생할 가능성이 낮지만 극단적인 오류 시나리오에서는 가능합니다.
쿼리 최적화
쿼리 최적화는 검색 대기 시간을 줄이고 사용자 경험을 향상시키는 데 중요합니다. 제대로 최적화되지 않은 쿼리는 전체 Elasticsearch 클러스터를 마비시킬 수 있습니다. Elasticsearch가 쿼리를 실행하는 방식을 이해하고 올바른 쿼리 유형을 사용하는 것은 최적의 성능을 달성하는 데 핵심입니다.
1. 쿼리 유형
Elasticsearch는 특정 사용 사례에 맞게 설계된 다양한 쿼리 유형을 제공합니다. 올바른 쿼리 유형을 선택하면 성능에 큰 영향을 미칠 수 있습니다.
- Term 쿼리: 키워드의 정확한 일치를 위해 term 쿼리를 사용합니다. 인덱싱된 용어를 검색하는 데 빠르고 효율적입니다.
- Match 쿼리: 전체 텍스트 검색에 match 쿼리를 사용합니다. 쿼리 문자열을 분석하고 관련 용어를 포함하는 문서를 일치시킵니다.
- Range 쿼리: 특정 값 범위 내에서 검색하기 위해 range 쿼리를 사용합니다. 숫자 또는 날짜 범위에 따라 데이터를 필터링하는 데 효율적입니다.
- Boolean 쿼리: 부울 연산자(AND, OR, NOT)를 사용하여 여러 쿼리를 결합하기 위해 boolean 쿼리를 사용합니다. 복잡한 검색 조건을 만드는 데 유연합니다.
- Multi-Match 쿼리: 서로 다른 부스팅 요소를 사용하여 여러 필드를 검색하기 위해 multi-match 쿼리를 사용합니다.
- 와일드카드 쿼리: 와일드카드(
*
,?
)를 사용하여 패턴을 일치시키기 위해 와일드카드 쿼리를 사용합니다. 와일드카드 쿼리는 느리고 리소스 집약적일 수 있으므로 주의하십시오. - Fuzzy 쿼리: 철자 오류 또는 변형이 있는 경우에도 검색어와 유사한 문서를 찾기 위해 fuzzy 쿼리를 사용합니다.
예시: 제품 이름별로 제품을 검색하려면 match
쿼리를 사용합니다. 가격 범위별로 제품을 필터링하려면 range
쿼리를 사용합니다. 여러 검색 조건을 결합하려면 bool
쿼리를 사용합니다.
2. 필터링
더 많은 비용이 드는 쿼리를 적용하기 전에 필터링을 사용하여 검색 결과를 좁힙니다. 필터링은 미리 인덱싱된 데이터에 대해 작동하므로 일반적으로 쿼리보다 빠릅니다.
예시: 필터링과 검색을 모두 수행하기 위해 should
절이 있는 bool
쿼리를 사용하는 대신, 필터링을 위한 filter
절과 검색을 위한 must
절이 있는 bool
쿼리를 사용합니다.
3. 캐싱
Elasticsearch는 성능을 향상시키기 위해 자주 사용되는 쿼리 및 필터를 캐시합니다. 캐시 적중률을 극대화하고 쿼리 대기 시간을 줄이도록 캐시 설정을 구성합니다.
- 노드 쿼리 캐시: 노드 수준에서 쿼리 결과를 캐시합니다.
- 샤드 요청 캐시: 샤드 수준 요청의 결과를 캐시합니다.
읽기 중심 워크로드에 대해 캐싱을 활성화하고 사용 가능한 메모리에 따라 캐시 크기를 조정합니다.
4. 페이지 매김
단일 요청으로 많은 수의 문서를 검색하지 마십시오. 페이지 매김을 사용하여 결과를 더 작은 청크로 검색합니다. 이렇게 하면 Elasticsearch 클러스터의 부하가 줄어들고 응답 시간이 개선됩니다.
- 크기 및 시작:
size
및from
매개변수를 사용하여 결과를 페이지 매김합니다. - 스크롤 API: 대규모 데이터 세트를 순차적으로 검색하기 위해 스크롤 API를 사용합니다.
5. 프로파일링
Elasticsearch 프로파일링 API를 사용하여 쿼리 성능을 분석합니다. 프로파일링 API는 Elasticsearch가 쿼리를 실행하는 방식에 대한 자세한 정보를 제공하고 잠재적 병목 현상을 식별합니다. 이 정보를 사용하여 쿼리를 최적화하고 성능을 개선합니다. 느린 쿼리를 식별하고 실행 계획을 분석하여 비효율적인 필터 또는 누락된 인덱스와 같은 개선 영역을 찾아냅니다.
하드웨어 고려 사항
하드웨어 인프라는 Elasticsearch 성능에서 중요한 역할을 합니다. 올바른 하드웨어 구성 요소를 선택하고 적절하게 구성하는 것은 최적의 성능을 달성하는 데 필수적입니다.
1. CPU
Elasticsearch는 특히 인덱싱 및 쿼리 처리 중에 CPU 집약적입니다. 최적의 성능을 위해 높은 클럭 속도와 여러 코어가 있는 CPU를 선택합니다. 향상된 벡터 처리를 위해 AVX-512 명령어가 있는 CPU를 사용하는 것을 고려합니다.
2. 메모리
Elasticsearch는 캐싱 및 인덱싱을 위해 메모리에 크게 의존합니다. Elasticsearch 힙 및 운영 체제 캐시에 충분한 메모리를 할당합니다. 권장 힙 크기는 사용 가능한 RAM의 50%이며 최대 32GB입니다.
3. 스토리지
Elasticsearch 데이터를 저장하기 위해 SSD와 같은 빠른 저장 장치를 사용합니다. SSD는 기존 하드 드라이브에 비해 훨씬 더 나은 읽기 및 쓰기 성능을 제공합니다. 훨씬 더 빠른 성능을 위해 NVMe SSD를 사용하는 것을 고려합니다.
4. 네트워크
Elasticsearch 노드 간에 고대역폭, 저지연 네트워크 연결을 확인합니다. 이는 분산 검색 작업에 중요합니다. 최적의 성능을 위해 10 기가비트 이더넷 이상을 사용합니다.
클러스터 구성
Elasticsearch 클러스터를 적절하게 구성하는 것은 확장성, 내결함성 및 성능에 필수적입니다.
1. 샤딩
샤딩을 사용하면 데이터를 여러 노드에 분산하여 확장성과 성능을 향상시킬 수 있습니다. 데이터 크기와 클러스터의 노드 수에 따라 올바른 샤드 수를 선택합니다. 과도한 샤딩은 오버헤드를 증가시킬 수 있고, 샤딩 부족은 확장성을 제한할 수 있습니다.
경험 법칙: 크기가 20GB에서 40GB 사이인 샤드를 목표로 합니다.
2. 레플리카
레플리카는 내결함성을 제공하고 읽기 성능을 향상시킵니다. 원하는 중복 수준과 읽기 처리량 요구 사항에 따라 레플리카 수를 구성합니다. 일반적인 구성은 샤드당 하나의 레플리카입니다.
3. 노드 역할
Elasticsearch는 마스터 노드, 데이터 노드, 조정 노드 등 다양한 노드 역할을 지원합니다. 각 노드의 특정 기능에 따라 노드 역할을 할당합니다. 전용 마스터 노드는 클러스터 관리를 담당하고, 데이터 노드는 데이터를 저장하고 인덱싱합니다. 조정 노드는 들어오는 요청을 처리하고 해당 데이터 노드로 분산합니다.
4. 라우팅
라우팅을 사용하면 문서가 인덱싱될 샤드를 제어할 수 있습니다. 관련 문서가 동일한 샤드에 저장되도록 하여 쿼리 성능을 최적화하기 위해 라우팅을 사용합니다. 이는 관련 문서를 검색해야 하는 애플리케이션에 유용할 수 있습니다.
모니터링 및 유지 관리
지속적인 모니터링 및 유지 관리는 Elasticsearch 클러스터의 상태 및 성능을 유지하는 데 필수적입니다.
1. 모니터링 도구
Kibana와 같은 Elasticsearch 모니터링 도구를 사용하여 클러스터의 성능을 추적합니다. CPU 사용률, 메모리 사용량, 디스크 I/O 및 쿼리 대기 시간과 같은 주요 지표를 모니터링합니다. 잠재적 문제를 알리기 위해 경고를 설정합니다.
2. 로그 분석
Elasticsearch 로그를 분석하여 오류 및 성능 병목 현상을 식별합니다. Elasticsearch 자체와 같은 로그 집계 도구를 사용하여 클러스터의 모든 노드에서 로그를 중앙 집중화하고 분석합니다.
3. 인덱스 관리
인덱스를 정기적으로 최적화하고 유지 관리합니다. 저장 비용을 줄이고 쿼리 성능을 개선하기 위해 오래되었거나 관련 없는 데이터를 삭제합니다. 롤오버, 축소 및 삭제와 같은 인덱스 관리 작업을 자동화하려면 인덱스 수명 주기 관리(ILM)를 사용합니다.
4. 클러스터 업데이트
Elasticsearch 클러스터를 최신 버전으로 최신 상태로 유지합니다. 새 버전에는 종종 성능 개선, 버그 수정 및 보안 패치가 포함됩니다. 다운 타임을 최소화하기 위해 클러스터 업데이트를 신중하게 계획하고 실행합니다.
고급 최적화 기술
기본 최적화 기술 외에도 Elasticsearch 성능을 더욱 향상시킬 수 있는 몇 가지 고급 전략이 있습니다.
1. 회로 차단기
Elasticsearch는 메모리 부족 오류를 방지하기 위해 회로 차단기를 사용합니다. 회로 차단기는 메모리 사용량을 모니터링하고 사용 가능한 메모리를 초과할 가능성이 있는 작업을 방지합니다. 사용 가능한 메모리 및 워크로드 특성에 따라 회로 차단기 설정을 조정합니다.
2. 필드 데이터 로딩
필드 데이터는 텍스트 필드에서 정렬 및 집계에 사용됩니다. 메모리에 필드 데이터를 로드하는 것은 리소스 집약적일 수 있습니다. 대규모 텍스트 필드에서 정렬 및 집계를 위해 필드 데이터 대신 doc 값을 사용합니다. doc 값은 디스크에 저장되며 대규모 데이터 세트에 더 효율적입니다.
3. 적응형 레플리카 선택
Elasticsearch는 레플리카의 성능 및 가용성을 기반으로 쿼리에 가장 적합한 레플리카를 자동으로 선택할 수 있습니다. 트래픽이 많은 시나리오에서 쿼리 성능을 향상시키려면 적응형 레플리카 선택을 활성화합니다.
4. 인덱스 정렬
특정 필드를 기반으로 인덱스의 문서를 정렬합니다. 이는 동일한 정렬 순서를 사용하는 쿼리에 대한 쿼리 성능을 향상시킬 수 있습니다. 인덱스 정렬은 쿼리가 종종 시간 범위를 필터링하는 시간 기반 인덱스에 특히 유용할 수 있습니다.
5. 강제 병합
인덱스의 세그먼트를 강제 병합하여 세그먼트 수를 줄이고 쿼리 성능을 향상시킵니다. 강제 병합은 리소스 집약적일 수 있으므로 사용량이 적은 시간에 수행해야 합니다. 세그먼트를 통합하려면 max_num_segments
매개변수와 함께 _forcemerge
API를 사용하는 것을 고려하십시오.
글로벌 고려 사항
글로벌 환경에서 Elasticsearch를 배포할 때는 몇 가지 추가적인 요소를 고려해야 합니다.
1. 지리적 분포
전 세계 사용자에게 대기 시간을 줄이고 가용성을 향상시키기 위해 여러 지리적 지역에 Elasticsearch 클러스터를 배포합니다. 서로 다른 지역의 클러스터 간에 데이터를 동기화하려면 교차 클러스터 복제(CCR)를 사용합니다.
2. 언어 지원
Elasticsearch는 텍스트 데이터의 인덱싱 및 쿼리에 대한 광범위한 언어 지원을 제공합니다. 서로 다른 언어에 대한 검색 정확도를 향상시키려면 언어별 분석기를 사용합니다. 고급 유니코드 지원을 위해 ICU 플러그인을 사용하는 것을 고려합니다.
3. 시간대
시간 기반 데이터를 인덱싱하고 쿼리할 때 시간대를 올바르게 처리합니다. 날짜를 UTC 형식으로 저장하고 표시할 때 사용자의 현지 시간대로 변환합니다. date
데이터 유형을 사용하고 적절한 시간대 형식을 지정합니다.
4. 데이터 현지화
Elasticsearch 인덱스를 설계할 때 데이터 현지화 요구 사항을 고려합니다. 사용자의 로캘 또는 지역에 따라 다른 인덱스에 데이터를 저장합니다. 이렇게 하면 다른 지역의 사용자에게 쿼리 성능을 향상시키고 대기 시간을 줄일 수 있습니다.
결론
Elasticsearch 최적화는 지속적인 모니터링, 분석 및 튜닝이 필요한 지속적인 프로세스입니다. 이 가이드에 설명된 전략과 모범 사례를 따르면 규모나 글로벌 범위에 관계없이 Elasticsearch의 모든 잠재력을 발휘하고 검색 애플리케이션에 최적의 성능을 달성할 수 있습니다. 애플리케이션의 특정 요구 사항에 맞게 최적화 노력을 조정하고 데이터와 사용 패턴이 발전함에 따라 구성을 지속적으로 모니터링하고 조정하십시오. 효과적인 최적화는 목적지가 아닌 여정입니다.