Elasticsearch rejected exception

JunMyung Lee·2023년 3월 7일
0

Elasticsearch

목록 보기
14/37

원문 글

현재 운영중에 발생한 적은 없지만, ES를 운영하면서 알아야하는 이슈이므로 따로 정리한다. 원문 글이 더욱 자세하고 좋게 글이 작성되어 있고, 실제 내부에서 테스트할 여건이 안되므로 이 블로그에는 간략하게만 작성하도록 한다.

Thread Pool?

Thread Pool은 ES의 주요 기능들 (bulk, indexing, search 등등)을 Thread Pool의 형태로 생성하여 관리하는 것을 의미. 만약 bulk API를 통해 다량의 작업을 하게 되면 bulk Thread Pool에 생성되어 있는 다수의 bulk thread들을 통해서 요청을 처리한다.

더 이상 인입되는 요청을 처리할 수 있는 thread가 없을 경우

각각의 Thread Pool 별로 가지고 있는 queue에 요청을 넣게 되지만 그마저도 부족하게 될 경우에는 요청을 거부하게 되고 이때 rejected exception이 발생.

[2017-06-13T10:31:48,594][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 429 
({"type"=>"es_rejected_execution_exception", "reason"=>"rejected execution of org.elasticsearch.transport.TransportService$7@7b95e06b
on EsThreadPoolExecutor
[bulk, queue capacity = 50, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@481647a0[Running, pool size = 32, active threads = 32, queued tasks = 50, completed tasks = 2728908864]
]"})

Thread Pool 모니터링

ES 클러스터의 로그에는 rejected exception 관련 메세지가 남아 있지 않기 때문에 클러스터 자체의 로그 모니터링으로는 현재 클러스터에 rejected exception이 발생했는지 알 수가 없다. API호출을 통해서 확인해야 한다.

Cat thread pool api

검색 모니터링

GET _cat/thread_pool/search?h=id,node_name,name,active,rejected&format=json

[
  {
    "id" : "l-880eOQRPmAdJMrFxyWlw",
    "node_name" : "data-01",
    "name" : "search",
    "active" : "0",
    "rejected" : "0"
  },
  {
    "id" : "cS70o8yfTd2LZIzGD3uOCw",
    "node_name" : "data-03",
    "name" : "search",
    "active" : "0",
    "rejected" : "0"
  },
  {
    "id" : "KsdJ-dn1R_SUdrH4fr84mg",
    "node_name" : "data-02",
    "name" : "search",
    "active" : "0",
    "rejected" : "0"
  }
]

색인 모니터링

GET _cat/thread_pool/write?h=id,node_name,name,active,rejected&format=json

[
  {
    "id" : "l-880eOQRPmAdJMrFxyWlw",
    "node_name" : "data-01",
    "name" : "write",
    "active" : "0",
    "rejected" : "0"
  },
  {
    "id" : "cS70o8yfTd2LZIzGD3uOCw",
    "node_name" : "data-03",
    "name" : "write",
    "active" : "0",
    "rejected" : "0"
  },
  {
    "id" : "KsdJ-dn1R_SUdrH4fr84mg",
    "node_name" : "data-02",
    "name" : "write",
    "active" : "1",
    "rejected" : "0"
  }
]

ES는 API를 통해서 현재의 Thread Pool 상태를 확인할 수 있는 인터페이스를 제공한다. 여기서 rejected의 값은 현재 발생한 개수가 아니라 지금까지 발생한 값들의 누적치를 보여준다.

rejected exception 조치 사항

노드 증설

rejected exception은 현재 클러스터가 최대 처리 가능한 요청보다 많은 양의 요청을 처리하고 있다는 상황이므로, 노드를 증설한다.

queue_size 조절

rejected exception이 발생한. thread에 대해서 queue_size의 값을 증가한다. ( 모든 thead들의 queue_size의 기본값은 200)

queue_size 방식은 배치처럼 특정 순간에 bulk되는 문서가 많을 경우에 해당하는 방식이다. api에서의 유입이 지속적으로 비슷하다면, 노드증설을 해야한다.

queue에 쌓아 두고 처리하는 것을 클러스터의 처리량이 늘어난 것처럼 느낄 수 있기 때문에 클러스터의 처리 성능에 대한 왜곡이 발생할 수 있다 실질적으로는 100개의 요청만큼만 처리가 가능한데, queue를 활용하여 200개 이상의 처리가 가능한것으로 보일 수 도 있다. (api의 경우 지속적으로 유지가 되어야 하므로 다른 사이드이펙트를 발생 시킬수 있다.)

queue의 방식은 응급조치로 조치하고 추후 테스트를 통한 노드 증설이 필요하다.

0개의 댓글