loose
이로운 개발하기
loose
전체 방문자
오늘
어제
  • 전체 (207) N
    • ☕ Java (24)
    • 📘 Effective Java (9)
    • 🍃 Spring (48)
    • 📖 ORM (9)
    • ☸️ Kubernetes (13)
    • 🐧 Linux (5)
    • 🐋 Docker (5)
    • 🛠️ CI & CD (7)
    • 🕸️ Web (6)
    • 🔗 Distributed System (3)
    • 📜 Js (10)
    • 📈 Database (11)
    • 🗂️ Etc (34)
    • 🧑 Chitchat (11)
    • 📒 문학 (11) N
    • 👜 개인 공부 창고 (1)

공지사항

반응형

최근 글

최근 댓글

loose

이로운 개발하기

📈 Database

[ElasticSearch] 검색 방식, 장애 복구 정리(Circuit Breaker Exception)

2025. 3. 29. 18:29
반응형

검색 방식

from 방식

GET my_index/_search
{
  "from": 100000,
  "size": 10,
  "sort": [{ "timestamp": "asc" }]
}
이 요청은 100,000번째 문서부터 10개를 반환하는 것이 목적입니다.

페이지를 쉽게 이동할 수 있으나 깊은 페이지일수록 느립니다.

Scroll API

POST my_index/_search?scroll=1m
{
  "size": 1000,
  "sort": [
    { "timestamp": "asc" }
  ],
  "_source": true
}

 

이전 페이지 한 개만 유지하는 것이 아니라, 처음 요청 이후 모든 스냅샷 데이터를 유지하므로 백업 용도가 아니면 보통 사용하지 않는다. 

Search After

POST my_index/_search
{
  "size": 10,
  "sort": [
    { "timestamp": "asc" },
    { "_id": "asc" }
  ],
  "search_after": [1685081830000, "doc-id-123"],
  "_source": true
}

보통 대용량 검색에서 페이지네이션이 필요할 땐 Search After를 사용한다.

sort 값을 필수로 지정해줘야 하며 text 값을 sort값으로 지정할 시 field data cache값이 과도하게 할당될 수 있으므로 .keyword를 이용해서 field data caching을 피해야한다.

 

 

장애 복구(개발계)

{"statusCode":401,"error":"Unauthorized","message":"[circuit_breaking_exception] [parent] Data too large, data for [<http_request>] would be [1036689400/988.6mb], which is larger than the limit of [1020054732/972.7mb], real usage: [1036689400/988.6mb], new bytes reserved: [0/0b], usages [request=0/0b, fielddata=462101243/440.6mb, in_flight_requests=0/0b], with { bytes_wanted=1036689400 & bytes_limit=1020054732 & durability=\"PERMANENT\" }"}

개발계에서 개발하다보면 Circuit Breaker Exception을 종종 마주치곤한다.

 

우선 Elastic Search는 JVM의 heap 메모리를 할당하는데, 만약 개발을 위해서 1GB로 heap을 설정하는 경우 아무 것도 동작시키지 않아도 상시 40% ~ 75%을 heap 메모리가 할당되어있다.

아래의 명령어로 충분히 확인해볼 수 있다.

GET _nodes/stats/os

하지만 문제는 70%를 넘어가는 순간 Circuit Breaker Exception이 나타난다.

기본적으로 heap 사용량이 70%로 Default로 지정되어있기 때문이다.

PUT _cluster/settings
{
  "persistent": {
    "indices.breaker.total.limit": "95%"
  }
}

위 명령어를 통해 95%로 설정해보자.

GET _cluster/settings?include_defaults=true&pretty

위 명령어를 통해 확인할 수 있다.(참고로 수동으로 퍼센테이지를 조절하기 전엔 위 API로는 노출되지 않는 값이다.)

 

Field Data

Search After에서 서술한 대로 Sort 값을 잘못 설정하면 Field Data가 과도하게 할당되어 Heap 메모리에 영향이 가니 아래 명령어로 확인 및 삭제를 해주는 것이 좋다.

GET _nodes/stats/indices/fielddata?pretty
POST _cache/clear?fielddata=true

아예 위의 명령어로도 접근이 안된다면 DB를 껐다켜야한다.

{
  "sort": {
    "_script": {
      "type": "number",
      "script": {
        "lang": "painless",
        "source": "doc['title'].value.length()"

필드데이터는 듣기만 하면 마치 굉장히 쓸모 없는 것 처럼 보여진다.

쓸모 없는게 맞긴한데, 특수한 상황에선 필드 데이터가 필요하다.

위의 코드에선 title의 길이별로 정렬하는 것인데 이럴땐 keyword로 해결이 불가능하다

이럴때 필드데이터를 활성화시켜야 제대로 정렬이 된다. 

728x90

'📈 Database' 카테고리의 다른 글

[DB] Json을 RDBMS(MySQL, PostgreSQL)에 저장해도 좋을까?  (1) 2024.10.02
[InnoDB Engine] 페이지란?  (0) 2024.09.12
MaxScale 지식  (0) 2024.07.19
[Mysql] No space left on Issue 해결  (0) 2024.06.10
ElasticSearch 8 Windows 설치  (0) 2024.02.22
    '📈 Database' 카테고리의 다른 글
    • [DB] Json을 RDBMS(MySQL, PostgreSQL)에 저장해도 좋을까?
    • [InnoDB Engine] 페이지란?
    • MaxScale 지식
    • [Mysql] No space left on Issue 해결
    loose
    loose
    불만하는 사람은 90명, 해결하는 사람은 9명, 리드하는 사람은 1명 음악과 낭만을 좋아합니다.
    hELLO. 티스토리 스킨을 소개합니다.
    제일 위로

    티스토리툴바