서비스를 운영 중에, 갑자기 모든 검색이 불가능한 이슈가 발생했고, 해당 상황을 조사하는 내용을 정리하고자 한다.
Kibana
접근 불가 확인Elasticsearch 7.x 버전은 기본 라이센스의 만료 정책이 따로 존재하지 않는다.
Data 노드
전체 ShutdownKibana
및 내장 API
를 사용할 수 없어 확인이 불가능
Data 노드
가 모두Shutdown
되면서인증정보 샤드
가 이탈한 상태이기 때문에 Kibana에서는 라이센스 오류가 발생
Data 노드
로 검색을 시도 하였고, 예외 발생으로 모든 Data 노드 다운
Data 노드
의 최초 에러 로그에서 Lucene core
의 StackOverFlow
예외 로그 확인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.2
와 lucene-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 예외
를 발생시키고 종료된다.
즉, 정상처리로 인한 서비스가 지속되려면 검색을 시도하기전에 조건처리가 되어야 한다