Elasticsearch의 색인 템플릿: 작성 가능한 템플릿을 사용하는 방법

작성 가능한 템플릿과 템플릿을 만드는 방법을 살펴보세요.

Elasticsearch를 사용하면 데이터를 빠르고 유연하게 색인화할 수 있습니다. 클라우드에서 무료로 사용해 보거나 로컬에서 실행하여 색인 작업이 얼마나 쉬운지 확인해 보세요.

매핑, 설정 및 별칭을 통해 Elasticsearch 인덱스를 구성할 수 있습니다: 

  • 매핑 정의는 데이터 스키마를 지정합니다.
  • 설정에서 샤드 크기와 새로 고침 빈도를 설정합니다. 
  • 별칭은 인덱스에 대체 이름을 지정하는 데 사용됩니다.

문서를 처음 색인하거나 색인 생성 API를 사용하여 빈 색인을 만들면 데이터 스키마 및 별칭 없이 기본 설정으로 색인이 생성됩니다. 이러한 기본값은 개발 및 테스트 환경에서는 잘 작동하지만 프로덕션 환경에 맞게 인덱스를 사용자 지정해야 할 수도 있습니다.

프로덕션 환경에서 기본 매핑 및 설정으로 작업하면 색인 및 검색 성능이 저하될 수 있습니다. 인덱스를 수동으로 인스턴스화하는 작업은 지루하고 시간이 많이 걸리는 과정입니다. 정교한 매핑 스키마와 사용자 정의 설정 및 별칭이 있는 경우 모든 환경에서 이러한 인덱스를 다시 생성하는 것은 특히 비현실적입니다.

다행히도 Elasticsearch는 인덱스 템플릿형태로 인덱스를 생성할 때 미리 정의된 구성을 자동으로 적용할 수 있는 도구를 제공합니다.

색인 템플릿

인덱스 템플릿을 사용하면 사용자 정의 구성으로 인덱스를 만들 수 있습니다. 인덱스는 인스턴스화 중에 이러한 템플릿에서 설정된 수의 샤드 및 복제본 또는 필드 매핑과 같은 구성을 가져올 수 있습니다. 템플릿은 이름 패턴과 일부 구성으로 정의됩니다. 인덱스의 이름이 템플릿의 명명 패턴과 일치하면 템플릿에 정의된 구성으로 새 인덱스가 생성됩니다.

Elasticsearch는 버전 7.8에서 구성 가능한 템플릿으로 템플릿 기능을 업그레이드했습니다. 이 최신 버전은 이 문서에서 설명한 대로 훨씬 더 많은 재사용 가능한 인덱스 템플릿을 제공합니다.

템플릿 유형

색인 템플릿은 두 가지 범주로 분류할 수 있습니다:

  • 색인 템플릿(또는 컴포저블 색인 템플릿): 구성 가능한 인덱스 템플릿은 단독으로 존재하거나 하나 이상의 구성 요소 템플릿으로 구성될 수 있습니다(두 번째 범주 참조).
  • 컴포넌트 템플릿: 컴포넌트 템플릿은 필요한 구성을 정의하는 자체적으로 재사용 가능한 템플릿입니다. 일반적으로 컴포넌트 템플릿은 인덱스 템플릿과 연결될 것으로 예상됩니다. 각 컴포넌트 템플릿에는 하나 또는 여러 개의 인덱스 템플릿을 첨부할 수 있습니다. 

아래 이미지에서 볼 수 있듯이 인덱스 템플릿 A와 B는 서로 구성 요소 템플릿(이 경우 템플릿 3 하나만)을 공유합니다. 인덱스 템플릿은 하나 또는 여러 개의 구성 요소 템플릿으로 구성될 수 있으며, 각 구성 요소 템플릿은 하나 또는 여러 개의 인덱스 템플릿과 연결될 수 있습니다. 두 가지 유형의 템플릿은 모두 단독으로 존재할 수 있지만 컴포넌트 템플릿은 인덱스 템플릿에 첨부하지 않으면 아무 소용이 없습니다.

일반적인 아이디어는 조직이 다양한 필요에 따라 사용할 수 있도록 구성 요소 템플릿 카탈로그를 개발하고(예: 개별 환경에 맞는 다양한 구성 요소 템플릿 지정), 구성 가능한 인덱스 템플릿을 통해 다양한 인덱스에 이를 첨부하는 것입니다.

작성 가능한(색인) 템플릿을 만드는 방법

Elasticsearch는 인덱스 템플릿을 관리하기 위한 _index_template 엔드포인트를 제공합니다. 사용자는 이 템플릿에서 인덱스 이름 패턴과 함께 필요한 모든 매핑, 설정 및 별칭을 제공합니다. 주문 생성 로직을 담당하는 마이크로서비스 애플리케이션 고객 주문 서비스에 대한 템플릿을 만드는 예제를 살펴보겠습니다. 

와일드카드가 있는 패턴으로 표시되는 고객 주문에 대한 템플릿을 만들어야 한다고 가정해 보겠습니다: *orders. 이 템플릿에는 주문_날짜 필드, 샤드 및 복제본 번호와 같은 특정 매핑 및 설정이 있을 것으로 예상됩니다.

인덱스를 생성하는 동안 이 템플릿과 일치하는 모든 인덱스는 이 템플릿에 정의된 구성을 상속합니다. 예를 들어 검은_금요일_주문 인덱스에는 order_date 필드가 있고, 샤드는 5로 설정되며 복제본은 2로 설정됩니다. 이 외에도 이 템플릿에서 생성된 모든 인덱스는 단일 별칭 이름을 상속받습니다! 주문으로 정의된 인덱스 패턴과 미리 정의된 날짜 형식 dd-MM-yyyy를 가진 단일 oder_date 필드로 구성된 매핑 스키마를 사용하여 이 orders_template을 만들어 보겠습니다. 아래 코드는 이 인덱스 템플릿을 만드는 방법을 보여줍니다.

Kibana의 개발자 도구에서 이 쿼리를 실행하면 미리 정의된 매핑, 설정 및 별칭과 함께 *orders 인덱스 패턴으로 템플릿이 생성됩니다. index_patterns는 일치 패턴의 배열로, 이 패턴과 일치하는 인덱스는 템플릿 구성을 도출합니다. 다음을 실행하여 우리가 수행한 작업을 반복해야 하는 지속된 템플릿을 검색할 수 있습니다:

템플릿에 정의된 템플릿 속성을 만들 때 양수인 우선순위를 정의할 수도 있습니다. 모든 템플릿에는 우선순위가 정의되어 있으므로 다른 템플릿에서 충돌하는 변경 사항이 있을 경우 우선순위가 높은 값을 우선하여 이 값을 사용하여 해결됩니다. 아래에서 템플릿 우선 순위에 대해 자세히 알아보겠습니다.

템플릿으로 색인 만들기

이제 인덱스를 만들기 위한 청사진인 템플릿이 생겼으니 다음 단계는 인덱스를 만드는 것입니다. 인덱스 이름이 지정된 패턴과 일치하면 템플릿 구성이 자동으로 적용됩니다. 이를 증명하기 위해 아래 코드에서 볼 수 있듯이 검은 금요일_주문이라는 새로운 인덱스를 만들어 보겠습니다:

인덱스 이름(blackfriday_orders)이 템플릿에 정의된 명명 패턴과 일치하므로(예를 들어 *주문), 인덱스는 템플릿에서 파생된 모든 구성을 가져와야 합니다. 새로 생성된 인덱스를 검색하고 다음 코드를 실행하여 이것이 실제로 사실인지 확인해 보겠습니다:

반환됩니다:

응답에서 알 수 있듯이 검은 금요일 주문의 구성은 템플릿에서 상속되었습니다. 템플릿 구성을 성공적으로 상속할 수 있는 다양한 인덱스 조합을 시도해 볼 수 있습니다:

그러나 다음 인덱스는 이름이 패턴과 일치하지 않으므로 구성을 상속하지 않습니다:

기억해야 할 한 가지 중요한 점은 템플릿에서 파생된 모든 인덱스는 동일한 별칭(이 경우 all_orders)을 사용한다는 것입니다. 이러한 별칭을 사용하면 여러 인덱스가 아닌 이 단일 별칭으로 간단히 쿼리할 수 있다는 이점이 있습니다.

주문에 대한 템플릿을 생성하는 동안 일치하는 인덱스는 모두 템플릿 구성을 채택할 것으로 예상됩니다. 일반적으로 팀에서는 자의든 타의든 여러 가지 이유로 템플릿을 몇 개 더 만들 수 있습니다. 즉, 인덱스 이름이 두 개의 다른 템플릿 패턴과 일치하는 경우가 있습니다! Elasticsearch는 이러한 템플릿에서 어떤 구성을 적용해야 할지 결정해야 합니다. 다행히도 템플릿 우선순위를 사용하면 이 딜레마를 해결할 수 있습니다.

컴포넌트 템플릿 만들기

이 글의 앞부분에서 인덱스 템플릿에 대해 알아보았습니다. 구성이 내장된 템플릿을 만들면 몇 가지 단점이 있는데, 그 중 하나는 다른 템플릿으로 구성을 내보낼 수 없다는 점입니다. 고객 관련 템플릿(*고객)과 같이 유사한 구성을 원할 경우 전체 템플릿을 다시 만들어야 할 수도 있습니다. 즉, 일반적인 조직에서는 수십 개를 만들 수 있습니다(환경에 따라 몇 개 더 만들 수도 있습니다).

항상 재사용 가능성을 염두에 두고 템플릿을 재설계하기 때문에 Elasticsearch는 재사용 가능성을 염두에 두고 템플릿을 재설계했습니다. 컴포넌트 템플릿이 이에 적합합니다. DevOps 출신이라면 각 환경에 대해 미리 설정된 구성으로 인덱스를 만들어야 하는 요구 사항이 있을 것입니다. 이러한 각 구성을 수동으로 적용하는 번거로움 대신 각 환경에 대한 컴포넌트 템플릿을 만들 수 있습니다.

구성 요소 템플릿은 더 많은 인덱스 템플릿을 구성하는 데 사용할 수 있는 재사용 가능한 구성 블록에 불과합니다. 컴포넌트 템플릿은 인덱스 템플릿과 클럽화하지 않으면 아무런 가치가 없습니다. 구성 요소 템플릿 엔드포인트를 통해 노출됩니다. 이 모든 것이 어떻게 결합되는지 살펴봅시다.

설정 템플릿

앞서 인덱스 템플릿에서 정의한 설정을 추출하여 컴포넌트 템플릿을 만들어 보겠습니다. 설정_컴포넌트_템플릿에는 기본 샤드당 2개의 복제본이 있는 5개의 기본 샤드가 있어야 합니다. 아래 코드 목록에서 볼 수 있듯이 첫 번째 단계는 이 구성으로 컴포넌트 템플릿을 선언하고 실행하는 것입니다.

위의 코드에서 볼 수 있듯이 _component_template 엔드포인트를 사용하여 컴포넌트 템플릿을 생성합니다. 요청 본문에는 템플릿 객체에 템플릿 정보가 들어 있습니다. 이제 색인 템플릿의 다른 곳에서 settings_component_template을 사용할 수 있습니다. 한 가지 주목할 만한 차이점은 이 템플릿은 인덱스 패턴을 정의하지 않고 일부 속성을 구성하는 코드 블록에 불과하다는 점입니다.

매핑 템플릿

같은 방법으로 다른 템플릿을 만들어 보겠습니다. 이번에는 앞서 독립형 인덱스 템플릿에서 정의했던 매핑 스키마를 추출해 보겠습니다. 아래 코드는 스크립트를 보여줍니다:

별칭 템플릿

동일한 흐름에 따라 별칭이 있는 컴포넌트 템플릿(두 개의 별칭(all_orders 및 sales_orders))을 가질 수도 있습니다:

작성 가능한 색인 템플릿

이제 세 가지 컴포넌트 템플릿을 준비했으니 다음 단계는 이를 사용하는 것입니다. 예를 들어 christmas_orders에 대한 인덱스 템플릿을 사용하도록 허용하면 이 작업을 수행할 수 있습니다:

composed_of 태그는 이 템플릿을 구성하는 모든 컴포넌트 템플릿의 모음입니다. 이 경우 설정, 매핑 및 별칭 컴포넌트 템플릿을 선택합니다. 또한 이 템플릿이 다른 템플릿보다 우선하도록 우선순위를 높이고 있습니다. 템플릿이 준비되면 *주문 패턴과 일치하는 모든 인덱스는 이 세 가지 구성 요소 템플릿의 구성을 상속받게 됩니다.

하지만 고객과 같은 새 템플릿을 만들려면 기존 템플릿(settings_component_template)과 새로 만든 별칭(aliases_component_template - 아래 참조) 템플릿 중 하나만 사용하여 만들 수 있습니다:

인덱스 템플릿은 다음과 같습니다:

설정_컴포넌트_템플릿이 두 개의 다른 템플릿에서 (재)사용된 것을 보셨나요? 이것이 바로 컴포넌트 템플릿의 힘입니다.

템플릿 우선 순위

개발자가 기존 종목을 보지 않고 여러 개의 인덱스 템플릿을 만들 수 있습니다. 이러한 템플릿 각각에 우선순위를 설정하여 우선순위가 높은 템플릿이 사용되도록 하는 것이 중요합니다. 예를 들어, 다음 코드 스니펫에서 my_orders_template_1이 my_orders_template_2를 재정의합니다:

생성 중인 인덱스와 일치하는 템플릿이 여러 개 있는 경우, Elasticsearch는 일치하는 모든 템플릿의 모든 구성을 적용하지만 우선순위가 더 높은 모든 구성을 재정의합니다.

템플릿의 우선 순위

마지막으로 템플릿의 우선순위에 대해 궁금하실 텐데요, 구성 요소 템플릿에 정의된 구성이 기본 인덱스 템플릿 자체에 정의된 구성보다 우선하나요? 아니면 그 반대일까요? 몇 가지 규칙이 있습니다:

  • 즉, 명시적으로 구성하여 만든 인덱스는 모든 항목보다 우선합니다. 즉, 명시적으로 구성하여 인덱스를 만들면 템플릿에 의해 재정의되지 않을 것으로 기대하지 마세요.
  • 레거시 템플릿(버전 7.8 이전에 만든 템플릿)은 작성 가능한 템플릿보다 우선 순위가 낮습니다.

요약

  • 인덱스에는 매핑, 설정 및 별칭이 포함됩니다. 매핑은 필드 스키마를 정의하고, 설정은 샤드 및 복제본 수와 같은 인덱스 파라미터를 설정하며, 별칭은 인덱스에 대체 이름을 부여합니다.
  • 템플릿을 사용하면 미리 정의된 구성으로 인덱스를 만들 수 있습니다. 특정 템플릿에 정의된 인덱스 패턴과 일치하는 이름으로 인덱스 이름을 지정하면 템플릿에 따라 해당 인덱스가 자동으로 구성됩니다.
  • Elasticsearch는 버전 7.8에서 구성 가능한 인덱스 템플릿을 도입했습니다. 구성 가능한 인덱스 템플릿을 사용하면 템플릿을 모듈화하고 버전을 관리할 수 있습니다.
  • 컴포저블 템플릿은 하나 이상의 컴포넌트 템플릿으로 구성됩니다.
  • 인덱스 템플릿에는 자체 구성도 정의할 수 있습니다.
  • 컴포넌트 템플릿은 작성 가능한 인덱스 템플릿과 마찬가지로 미리 정의된 구성이 있는 재사용 가능한 템플릿입니다.
  • 그러나 구성 요소 템플릿은 인덱스 템플릿의 일부가 되어야 하며, 인덱스 템플릿으로 '구성'되지 않으면 쓸모가 없습니다.
  • 구성 요소 템플릿에는 인덱스 패턴이 정의되어 있지 않으므로 인덱스 템플릿의 일부가 될 것으로 '예상'되는 또 다른 이유입니다.
  • 각 템플릿에는 양수인 우선순위가 있습니다. 숫자가 높을수록 해당 템플릿이 적용되는 우선 순위가 높아집니다.

관련 콘텐츠

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요