Node.js

[NodeJS] ElasticSearch API getTemplate(index_template)

SongMinu 2022. 1. 3. 22:37
728x90

인덱스 템플릿(index_template)?

인덱스를 생성할 때 맵핑 정보를 입력해서 생성해야 한다.

맵핑 정보 입력 없이 그냥 생성하고 데이터를 넣으면 필드 맵핑이 이상하게 만들어져서 데이터 조회나, 어그리게이션 등이 정상적으로 되지 않는다.

매번 인덱스를 생성할 때 셋팅 정보, 맵핑 정보 입력하는 게 정말 귀찮다.

이런 불편한 점을 해결하는데 인덱스 템플릿을 사용하면 좋다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/index-templates.html

 

Index templates | Elasticsearch Guide [7.16] | Elastic

This topic describes the composable index templates introduced in Elasticsearch 7.8. For information about how index templates worked previously, see the legacy template documentation. An index template is a way to tell Elasticsearch how to configure an in

www.elastic.co

{
  "order": 0,
  "index_patterns": [
    "user_*"
  ],
  "settings": {
    "index": {
      "routing": {
        "allocation": {
          "include": {
            "_name": ""
          }
        }
      },
      "refresh_interval": "1ms",
      "number_of_shards": "3",
      "translog": {
        "flush_threshold_size": "1gb",
        "durability": "async"
      },
      "merge": {
        "scheduler": {
          "max_thread_count": "1"
        }
      },
      "max_result_window": "20000",
      "unassigned": {
        "node_left": {
          "delayed_timeout": "2628000m"
        }
      },
      "number_of_replicas": "0"
    }
  },
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "user_pw": {
        "type": "keyword"
      },
      "user_id": {
        "type": "keyword"
      },
      "user_nm": {
        "type": "keyword"
      },
      "type": {
        "type": "keyword"
      }
    }
  },
  "aliases": {}
}

이런 식으로 인덱스 템플릿을 등록해 놓고, index_patterns에 일치하는 인덱스 명으로 생성을 하면? (ex: user_test_idx)

위의 인덱스 세팅 정보, 맵핑 정보를 가지고 인덱스가 생성이 된다. (*pattern* 이런 식으로 앞뒤에 *를 붙여도 된다.)

인덱스가 없어도 데이터를 넣으면 위 정보를 가지고 인덱스가 생성돼서 아주 편리하다.

 

현재 회사에서 인덱스 중에 대용량 데이터를 저장하는 인덱스는 연도 단위로 만들어서 사용하고 있다.

index_name-yyyy 이런 식으로 종류별로 인덱스가 존재하고 있고, 

인덱스 템플릿 사용해 템플릿을 만들어둬서 인덱스가 없어도 데이터가 들어가면 해당 인덱스의 템플릿 맵핑 정보에 맞춰 인덱스가 생성되도록 해서 운영을 하고 있다.

이슈 발생

그런데 큰 이슈가 한번 터졌는데

년도가 바뀌고 데이터가 생성이 안된 상태라 새로운 년도의 인덱스가 생성이 안된 상태였고,

페이지에 접속을 하니 새로운 년도의 인덱스 데이터를 조회를 해서 데이터가 없는 게 아니라 인덱스 자체가 없어서 여기저기서 에러가 발생했다.

물론 이거에 대해 미리 대처를 해놨어야 했는데, 정신없다 보니 생각만 해두고 까먹고 있었다.

 

생각

그래서 node-schedule을 이용해 특정 날짜마다 인덱스를 체크해서 있으면 패스하고, 없으면 생성하는 걸 만들어보자 생각했다.

생각을 더 해야 하는 부분이 있다면, 인덱스 템플릿에는 대용량 관련 인덱스 템플릿만 뽑을 수 있어야 한다. 정도였다.

그래서 api 중에 index_name-yyyy 같이 특정 인덱스 템플릿 정보만 뽑아와서 인덱스가 있는지 없는지 판단 후 있으면 패스하고, 없으면 인덱스를 생성할만한 게 있는지 찾아봤다.

 

API 사용법

https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#_indices_gettemplate

 

API Reference | Elasticsearch JavaScript Client [7.16] | Elastic

This document contains the entire list of the Elasticsearch API supported by the client, both OSS and commercial. The client is entirely licensed under Apache 2.0. Elasticsearch exposes an HTTP layer to communicate with, and the client is a library that wi

www.elastic.co

 

사용법은 쉽다.

const es_client = require('./client');


async function run() {
  try {
    const rs = await es_client.indices.getTemplate({
      name: 'tpl_*',
    })
    console.log(rs);
  } catch (err) {
    console.error(err);
  }
}

run();

name에 조회할 템플릿 이름을 입력하면 된다.

난 여러 개를 조회해야 해서 *를 넣어봤는데 *를 넣으면 해당되는 템플릿들이 전부 다 나온다.

*를 이용해 검색할 때 (tpl_* 로 검색했다)
* 없이 검색할 때 (tpl_idx 로 검색했다)

이런 식으로 출력이 가능해서 각각의 index_patterns 값에 일치하는 인덱스를 생성하도록 해서 만들었다.

그리고 옵션이 있는데 include_type_name과 flat_settings 정도만 알면 될 것 같고,

해당 부분의 차이는 아래 깃 소스 밑에 주석으로 추가해 놓았다.

https://github.com/smw0807/minu_1/blob/master/node/es_functions/get_template_list.js

 

이슈와 생각에 대한 처리 글

https://minu0807.tistory.com/118

 

[NodeJS] node-schedule을 이용한 elasticsearch 인덱스 생성

지금 작성하는 글은 https://minu0807.tistory.com/117 [NodeJS] ElasticSearch API getTemplate(index_template) 인덱스 템플릿(index_template)? 인덱스를 생성할 때 맵핑 정보를 입력해서 생성해야 한다. 맵핑..

minu0807.tistory.com

 

반응형