Elasticsearch에서 bulk를 사용하여 많은 양의 데이터를 Elasticsearch에 저장할 경우 분명 HTTP 요청은 정상적으로 끝이 났는데 데이터가 저장이 안 되는 경우가 발생할 수 있습니다. 여기서 중요한 것은 Elasticsearch로 보낸 HTTP의 Response는 200이라는 정상적인 값을 리턴을 하기 때문에 문제를 찾기가 어려운데요. 이럴 때는 Response의 state code를 보는 것이 아니라 Response의 body의 내용을 볼 필요가 있습니다. 그러면 429라는 에러를 볼 수 있는데요. HTTP 429 Error는 Too many requests를 뜻 하는 에러입니다. 이럴 때 문제를 해결할 수 있는 방법이 2가지가 있습니다. 첫번째 방법은 당연하게도 bulk의 개수를 줄이는 것입니다. 그러나 우리는 이러한 단순한 방법을 원하지 않았을 것입니다. 그래서 두번째 방법으로는 thread_pool의 wrtie queue size를 늘리는 방식입니다. 이런 방식을 통하여 많은 양의 bulk를 처리하는 방식에 대하여 정리하였습니다.
ES디렉토리/config/elasticsearch.yml파일에 다음과 같은 설정 값을 추가합니다.
thread_pool.write.queue_size: 2000
thread_pool.write.size: 16
위와 같이 설정을 변경하였다면 Elasticsearch를 재시작합니다.
만약 다음과 같은 메시지가 발생한 다면
thread_pool.write.size의 값을 13보다 작은 값으로 설정하세요
java.lang.IllegalArgumentException: Failed to parse value [16] for setting [thread_pool.write.size] must be <= 13
Option | Desribe |
---|---|
thread_pool.write.size | write를 수행하는 스레드 풀의 스레드 수 |
thread_pool.write.queue_size | write를 할 때 사용되는 스레드 풀의 큐 크기 |
thread_pool.search.size | search를 수행하는 스레드 풀의 스레드 수 |
thread_pool.search.queue_size | search를 할 때 사용되는 스레드 풀의 큐 크기 |