인덱스 템플릿을 사용하면 이미 정의된 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 |