API를 수정하고나서부터 Elasticsearch에 Document가 쌓이지 않는 문제가 발생했다.
Logstash 로그 내역을 까보니 다음과 같은 이유로 데이터가 들어오지 않고 있었다.
ES에서 field 개수를 기본적으로 1000개로 설정해두고 있어서 error가 떨어지고 있었다. API를 수정하면서 field개수가 1000개를 넘어가서 위와 같이 발생하고 있었다.
내가 생각해본 해결 방법은 3가지였다.
1. API의 데이터를 수정
2. ES의 field 최대 개수를 늘려주는 것
3. Logstash에서 remove field를 통해 불필요한 정보 제거
먼저 1번의 경우, API 데이터는 나만 사용하는 데이터가 아니기 때문에 건들기가 어렵다고 판단하였다. 나는 필요없는 정보일지라도 다른 부서에서는 해당 정보를 필요로 할 수 있기 때문에 그대로 두는게 맞다는 말씀을 해주셨다.
2번의 경우, 에러를 마주했을 때 직관적으로 가장 먼저 떠올랐던 해결방법이었다. 최대 개수가 1000개라면, 최대 개수를 늘려주면 해결할 수 있겠네!라는 생각이 들었다.
하지만 그렇다면 적정 최대 개수는 몇개인지, 어떤 걸 근거로 최대 개수를 산정할 수 있을지, 이에 따른 성능 문제는 없을지와 같은 의문이 들었다.
일단 document가 해당 문제때문에 안들어오는게 맞는지 확인하기 위해 최대 field개수를 늘려주고 테스트를 해보았다.
index settings에서 "index.mapping.total.fields.limit" 값을 임의로 2000으로 늘려주었다.
(API로 추가해주어도 되고, Kibana UI에서 직접 추가해주어도 된다.)
이렇게 테스트해보니 Document가 다시 들어오기 시작했다. field개수 제한 때문이 맞았었다..
테스트는 했지만, 공식문서를 참조하면 추천하는 방법은 아닌 듯 하다. (당연히 이미 다방면으로 고려하였고, 늘려도 된다는 충분한 근거가 있으면 늘려도 된다... -> 나의 경우 이 근거를 어떻게 찾아야할지 잘 몰랐다)
2번과 같이 parameter값을 수정해주면 고려해야할 부분들이 많았기도하고, 3번 방법을 쓴다면 불필요한 데이터들을 제외시키기 때문에 더 낫겠다고 판단하였다. 따라서 3번 방법을 시도하였다.
remove_filter을 적용하려고 하는데, 찾아보니 mutate 필터에도 remove_filter가 있었고, drop 필터에도 remove_filter가 있었다.
둘의 차이를 짧게 보고 넘어가자.
결론적으로 drop을 쓰면 document가 삭제되고, mutate를 쓰면 해당 field만 제외한다고 한다.
따라서 나는 mutate필터의 remove_field를 사용하였다.
(여러분은 이런 실수 하지 마십시오... ㅎㅎ.;...)
+) nested filter는 []으로 묶어줘야 합니다. 예를들어 apple.banana.orange 필드가 있다면, 다음과 같이 작성하면 삭제가 가능합니다
filter{
mutate{
remove_field => ["[apple][banana][orange]"]
}
}
'Elasticsearch' 카테고리의 다른 글
[ElasticSearch] Split Brain (마스터노드 구성) (0) | 2023.04.25 |
---|---|
[Elasticsearch] ELK스럽게 데이터 수정하기 (역색인구조) (0) | 2023.04.24 |