상세 컨텐츠

본문 제목

[Elastic Stack] Index vs Index Patterns(Data Views)

Data Platform/Elastic Stack

by leediz 2022. 6. 25. 10:12

본문

 

Index vs Index Patterns(Data Views)

인덱스 패턴(Index Pattern)이란 용어는 Elastic Stack 7.x.x 까지만 사용되었고, Elastic Stack 8.x.x 부터는 데이터 뷰(Data View)라는 용어로 변경이 되었다. 본 블로그는 Elastic Stack 7.16.3 버전을 기준으로 설명하고 있으므로 인덱스 패턴(Index Pattern)으로 설명하겠다.

지난 포스팅에서는 Elasticsearch의 인덱스(Index) 개념과 샤드(Shard)에 대해 다뤄봤다. 그런데 막상 Kibana(키바나)에서 인덱스를 불러와 분석을 하거나 대시보드를 만들려면 인덱스를 찾지 못한다. 결론부터 말하자면 Kibana의 메뉴에서는 인덱스가 아닌 인덱스 패턴(Index Pattern)을 만들어서 사용해야 한다. 이번 포스팅에서는 인덱스 패턴을 생성하는 방법과 인덱스 패턴을 사용함으로써 얻는 이점에 대해 다뤄보겠다.

 

Kibana(키바나)에서 Index(인덱스)가 보이지 않는다?

Elasticsearch에서 인덱스를 생성한 다음 키바나 Dev-Tools에서는 검색이 되는데 Discover에서 확인하거나 Dashboard를 그리려고 보면 인덱스를 찾지 못하는 경우가 있다.

(인덱스가 있었는데요)

 

(없습니다??)

위와 같이 test_index 라는 인덱스를 생성한 다음 Dev-Tools에서 인덱스를 검색해보면 분명히 검색이 되는데 키바나의 Discover 메뉴로 가서 test_index를 확인하려고 하면 찾아볼 수가 없다.

그 이유는 키바나에서 인덱스를 사용하기 위해서는 별도의 키바나 인덱스 패턴 을 만들어서 사용해야 하기 때문이다. 인덱스(Index)는 Elasticsearch의 영역이고, 인덱스 패턴(Index Pattern)은 Kibana의 영역이기 때문이다. 어떠한 의미인지는 그럼 먼저 인덱스 패턴을 생성하는 방법과 함께 아래에서 차차 설명하겠다.

 

Index Pattern(인덱스 패턴)이 필요한 이유

Elasticsearch 인덱스의 이름과 Kibana의 인덱스 패턴 이름의 관계

인덱스 패턴은 Kibana의 Stack Management > Index Patterns 메뉴에서 만들 수 있다. 인덱스 패턴을 만들 시에는 아래와 같이 인덱스의 이름 규칙(Naming Rule)을 고려하여 생성해야 한다.

나중에 별도의 포스팅으로 다루겠지만, Elasticsearch에서 인덱스와 샤드를 관리하는 방법은 다양하다. 테스트 용도나 인덱스의 사이즈가 크지 않다면 단일 인덱스로 관리하겠지만, 매일 일정량 이상 데이터가 저장되면 단일 인덱스에서 관리하기는 어렵다. 따라서 인덱스 뒤에 날짜를 붙여서 일별 또는 월별로 관리를 하거나, “000001”과 같은 시퀀스 번호를 부여하여 관리를 하게 된다. 위의 그림에서는 syslog 데이터를 월별로 관리하는 예제를 나타냈다. 3달치만 표현했지만 일별로 관리를 한다고 하면 3달에 최소 90개 이상의 인덱스가 생성될 것이고 날짜가 늘어날수록 점점 더 많은 인덱스가 생성될 것이다(syslog-20220501, syslog-20220502, … ,syslog-20220731, …).
위와 같이 인덱스를 생성하는 환경에서 만약에 Kibana에서 인덱스 패턴을 생성하지 않고 인덱스를 그대로 가져다가 사용한다면 어떨까?

 

Kibana(키바나)의 Index Pattern(인덱스 패턴)이 없다면?

syslog 데이터가 월별로 수집된다고 가정하면 위와 같이 syslog-202201, syslog-202202 등의 규칙으로 인덱스가 생성될 것이다. 그럴 경우 Kibana의 Discover 메뉴에서 인덱스를 확인하면 위 캡쳐본과 같을 것이다. 그런데 만약 월별이 아닌 syslog 데이터의 전체 트렌드를 확인하고 싶다면 어떻게 해야 할까? 안타깝게도 Discover 메뉴에서는 복수개의 인덱스를 선택할 수가 없다. 그래서 월별로 저장되는 인덱스와 함께 년도별로 별도로 저장을 시키거나 (e.g. syslog-2022) 또는 아예 하나의 인덱스에 모든 데이터를 저장하는 방법을 생각할 것이다 (e.g. syslog). 그런데 이렇게 되면 인덱스를 분리하여 저장하는 이점이 없어질 뿐더러 데이터를 중복 저장하는 이슈도 발생한다(syslog-202205 인덱스의 데이터는 syslog-2022 인덱스와 syslog 인덱스에도 저장된다). 지금은 간단한 예제를 보여주기 위해 월별로 저장했으니 그나마 복잡해 보이지 않지만, 데이터 사이즈가 커서 일별로 인덱스를 관리한다면 더 복잡해질 것이다(e.g. syslog-20220501, syslog-20220502, …).
그래서 Kibana에서는 Elasticsearch의 인덱스와는 별도로 인덱스 패턴(Index Pattern)이라는 개념이 있어 인덱스 이름 규칙을 통해 여러 인덱스를 한번에 확인할 수 있도록 해준다. 저장은 Elasticsearch에 되어 있지만, Kibana에서 확인할 때에는 인덱스 이름 규칙에 의해 Elasticsearch 여러 인덱스의 데이터를 가져와 Kibana에서 보여준다는 느낌으로 이해하면 된다.

 

Kibana(키바나)의 Index Pattern(인덱스 패턴) 사용

이전 예제에서 생성했던 syslog-202201, syslog-202202, …, syslog-202206의 인덱스를 syslog-* 라는 이름의 인덱스 패턴을 생성한 다음 Discover 메뉴에서 확인해보면 위 캡쳐본과 같이 나온다. 인덱스의 이름이 syslog-로 시작한다면 뒤에 어떤 값이 오더라도 같은 인덱스 패턴으로 간주하겠다는 * 표시를 했기 때문에 모든 월에 해당하는 값을 확인할 수 있다. 이렇게 되면 인덱스를 별도로 생성하지 않더라도 키바나에서 여러 인덱스의 값을 한번에 확인할 수 있다.
그리고 아래와 같이 인덱스 패턴을 별도로 여러 개를 만들어 확인하고 싶은 인덱스만 확인할 수도 있다. Kibana 수준에서 추상화하여 관리되기 때문에 데이터는 중복되서 저장되지 않는다.

 

 

(번외) Dev-tools에서 Index Pattern(인덱스 패턴)을 생성하지 않고 Index(인덱스) 조회가 가능한 이유는?

그런데 첫번째 캡쳐본에서 dev-tools에서 test-index 를 생성하고 바로 인덱스를 검색해서 확인할 수 있었던 이유는 무엇인가? 정답은 Kibana의 Dev-Tools 메뉴는 Elasticsearch에 직접 API를 요청하고 그 결과를 확인하는 메뉴이기 때문이다. 즉, Kibana의 영역이 아닌 Elasticsearch의 영역이다.
이것은 MySQL에 저장된 데이터를 Workbench나 DBeaver를 사용하여 데이터를 확인하는 것과 같은 이치이다. 별도의 툴이 없다면 MySQL에 저장된 데이터를 확인하기 위해 MySQL이 설치된 서버에 접속해서 명령어를 통해 MySQL Shell에 접속하여 데이터를 확인해야 한다. 그런데 이 방법은 매우 번거로울 뿐더러 Shell에서는 데이터 확인하는 것은 여러 면에서 불편하다. 그래서 보통 Workbench나 DBeaver를 사용하여 SQL 쿼리를 요청하여 결과값을 확인한다.
마찬가지로 Elasticsearch도 API를 통해 쿼리를 요청하여 결과값을 확인할 수는 있지만 매우 번거롭고 요청값을 확인하는 것도 불편하다.

위와 같이 터미널에서 curl 명령어를 통해 hostname 또는 ip, port를 명시해 준 다음 쿼리 API를 요청 할 수 있다. API의 리턴값 또한 Json 형식이지만 Json 모양대로 나온 것이 아니기 때문에 가독성도 매우 떨어진다.
Kibana의 Dev-tools를 활용하면 터미널에서 사용하는 것과 같이 API를 요청하지만 사용자 입장에서 번거로운 부분을 많이 생략해준다. 그래서 좀 더 쿼리에만 집중할 수도 있고, 쿼리의 자동완성 기능이 지원되서 더 편하게 API를 요청할 수도 있다. 결과값 또한 Json 구조에 맞춰 가독성 좋게 확인할 수 있다.

Elasticsearch에서 쿼리하는 방법에 대해서는 별도의 포스팅을 통해 좀 더 다뤄보겠다.

 

Index Pattern(인덱스 패턴) 생성 방법

Index Pattern을 생성하는 방법

인덱스 패턴은 앞에서 잠깐 언급한대로 Stack Management > Index Patterns 메뉴에서 생성한다.

인덱스 패턴을 생성하기 전에 먼저 생성된 인덱스 패턴을 확인할 수 있다.

Create Index Pattern 버튼을 누르면 아래와 같은 화면이 뜬다.

Name 부분에는 인덱스 패턴으로 지정할 이름의 규칙을 지정해주고, Timestamp field부분에는 인덱스 패턴에서 기준 시간으로 사용할 date type 의 필드를 지정해준다.
syslog 인덱스를 인덱스 패턴으로 지정해보면 아래와 같다.

syslog-* 표시를 통해 “syslog-”로 시작하는 모든 인덱스를 포함하게 했다. 그 결과 인덱스 중에 “syslog-”로 시작하는 6개의 인덱스가 인덱스 패턴의 대상이 되었다. 그리고 생성한 인덱스에는 date type 필드가 @timestamp밖에 없으므로 Tiemstamp field에는 @timestamp 필드를 설정해주었다. 이렇게 설정하고 바로 생성해주어도 되겠지만, 인덱스 패턴을 삭제하고 다시 만드는 경우를 고려했을 때 Index Pattern의 ID를 설정해 주는것이 좋다.

“Show advanced settings” 부분을 누르면 아래 부분이 활성화가 된다. 그러면 “Custom index pattern ID” 라는 부분이 나오는데 해당 부분에 내가 원하는 ID 값을 설정할 수가 있다. Custom index pattern ID를 설정하면 인덱스 패턴을 지웠다가 다시 생성하더라도 Kibana 내부에서 관리하는 인덱스 패턴의 uuid가 고정이 되서 Discover나 Dashboard가 망가지지 않는다. 이후 Create index pattern 버튼을 눌러 생성을 하면 바로 아래와 같은 화면이 나오면서 인덱스 패턴이 생성된다.

Discover 메뉴에서 확인해보면 아래와 같이 잘 나오는 것을 확인 할 수 있다. 참고로 Discover 메뉴에서는 인덱스 패턴 생성 시에 설정했던 time field를 기준으로 정렬하여 보여준다. 만약 의도했던 시간과 다르게 나온다면 time field에 원하는 필드가 설정되었는지 확인해보고 잘못 설정되었다면 다시 설정해주어야 한다.

 

Index Pattern 생성 시 고려하면 좋은 포인트들

  • 인덱스 이름 규칙
  • ECS

 

인덱스 이름 규칙

앞서 인덱스 패턴을 생성할 때 인덱스의 prefix를 기준으로 그루핑했다. 인덱스 패턴 이름 규칙의 특성 상 인덱스의 이름이 전혀 다르다면 같은 인덱스 패턴으로 생성할 수가 없다. 위의 예를 보더라도 syslog-202201 인덱스는 test_index 인덱스와 같은 인덱스 패턴으로 생성할 수 없다. 그래서 인덱스를 생성할 때 부터 어떠한 이름 규칙으로 생성할지 정하는 것이 중요하다.

ECS (Elastic Common Schema)

ECS는 Elastic에서 인덱스로 저장할 때 저장되는 필드에 대해 필드명과 타입에 대해 권장하는 명세이다. 같은 인덱스 패턴으로 생성한다고 가정했을 때 인덱스마다 필드 이름이나 필드명이 다르다면 여러가지로 곤란할 수 있기 때문에 최대한 통일하는 것이 좋다. 그래서 Elastic에서는 공통적으로 많이 사용하는 필드에 대해 이름과 타입에 대해 정의한 명세를 공개했고 그것을 ECS(Elastic Common Schema)라고 한다. 이 내용 또한 나중에 별도 포스팅으로 다룰 예정이다.

 

마무리

이번 포스팅에서는 Elasticsearch의 인덱스(Index)와 Kibana의 인덱스 패턴(Index Pattenrs)의 차이에 대해 알아봤다. 인덱스 패턴을 사용하면서 얻는 이점과 생성 방법 등도 함께 다뤄봤다. 운영환경에서 잘 사용하려면 인덱스 이름에 대해 규칙을 통일성 있게 고려하고, 필드에 대해서도 이름과 타입을 통일하는 것이 좋다.

 

참고 자료


관련글 더보기

댓글 영역