본문 바로가기

카테고리 없음

[ElasticSearch] ElasticSearch Indice에 대해 실수한 기록(2023.03.16)

0. Table Of Contents

 

 

1. 하고자 하였던 내용

ElasticSearch에 test라는 index를 생성 후, kafka consumer eachBatch 기능을 이용하여 주기적으로 document를 insert하고 있다. 이 데이터들을 이용하여 아래와 같은 효과를 내고자 한다.

  • 실시간 데이터 모니터링
  • 데이터 통계
  • ML 분석 연계 (연구가 더 필요함)

 

그러나 데이터를 insert 하여 모니터링 그래프를 그리는데 아래와 같은 문제가 생겼다.

 

 

2. 문제 분석

일반적인 데이터베이스의 경우, 코드 상에서 schema를 선언하거나 사전에 schema를 fix하고 작업하기 때문에 data type에 대한 에러는 코드 miss issue가 아니면 거의 일어나지 않는다. 그러나 elasticsearch 초기 설정시, index는 생성하지 않았으나, 어떤 데이터가 들어오고 이를 어떻게 핸들링하는지에 대해 명시를 하지 않았기 때문에 자동으로 이에 대한 설정이 생성되었다. 자동으로 생성된 결과는 아래와 같다.

  • deviceId : text, keyword
  • name : text, keyword
  • unit : text, keyword
  • value : float
  • createdAt: text, keyword

 

자동으로 생성된 부분들에 대해 문제점을 지적하면 아래와 같다.

  • text type의 경우, 형태소 분석이 가능한 type이기 때문에 다른 타입보다 더 큰 자원을 소모하게 된다.
  • 불필요하게 2개의 type이 설정되어 있다.
  • 색인이 필요없는 property도 색인이 되어있다. (unit property)
  • createdAt의 경우 의도 한 data type은 Date였으나, 불필요하게 text / keyword type이 세팅되어 의도와는 다른 설계가 적용되어있었다.
    • 특히 이 문제로 인해 tsvb(시계열 데이터 모니터링?)기능을 위해 필요한 최소 조건이 충족되지 않아 문제가 되었다.

 

 

 

3. 문제 해결

이 문제를 해결하기 위해 인덱스를 삭제하고 indice를 의도대로 설정해주었다.

GET https://acelogrid.es.asia-northeast3.gcp.elastic-cloud.com/test

BODY
{
    "test": {
        "aliases": {},
        "mappings": {
            "properties": {
                "createdAt": {
                    "type": "date"
                },
                "deviceId": {
                    "type": "keyword"
                },
                "name": {
                    "type": "keyword"
                },
                "unit": {
                    "type": "object",
                    "enabled": false
                },
                "value": {
                    "type": "float"
                }
            }
        },
        "settings": {
            "index": {
                "routing": {
                    "allocation": {
                        "include": {
                            "_tier_preference": "data_content"
                        }
                    }
                },
                "number_of_shards": "1",
                "blocks": {
                    "read_only_allow_delete": "false"
                },
                "provided_name": "test",
                "creation_date": "1678934584715",
                "number_of_replicas": "1",
                "uuid": "lDFHfDEHRAachy1NQ1QYbw",
                "version": {
                    "created": "8060299"
                }
            }
        }
    }
}

 

그 결과, 시간축이 제대로 인식이 되면서 kibana dashboard에서 원하는 정보를 뽑아낼 수 있게 되었다.

 
사내 계측기의 전압 평균값을 실시간 모니터링 한 결과

 

 

 

 

4. 결론

elasticsearch에 대해 자세히 모르고 일반 mongodb처럼 사용을 지양해야해야 한다는 점을 알게되었다. elasticsearch는 nosql과 유사한 기능은 schemaless기능을 제공한다. 이를 이용하면 여러가지 형태의 데이터를 하나의 인덱스로 구성할 수 있지만 데이터의 타입별로 어떤 분석이 가능하고 얼만큼의 자원이 들어가는지에 대한 부분이 다르기 때문에 이에 대한 optimizing을 적용하여 인덱스가 만들어 지기전 아래와 같은 부분들이 고려가 되어야 할 것이다.

  • 문자열을 분석 할 것인가
  • 어떤 필드를 정의 할 것인가
  • 날짜 필드는 어떤 필드가 담당할 것인가
  • 매핑에 정의되지 않고 유입되는 필드는 어떻게 처리할 것인가