KimDoubleB / LAB

 ᕙ(•̀‸•́‶)ᕗ
6 stars 0 forks source link

엘라스틱서치 실무 가이드 #2

Open KimDoubleB opened 11 months ago

KimDoubleB commented 11 months ago

엘라스틱서치 실무 가이드 책을 읽고 정리

챕터 별 바로가기

1장 - 검색 시스템 이해하기 2장 - 엘라스틱서치 살펴보기 3장 - 데이터 모델링 4장 - 데이터 검색 5장 - 데이터 집계 9장 - 엘라스틱서치와 루씬 이야기 10장 - 대용량 처리를 위한 시스템 최적화 11장 - 장애 방지를 위한 실시간 모니터링


docker

https://github.com/KimDoubleB/LAB/tree/master/docker/elastic-search


버전 별 변경사항

Elasticsearch 7

Elasticsearch 8


한글 검색용 필터

https://github.com/yainage90/hanhinsam

8.10.2 사용 시 참고사항


검색 FE 예제 코드

https://github.com/KimDoubleB/es-movie-finder

KimDoubleB commented 11 months ago

1장 - 검색 시스템 이해하기

검색 시스템의 기본 요소

수집기 > 색인기 > 스토리지 > 검색기

수집기


스토리지


색인기


검색기


관계형 데이터베이스와의 차이점

RDBMS에서는 검색을 위해 LIKE Query를 이용. 하지만 텍스트 매칭을 통한 단순한 검색만 가능함.


검색엔진은 데이터베이스에서 불가능한 여러 검색이 가능하다.


엘라스틱 서치가 강력한 이유


약점?

KimDoubleB commented 11 months ago

2장 - 엘라스틱서치 살펴보기

기본 용어

image

인덱스


샤드

타입


문서


필드


매핑


노드의 종류

마스터 노드


데이터 노드


코디네이팅 노드


인제스트 노드


여러가지 작업 팁

샤드 개수

인덱스 생성 시, 샤드 개수를 설정할 수도 있다.

number_of_shards: 프라이머리 샤드의 개수
number_of_replicas: 레플리카 샤드의 개수


스키마리스 기능은 사용하지 말자

스키마리스는 데이터만 보고 알아서(default로) 매핑이 되도록 설정하는 것


인덱스 생성 시, 주의점

한번 생성된 매핑정보는 변경할 수 없다.

KimDoubleB commented 11 months ago

3장 - 데이터 모델링

한번 생성한 매핑 타입은 변경할 수 없다. 그렇기에 아래 사항을 고민해 매핑정보를 설정해야한다.


매핑정보

매핑생성


매핑확인


매핑 파라미터


메타 필드


필드 데이터 타입


분석기

루씬을 기반으로 한 텍스트 기반 검색엔진


텍스트에 분석기를 따로 설정하지 않으면 Standard Analyzer가 사용됨


분석기는 데이터의 특성에 따라 원하는 분석 결과를 미리 예상해보고 해당 결과를 얻기 위한 옵션을 적용해 설정해야 함.


REST API 제공함


역색인 구조

책 뒤 단어로 문서 페이지를 찾을 수 있는 구조를 의미.

색인한다는 것이 역색인 파일을 만든다는 것.


분석기의 구조

  1. 문장을 특정한 규칙에 의해 수정함
  2. 수정한 문장을 개별 토큰으로 분리
  3. 개별 토큰을 특정한 규칙에 의해 변경

기본적으로 제공하는 분석기(Analyzer)들이 있고, 아래 필터들을 조합해 Custom 분석기를 정의해 활용할 수도 있다.


필터 구조

image


Char filter (전처리 필터)


Tokenizer filter


Token filter


색인, 검색 시 분석기를 각각 설정

색인하는 것과 검색하는 것 과정에 대해 분석기를 따로 설정하고 싶을 수 있다.


동의어 사전

색인 데이터를 토큰화 해 저장할 때, 동의어/유의어에 해당하는 단어를 함께 저장해 검색이 가능해지게 할 수 있다.


추가하는 방식

  1. 동의어를 매핑 설정 정보에 미리 파라미터로 등록하는 방식
  2. 특정 파일을 별도로 생성해 관리하는 방식 (추천)

아래와 같은 형태로 파일을 생성하고(txt), synonyms_path 에 해당 파일을 보도록 설정해 적용

Elasticsearch, 엘라스틱서치 // 동의어 추가
Harry => 해리 // 동의어 치환


색인 파일을 변경한다고 자동 reload 되지 않는다.


인덱스 Reload

POST {index_name}/_close

POST {index_name}/_open


Document API

아래와 같은 API들이 제공된다.


문서 파라미터

문서 ID (_id)

생성 시, Id를 따로 설정하지 않으면 자동으로 문서 ID가 생성된다.


버전관리 (_version)

색인된 모든 문서는 버전 값을 가짐

이 version 값으로 낙관적 락을 지원할 수 있는 것으로 보인다.


오퍼레이션 타입 (op_type)

일반적으로 ID가 이미 존재하는 경우에는 update 작업이 일어나고, 없으면 create 작업이 일어난다. (upsert)

데이터가 존재할 경우, update 하지않고 색인이 실패하길 원한다면 op_type 을 사용하면 된다.


타임아웃(timeout)


API

KimDoubleB commented 11 months ago

4장 - 데이터 검색

검색 API

색인시점과 검색시점의 동작과정

색인시점


검색시점



검색 방법

검색 방법은 2가지가 제공됨



URI 검색은 _search path에 q 파라미터 등을 통해 검색(153p)할 수 있는데, 복잡한 질의는 불가능하며 의미를 파악하기 어렵다.

그렇기에 간단한 질의, 테스트 용도가 아니라면 RESTful API를 이용하는 것이 낫다.



RESTful API (Query DSL)

위 예제를 아래와 같이 작성해 요청할 수 있다.

POST movie_search/_search
{
  "query": {
    "query_string": {
      "default_field": "movieNmEn",
      "query": "movieNmEn:* OR prdtYear:2017"
    }
  },
  "from": 0,
  "size": 5,
  "sort": [
    {
      "_score": {
        "order": "desc"
      },
      "movieCd": {
        "order": "asc"
      }
    }
  ],
  "_source": [
    "movieCd",
    "movieNm",
    "mvoieNmEn",
    "typeNm"
  ]
}



Query DSL 이해하기

Search your data | Elasticsearch Guide [8.10] | Elastic

Request body 필드



Response body 필드



Query와 Filter

Query context: Analyzer에 의한 전문 분석이 필요한 경우

POST  movie_search/_search
{
  "query": {
    "match": {
      "movieNm": "기묘한 가족"
    }
  }
}



Filter context: Yes/No로 판단할 수 있는 조건 검색의 경우

POST movie_search/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": {
        "term": {
          "repGenreNm": "다큐멘터리"
        }
      }
    }
  }
}



주요 파라미터

Multi index 검색

여러 인덱스를 한 번에 조회할 수 있음

  1. , 을 이용해 다수의 인덱스 명을 입력하면 된다.
POST movie_search,movie_auto/_search
{
   "from": 0,
   "size": 5,
   "query": {
     "term": {"repNationNm": "한국"}
   }
 }


  1. * 와일드카드를 이용해 다수의 인덱스를 대상으로 패턴에 맞는 인덱스만 골라 조회 요청을 할 수도 있다.
POST /log-2023-*/_search

중요한건 다수의 인덱스가 다른 스키마를 가지고 있어도 검색이 가능하다는 것.



쿼리 결과 페이징

from , size 파라미터를 이용해 Pagination를 지원



주의할 점은 Offset pagination 특징을 가진다는 것이다.



쿼리 결과 정렬

sort 파라미터를 통해 결과를 정렬할 수 있다.

기본적으로는 계산한 유사도 스코어(score)로 정렬이 되는데, 어떠한 이유로 인해 다른 조건으로 정렬하고 싶은 경우 이를 활용하면 된다.

여러 정렬 조건을 활용할 수도 있다.

POST movie_search/_search
{
   "query": {
     "term": {
       "repNationNm" : "한국"
     }
   },
   "sort" :{
     "prdtYear": {
        "order": "asc"
      },
            "_score": {
        "order": "desc"
      }
   }
}



_source 필드 필터링

결과 문서에 대해 특정 필드만 가져오고 싶다면 _source 를 이용하면 된다.



operator 설정



**minimum_should_match 설정**

OR 조건으로 검색하는 경우, 결과가 엄청 많을 수 있다.

이를 방지하기 위해 Term의 개수가 최소 몇 개 이상 매치되는 경우만 결과로 나오도록 설정이 필요할 수 있다.

이 때, minimum_should_match 를 이용하면 된다.

"query": {
  "match": {
    "movieNm": {
      "query": "자전차왕 엄복동",
      "minimum_should_match": 2
    }
  }
}



Fuzzy query

기본적으론 단순한 값을 찾는 Match query를 이용하는데, 유사한 값도 포함시키고 싶은 경우 fuzziness 옵션을 이용해 Fuzzy Query를 사용할 수 있다.

Common options | Elasticsearch Guide [8.10] | Elastic

Fuzzy query | Elasticsearch Guide [8.10] | Elastic

레벤슈타인 편집 거리 알고리즘을 기반으로 문서의 필드 값을 여러번 변경하고, 이를 허용범위의 텀으로 변경해가며 문서를 찾는다.



Query DSL 주요 쿼리

다양한 쿼리 검색을 제공한다. 사용하기 위해서는 query 필드 하위에 해당 조건을 사용하면 된다.



엘라스틱서치는 성능 상의 이유로 Parent 문서와 Child 문서를 모두 동일한 샤드에 저장함.



버전도 많이 올라갔고, 책에서는 모든 쿼리를 다루지 않고 있기에 더 자세한 내용은 공식문서를 보는 것이 좋다.

Query DSL | Elasticsearch Guide [8.10] | Elastic



부가적인 검색 API

내부 동작방식



동적분배 방식

PUT _cluster/settings
{
    "transient": {
        "cluster.routing.use_adaptive_replica_selection": true
    }
}

현재 버전인 8.10에서는 이를 기본 값으로 사용하는 것으로 보인다.

By default, Elasticsearch uses adaptive replica selection to route search requests. This method selects an eligible node using shard allocation awareness and the following criteria:

  • Response time of prior requests between the coordinating node and the eligible node
  • How long the eligible node took to run previous searches
  • Queue size of the eligible node’s search threadpool



글로벌 타임아웃 설정

앞서 검색 API에서 타임아웃을 다뤘는데, 기본 값이 무제한(-1)이였다.

다수의 무거운 쿼리가 실행된다면, 전체 시스템에 영향을 줄 수 있으므로 전체 정책으로 타임아웃을 설정할 수 있다.

PUT _cluster/settings
{
    "transient": {
        "search.default_search_timeout": "1s"
    }
}



다양한 부가 쿼리들

KimDoubleB commented 11 months ago

5장 - 데이터 집계

집계

보통 통계 프로그램은 배치 방식으로 데이터를 처리한다.


반면 엘라스틱서치는 많은 양의 데이터를 조각내어 관리함.



엘라스틱서치가 집계에 사용하는 기술

캐시



Aggregation API

서비스를 운영하다보면 검색 쿼리로 반환된 데이터를 집계하는 경우가 많다.

검색 쿼리의 집계는 다음과 같이 기존 검색 쿼리에 집계 구문을 추가하는 방식으로 수행한다.

{
    "query": { ... },
    "aggs": { ... }
}

질의가 생략되면 match_all 쿼리로 수행되어 전체문서에 대한 집계가 수행됨.



집계 연산

Aggregations | Elasticsearch Guide [8.10] | Elastic



메트릭 집계

다양한 메트릭 집계를 제공.

이름에서 알 수 있듯 정수/실수 같은 숫자 연산 값 집계를 수행한다.



2가지 집계로 나뉜다.

  1. 단일 숫자 메트릭 집계 (single-value numeric metrics aggregation)
    • 수행한 결과 값이 하나인 경우
    • sum, avg 등
  2. 다중 숫자 메트릭 집계 (multi-value numeric metrics aggregation)
    • 수행한 결과 값이 여러개인 경우
    • stats, geo_bounds 등



집계 구조

요청

GET /apache-web-log/_search?size=0 // test를 위해 Size를 0으로 설정
{
  "aggs": {
    "집계 이름": {
      "집계 타입": {
        "field": "필드명"
      }
    }
  }
}


응답

{
  "took": 78, // 걸린 시간
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": { // 검색 결과
    "total": {
      "value": 5,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [...]
  },
  "aggregations": {
    "my-agg-name": {                           
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": []
    }
  }
}



집계 종류



알아둘 것

결과에 대해 변화를 시키고 싶은 경우, script 를 사용할 수 있다.

How to write scripts | Elasticsearch Guide [8.10] | Elastic

GET my-index-000001/_search
{
  "script_fields": {
    "my_doubled_field": {
      "script": { 
        "source": "doc['my_field'].value * params['multiplier']", 
        "params": {
          "multiplier": 2
        }
      }
    }
  }
}


Cardinality 집계의 경우, 모든 문서에 대해 중복된 값을 집계하는 것은 성능에 큰 영향을 줄 수 있다.

Cardinality aggregation | Elasticsearch Guide [8.10] | Elastic



버킷 집계



집계 종류



알아 둘 것

집계를 수행할 땐 각 샤드에 집계 요청을 전달하고, 각 샤드는 집계 결과에 대해 정렬을 수행한 자체 뷰를 갖는다.

그리고 이것들을 병합해 최종 뷰를 구성하기에 포함되지 않은 문서가 존재하는 경우, 집계가 정확하지 않을 수 있다.



파이프라인 집계

다른 집계로 생성된 버킷을 참조해 집계를 수행하는 집계 (aggs 내 aggs)



형제 집계

동일 선상의 위치에서 수행되는 새 집계.

ex) 분 단위 데이터량 합산과 가장 큰 데이터량 구하기

GET /apache-web-log/_search?size=0
{
  "aggs": {
    "histo": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "minute"
      },
      "aggs": {
        "bytes_sum": {
          "sum": {
            "field": "bytes"
          }
        }
      }
    },
    "max_bytes": {
          "max_bucket": { // 버킷 중 가장 큰 값(Max) 계산
        "buckets_path": "histo>bytes_sum" // histo 버킷의 bytes_sum 버킷 참조
      }
    }
  }
}



부모 집계

생성된 버킷을 사용해 집계를 수행하고, 그 결과를 기존 집계에 반영.





예제

GET /apache-web-log/_search?size=0
{
  "aggs": {
    "histo": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day"
      },
      "aggs": {
        "bytes_sum": {
          "sum": {
            "field": "bytes"
          }
        },
        "sum_deriv": {
          "derivative": { // 현재 값과 이전 값을 비교하는 집계 수행
            "buckets_path": "bytes_sum"
          }
        }
      }
    }
  }
}



근삿값으로 제공되는 집계 연산

다시 한번 집계 정리


이 가운데 실제로 수학적인 계산을 하는 것은 메트릭 집계 뿐이다.



왜 Cardinality 집계는 근사치를 이용할까?


문제


제안


해결

엘라스틱서치는 위 제안 중 정확도 포기를 선택했다.

KimDoubleB commented 11 months ago

9장 - 엘라스틱서치와 루씬 이야기

Untitled

클러스터

데이터를 실제로 가지고 있는 노드의 모음


여러 클러스터 간 한번에 검색해야하는 경우도 있다.


노드

물리적으로 실행된 런타임 상태의 엘라스틱서치 (엘라스틱서치 인스턴스)


같은 클러스터 내 모든 노드는 서로 다른 노드와 수시로 정보를 주고받음.


인덱스

유사한 특성을 가지고 있는 문서들을 모아둔 컬렉션

원하는 만큼의 많은 문서를 저장할 수 있으며, 물리적인 샤드형태로 나눠서 다수의 노드에 저장됨.


문서

검색 대상이 되는 실제 물리적인 데이터


샤드

데이터를 분산해 저장하는 방식, 개념, 단위.


인덱스에 쿼리하면, 다음과 같은 과정을 거침.


이로써 2가지 좋은 점이 있음


레플리카

샤드의 복제본.


특정 노드가 문제가 생긴 경우, 페일오버 메커니즘을 통해 레플리카를 이용해 안정적인 클러스터 운영을 보장함.


세그먼트

문서가 저장되는 데이터 자료구조.


엘라스틱 서치와 루씬

루씬 라이브러리가 핵심이며, 크게 2가지 기능을 가지고 있음.


루씬 인덱스: 이 2가지 기능을 가지고 색인 및 검색을 제공


엘라스틱서치는 이 독립적인 루씬 인덱스를 엘라스틱서치 샤드라는 형태로 확장해 서비스하는 것


세그먼트 기본 동작 방식

하나의 루씬 인덱스는 내부적으로 다수의 세그먼트로 구성되어 있음.


루씬에서는 세그먼트를 관리하기 위한 용도로 커밋 포인트(Commit Point) 자료구조를 사용


즉, 시간이 흐를수록 세그먼트들의 개수는 늘어나는 것인데, 너무 많이 생성되면 읽기 성능저하가 일어남.


왜이리 복잡하게 할까? 그냥 기존 세그먼트 파일에 덮어씌우면 되지 않나?


수정/삭제는 어떻게 일어나는가?


루씬 Flush, Commit, Merge

Flush: 읽기 가능하게 만드는 작업


Commit: 쓰기 작업 ⇒ Flush


Merge: 세그먼트 통합 작업 ⇒ Optimize API


엘라스틱서치 Refresh, Flush, Optimize API

엘라스틱서치 Refresh (루씬 Flush)


엘라스틱서치 Flush (루씬 Commit)


엘라스틱서치 Optimize API (루씬 Merge)


엘라스틱서치 샤드 최적화

운영 중에 샤드의 개수를 수정하지 못하는 이유?

레플리카 샤드의 복제본 수는 얼마가 적당할까?


레플리카 수는 앞서 이야기했듯 운영 중 언제든 변경이 가능하다.


클러스터 내 운영 가능한 최대 샤드 수는?


클러스터에 많은 수의 샤드가 존재할 경우?

클러스터 내 모든 샤드는 마스터 노드에서 관리된다.


샤드의 물리적인 크기와 복구시간

마스터 노드 입장에서는 샤드가 가지고 있는 데이터 수보다 데이터의 물리적인 크기가 더 중요하다.


일단 장애가 발생하면,


하나의 인덱스에 생성 가능한 최대 문서 수는?


안정적인 클러스터 운영을 위해서는 자신의 환경에 맞게 다방면에 걸친 충분한 테스트가 필요.

KimDoubleB commented 10 months ago

7장 - 한글 검색 확장 기능

Suggest API가 키워드 자동완성을 지원하지만 한글 키워드 대상에서는 제대로 동작하지 않는다.


Suggest API는 4가지 방식을 제공한다.

  1. Term Suggest API: 추천 단어 제안 (유사한 단어)
  2. Completion Suggest API: 자동완성 제안 (검색어 예측)
  3. Phrase Suggest API: 추천 문장 제안
  4. Context Suggest API: 추천 문맥 제안


Term Suggest API

Edit distance(편집거리)를 이용해 비슷한 단어를 제안


ICU 분석기를 통해 한글 오타 교정 가능


Completion Suggest API

검색을 효율적으로 돕기 위해 자동완성 기능을 제공


Example

PUT movie_term_completion
{
    "mappings": {
        "_doc": {
            "properties": {
                "movieNmEnComple": {
                    "type": "completion"
                }
            }
        }
    }
}

POST movie_term_completion/_search
{
    "suggest": {
        "movie_completion": {
            "prefix": "l",
            "completion": {
                "field": "movieNmEnComple",
                "size": 5
            }
        }
    }
}

일반적으로 전방일치(prefix)만 가능함. 실 환경과 맞지 않음.

부분일치를 해야한다면, 부분일치 하고자 하는 부분을 분리해 색인 데이터를 구성해야 함.



맞춤법 검사기

오타 교정, 한영/영한 오타 교정 등을 Analyzer를 직접 구현해 사용할 수 있다.

책에서는 직접 구현하진 않고, 구현해놓은 소스를 이용하여 테스트 한다.


PUT /company_spellchecker
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "korean_spell_analyzer": {
            "type": "custom",
            "tokenizer": "standard",
            "filter": [
              "trim",
              "lowercase",
              "javacafe_spell"
            ]
          }
        }
      }
    }
  }
}

PUT /company_spellchecker/_doc/_mappings
{
    "properties": {
      "name": {
        "type": "keyword",
        "copy_to":["suggest"]
      },
      "suggest": {
        "type": "completion",
        "analyzer": "korean_spell_analyzer"
      }
    }
}

--- 검색 ---

POST /company_spellchecker/_doc/_search
{
    "suggest": {
        "my-suggestion": {
            "text": "샴성전자",
            "term": {
                "field": "suggest"
            }
        }
    }
}


프로세스


교정 과정에서 중요한 것


직접 구현해보기

Completion Suggest API를 이용하면 간단하게 자동완성을 이용할 수 있다.


하지만 앞서 이야기했듯 한글은 유니코드 변함의 이슈로 인해 제대로 지원되지 않는다.


이를 해결하기 위해 루씬에서 제공하는 다양한 분석기능(API)을 활용할 수 있다.


부분일치 구현하기


대표적인 Ngram 3가지



💡 복습 Analyzer Tokenizer + Token Filter. 데이터가 들어오면 검색 가능하도록 정제/가공

Tokenizer 정해진 Separator로 토큰을 분리하는 역할. Analyzer에는 하나 이상의 Tokenizer가 있어야만 함 ****ex) Whitespace Tokenizer

Token Filter Tokenizer로 분리된 토큰을 가공하는 역할. ex) Lowercase filter



초성 검색을 지원하고 싶다?


https://techblog.woowahan.com/7425/

IMG_5225

KimDoubleB commented 10 months ago

nori_tokenizer 실습

https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-nori-tokenizer.html

image

user_dictionary는 수정해도 바로 반영되지 않음.

하지만 이 방식을 적용해도 이미 인덱싱 된 문서에는 적용되지 않는다.

KimDoubleB commented 10 months ago

10장 - 대용량 처리를 위한 시스템 최적화

노드 실행환경과 JVM 옵션

OpenJDK 기준

지원 매트릭스


근데 사실 최근에 와서는 Container를 사용하고, 이에 따라 따로 Java를 따로 설치해야할 필요가 있을까 싶다.


현재 버전 유지보수는 해줄까? EOL이 언제까지인가?

Elastic 제품 단종일

ES/Lucene도 어찌됬든 Java로 만들어진 프로젝트들.


ES는 다년간의 경험으로 적합한 JVM 옵션을 사용하고 있다.

Advanced configuration | Elasticsearch Guide [8.11] | Elastic


힙 크기를 32GB 이하로 유지해야하는 이유

JVM heap size

By default, Elasticsearch automatically sets the JVM heap size based on a node’s roles and total memory. Using the default sizing is recommended for most production environments.


**-Xms, -Xmx 의 크기를 같게 설정해야 한다.**


운영체제의 50% 메모리 공간을 보장하자.


Heap 사이즈를 Compressed ordinary object pointers(oops) threshold보다 높게 설정하지 말자.

Object Pointer는 개체의 메모리 번지를 표현하는 주소값.

Untitled

[Java] Compressed Class Space와 Compressed Object Pointer


Zero based Compressed OOP


엘라스틱서치와 가상메모리, 메모리 스와핑

가상 메모리


메모리 스와핑


적은 메모리로도 프로그램이 돌아가고 있다?


Lucene은 내부적으로 Java에서 제공하는 NIO를 이용하여 운영체제 커널에서 제공하는 mmap 시스템 콜을 직접 호출함.


ES에서 스와핑은 노드 안정성에 치명적임. 그래서 최대한 피해야 함.

Disable swapping | Elasticsearch Guide [8.11] | Elastic


시스템 튜닝 포인트

ulimit 명령어

[Linux] 5분이면 가능! ulimit 확인 및 설정 방법(feat. open files)


sysctl 명령어

sysctl 명령어

KimDoubleB commented 10 months ago

11장 - 장애 방지를 위한 실시간 모니터링

11.1 클러스터 Health 체크

GET /_cluster/health 를 통해 Health 체크를 지원함.

Cluster health API | Elasticsearch Guide [8.11] | Elastic

{
  "cluster_name" : "testcluster",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 1,
  "active_shards" : 1,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 1,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 50.0
}


11.2 물리적인 클러스터 상태 정보 조회

엘라스틱서치는 실행 시 config 디렉터리에 설정된 환경설정 정보를 바탕으로 노드를 인스턴스화한다.

이 때, 사용 가능한 리소스를 적절히 분산해 각 모듈에서 나눠 사용할 수 있도록 자동으로 리소스를 분배한다.

클러스터가 구성되면 물리적인 노드가 실제로 어떤 설정을 가지고 있으며, 사용 중인 리소스가 어떤지 상태정보 API를 통해 확인할 수 있다.


클러스터 레벨 물리상태 조회


노드 레벨 물리상태 조회


제공되는 정보는 다음과 같다.


11.3 클러스터에 대한 실시간 모니터링

elasticsearch에서는 실시간 모니터링을 위해 여러 기준별로 상세한 정보를 API로 제공한다.


상세해서 레벨마다 많은 양의 데이터를 제공한다. 필요할 때마다 찾아보는게 좋을 듯.

대충 아래와 같은 정보들을 원한다면 찾아보면 된다.


11.4 Cat API를 이용해 콘솔에서 모니터링

Compact and aligned text (CAT) APIs | Elasticsearch Guide [8.11] | Elastic

cat? 리눅스 cat에서 영감받아 만들어진 API로 콘솔에서 모니터링 하기 위한 목적으로 만들어졌음.


결과를 보면 대충 다음과 같다.

Untitled 1


여러 파라미터를 지원한다.

Untitled 2