본문 바로가기
OpenSearch (ElasticSearch)

[7] 인덱스 템플릿

by parkjp 2022. 3. 2.

인덱스 템플릿을 사용하면 이미 정의된 mappings와 settings 그대로 새 인덱스를 초기화할 수 있다.

예를 들어, 지속적으로 인덱싱하는 log data라면, 이런 모든 index가 동일한 수의 샤드와 복제본을 갖도록 인덱스 템플릿을 정의할 수 있다.

 

// Index Template 생성 예시
PUT _index_template/daily_logs  // daily_logs라는 이름을 가진 템플릿 생성
{
  "index_patterns": [
    "logs-2022-01-*"
  ],
  "template": {
    "aliases": {
      "my_logs": {}
    },
    "settings": {
      "number_of_shards": 2,
      "number_of_replicas": 1
    },
    "mappings": {
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "value": {
          "type": "double"
        }
      }
    }
  }
}
 
 
// GET logs-2022-01-01

 

 

:: 템플릿 검색

 

// 모든 인덱스 템플릿 검색
GET _cat/templates


// 이름으로 템플릿 검색
GET _index_template/daily_logs // 예시


// 패턴과 일치하는 템플릿 목록 검색
GET _index_template/daily* // 예시


// 특정 템플릿이 있는지 확인
HEAD _index_template/<name>


// 템플릿 삭제
DELETE _index_template/<name>

 

:: 다수 템플릿 구성

 

인덱스에 대해 여러 인덱스 템플릿을 구성할 수 있다.

인덱스 이름이 둘 이상의 템플릿과 일치하는 경우 일치하는 모든 템플릿의 모든 매핑 및 설정을 병합하고 인덱스에 적용한다.

기본적으로 최근 설정된 인덱스 템플릿의 설정이 이전 인덱스 템플릿의 설정보다 우선되지만 priority 설정으로 우선순위를 정할 수 있다.

 

// 인덱스와 일치하고 충돌이 있는 두 템플릿의 우선순위 설정 예시
// logs-2022-01-02 인덱스가 있다고 가정하고 아래의 두 템플릿의 index_patterns가 중복적으로 일치하여 충돌되는 상황이다.
  
PUT _index_template/template-01
{
  "index_patterns": [
    "logs*"
  ],
  "priority": 0,
  "template": {
    "settings": {
      "number_of_shards": 2
    }
  }
}
 
PUT _index_template/template-02
{
  "index_patterns": [
    "logs-2020-01-*"
  ],
  "priority": 1,
  "template": {
    "settings": {
      "number_of_shards": 3
    }
  }
}
 
 
 
 
// template-02가 priority 값이 더 높기 때문에 logs-2022-01-02 인덱스의 number_of_shards 수는 3이다.

 

 

 

:: 컴포넌트 템플릿

 

다수의 템플릿을 관리하는데에는 여러 문제가 있을 수 있다.

  • 인덱스 템플릿 간의 중복이 존재하는 경우 클러스터 상태가 커질 수 있다.
  • 모든 인덱스 템플릿을 변경하려면 각 템플릿을 수동으로 변경해야 한다.
  • 인덱스가 여러 템플릿과 일치하는 경우, Opensearch 자체적으로 병합을 시도하면서 예기치 않은 방식으로 병합이 될 수 있다.

 

여기서 Component 템플릿은 공통 설정, 매핑 및 별칭을 재사용 가능한 빌딩 블록으로 추상화하여 위 문제들을 해결 할 수 있다.

** 인덱스 생성 요청(create index)에서 직접 지정하는 설정 및 매핑은 인덱스 템플릿 및 해당 컴포넌트 템플릿에서 지정된 모든 설정 또는 매핑을 재정의한다.

 

// 컴포넌트 템플릿 예시
// 컴포넌트 템플릿 1
PUT _component_template/component_template_1
{
  "template": {
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        }
      }
    }
  }
}
 
 
// 컴포넌트 템플릿 2
PUT _component_template/component_template_2
{
  "template": {
    "mappings": {
      "properties": {
        "ip_address": {
          "type": "ip"
        }
      }
    }
  }
}
 
// 인덱스 템플릿 내 컴포넌트 템플릿 적용
// composed_of에 컴포넌트 템플릿을 추가해야 된다.
PUT _index_template/daily_logs // 예시
{
  "index_patterns": [
    "logs-2022-01-*"
  ],
  "template": {
    "aliases": {
      "my_logs": {}
    },
    "settings": {
      "number_of_shards": 2,
      "number_of_replicas": 1
    },
    "mappings": {
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "value": {
          "type": "double"
        }
      }
    }
  },
  "priority": 200,
  "composed_of": [
    "component_template_1",
    "component_template_2"
  ],
  "version": 3,
  "_meta": {
    "description": "using component templates"
  }
}
 
 
// 만약 logs-2022-01-01 이라는 인덱스를 생성하거나 존재하는 경우 GET 요청으로 인덱스를 불러오면 아래와 같이 보이게 된다.
// PUT logs-2020-01-01 (생성 시)
// GET logs-2022-01-01
 
 
{
  "logs-2022-01-01": {
    "aliases": {
      "my_logs": {}
    },
    "mappings": {
      "properties": {
        "@timestamp": { // component-template 1
          "type": "date"
        },
        "ip_address": { // component-template 2
          "type": "ip"
        },
        "timestamp": {  // index template mappings
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        },
        "value": {  // index template mappings
          "type": "double"
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1625382479459",
        "number_of_shards": "2",
        "number_of_replicas": "1",
        "uuid": "rYUlpOXDSUSuZifQLPfa5A",
        "version": {
          "created": "7100299"
        },
        "provided_name": "logs-2020-01-01"
      }
    }
  }
}
반응형

'OpenSearch (ElasticSearch)' 카테고리의 다른 글

[9] 집계 - 버킷 집계  (0) 2022.03.13
[8] 집계 - 메트릭 집계  (0) 2022.03.10
[6] 데이터 스트림  (0) 2022.02.25
[5] 인덱스 별칭 (aliases)  (0) 2022.02.22
[4] 인덱스 데이터  (0) 2022.02.18