Elasticsearch 검색 서비스 불가 이슈

JunMyung Lee·2024년 4월 8일
0

Elasticsearch

목록 보기
36/41

서비스를 운영 중에, 갑자기 모든 검색이 불가능한 이슈가 발생했고, 해당 상황을 조사하는 내용을 정리하고자 한다.

상황

  • 검색 서비스 불가 현상 확인
  • Kibana 접근 불가 확인
    * 라이센스 만료 오류 ( license is not available )

    Elasticsearch 7.x 버전은 기본 라이센스의 만료 정책이 따로 존재하지 않는다.

  • Data 노드 전체 Shutdown
  • Kibana내장 API를 사용할 수 없어 확인이 불가능
    * 클러스터의 상태 확인 및 각 노드 속성정보 확인 불가능

Data 노드가 모두 Shutdown되면서 인증정보 샤드이탈한 상태이기 때문에 Kibana에서는 라이센스 오류가 발생

시나리오

  • 사용자가 보고서 형태의 문서를 복사 (Ctrl + c)
  • 검색창에 대량의 문자열을 가진 내용을 붙여넣기 (Ctrl + v)
  • 검색창에 문자열이 입력되었으므로 자동완성 검색
  • 이때 입력된 모든 내용이 Data 노드로 검색을 시도 하였고, 예외 발생으로 모든 Data 노드 다운
  • 사용자가 검색 버튼 클릭 이후 검색 결과 없음

조사

  • Data 노드의 최초 에러 로그에서 Lucene coreStackOverFlow 예외 로그 확인
  • Lucene GraphTokenStreamFiniteStrings#articulationPointsRecurse 부분에서 확인
    GraphTokenStreamFiniteStrings.java 클래스 명에서 synonym_graph관련 토큰 처리일지 추측
    메소드명에서도 알 수 있듯이 재귀처리를 하는 부분 존재

정확한 값을 알 수는 없지만 대략 Segment에 검색을 시도하는 토큰의 길이가 약 4,000자를 넘을 경우 StackOverFlow가 발생 할 수 있다고 안내

참고 자료

해외 자료에서 우리와 비슷한 사례가 있었고 lucene 9.7.0버전 이후부터 release 처리하겠다고 안내되어있다.
Limit the recursion depth on token graph for preventing StackOverflow

실제 변경 코드 확인

그렇다면 어떤 처리가 되어있을까? 예외가 발생한 lucene-core 8.8.2lucene-core 9.7.0의 코드 차이를 확인해 보았다.

lucene-core 8.8.2(Left) ::: lucene-core 9.7.0(Right)

9.7.0에서는 MAX_RECURSION_LEVEL=1000; 변수 생성 코드가 존재

lucene-core 8.8.2(Left) ::: lucene-core 9.7.0(Right)

9.7.0에서는 MAX_RECURSION_LEVEL값을 비교처리하는 로직이 존재

예상했던 긴 문자열이 왔어도, 처리가 가능하거나, 일부 내용을 잘라서 정상처리
를 하리라 예상했는데, 실제 코드에서는 IllegalArgumentException 예외를 발생시키고 종료된다.
즉, 정상처리로 인한 서비스가 지속되려면 검색을 시도하기전에 조건처리가 되어야 한다

profile
11년차 검색개발자 입니다. 여러 지식과 함께 실제 서비스를 운영 하면서 발생한 이슈에 대해서 정리하고 공유하고자 합니다.

0개의 댓글