elasticsearch
-
Elasticssearch BulkProcessor를 사용하자elasticsearch 2021. 3. 13. 00:24
cdc(change data capture) api를 구축해서 사용하고 있었다 webflux를 사용했고 클라이언트에서도 데이터 셋은 최대한 중복처리 해서 보내주지만 요청 당 es로 bulk 하는 방식이었다. 즉 client에서 1,2,3,4~n의 변경된 테이블 기본키를 몇 초 정도 수집하고 데이터를 전송하는데 많을 때는 백건 이상도 있지만 적을 땐 몇 건 밖에 없을 때도 많았다 그래서 es로 전송하는 요청 수도 상당히 많아지고 요청 오는 즉시 색인(대부분 수정)을 하니 잦은 요청으로 인한 세그먼트 삭제와 추가가 발생하였고 그로 인해 잦은 머지로 퍼포먼스 문제가 있어서 bulk processor를 도입하기로 하였다. 기본적으로 es에서는 bulk요청 시 바로 요청을 해주는 것도 있지만 restHighLev..
-
elasticsearch(with lucene) force-merge에 대해서elasticsearch 2021. 3. 7. 11:51
merging하는 것은 그들 함께 merging함으로써 각 샤드의 세그먼스 수를 줄인다 또한 문서를 삭제함으로써 공간을 줄일 수도 있고 압축률 또한 좋아지고 중복된 데이터를 줄일 수도 있으며 세그먼트 수도 줄어들기 때문에 인덱스에 대한 검색, 집계와 정렬 할 때 좋다 보통 merging은 자동적으로 일어나게 되지만 때로는 merge 기능을 호출하여 유용하게 사용할 수도 있다 주의 할점은 force-merge(이하 fm)는 쓰기를 하지 않는 인덱스에만 적용해야 한다 지금은 수정 입력 삭제가 없더라도 미래에 생긴다면 주기적인 fm은 하지 않아야 한다 대신 백그라운드 merge 정책에 의존하면 된다 fm을 수행하고, 수행하면서 계속 쓰기 작업을 한다면 성능이 안좋아질 것이다 검색하다보니 두가이 이유가 있는데 ..
-
Elasticsearch(with lucene) DocValue 에 대해서 알아보자elasticsearch 2021. 2. 27. 14:09
루씬은 검색을 효율적으로 하기위해 역색인 구조로 저장하는데 검색 시에는 유리한 구조이지만 정렬, 집계일 경우에는 그렇지 않다 그래서 그것을 보안하기 위해 DocValues란 구조를 사용한다 루씬은 4.0부터 컬럼 기반인 DocValues라는 개념을 도입했다 DocValues는 메모리를 효율적으로 사용하기 위해 jvm heap 메모리가 아닌 운영체제 os의 파일 시스템 캐시를 사용해 색인 시 디스크를, 검색시 시스템 캐시를 이용하는 디스크 기반 데이터 구조이다 즉 컬럼 기반의 구조를 채택해 힙 메모리 사용에 영향을 주지 않으며 힙 메모리를 사용하는 것과 같은 성능을 낸다 참고로 엘라스틱서치에서는 JVM 힙 메모리를 fielddata(uninverted)라고 부르는 특별한 구조로 사용 한다. 또한 JVM의 ..
-
elasticsearch translog는 왜 필요할까?elasticsearch 2021. 2. 24. 21:19
엘라스틱 서치는 샤드에 일어나는 모든 변경사항을 담고 있는 특수 형태 로그이며 고가용성 장애 복구를 위한 백업 데이터 및 데이터 유실 방지를 위해 사용된다 해당 파일의 로그는 언제 삭제될까? 삭제 되는 시점은 fsync() 실행되는 시점 즉 es 기준 flush 루씬기준 commit이 발생해 디스크로 쓰여지고 난 뒤 쓰여진 내용은 로그파일에서 제거된다 Translog의 동작 순서 데이터가 추가되면 Translog에 기록되고 동시에 인메모리 버퍼에 추가된다. Refresh가 수행되면 인메모리 버퍼에서는 사라지지만 Translog에는 계속 남아있다. 더 많은 데이터가 추가되고 지속적으로 세그먼트가 생성된다. Translog가 일정 크기 이상으로 커지면 Flush 작업이 수행된다. 시스템 캐시의 내용이 디스크..
-
elasticsearch function_scoreelasticsearch 2021. 2. 22. 20:11
전에 사용했던 similarity를 function_score로 구현해볼 것이며 similarity는 아래 링크를 참조하자 https://ksk-developer.tistory.com/25 function_score는 score를 조작 할 수 있도록 해주고 기본 적으로 tf-idf와 bm25를 사용하게 되는데 현재 요구사항에는 그것 때문에 적용이 되지 않았다 그래서 score를 조작할 수 있는 function_score를 사용하기로 하였다 아래 코드는 실제 동작하는 코드이지만 필드명과 쿼리의 상당부분을 제거와 변경하였다 GET test/_search { "from": 0, "size": 10, "timeout": "200ms", "query": { "function_score": { "query": { ..
-
elasticseaarch eager global ordinal를 사용해 퍼포먼스를 올려보자elasticsearch 2021. 2. 20. 13:19
문자열 fielddata의 메모리 사용을 줄이는 기술중 하나가 ordinal이다 cardinality가 작은 status필드 가진 10억개의 문서가 있다고 생각해보자 status_deleted, status_pending, status_published라는 세가지 상태 값이 있고 10억개면 이 전체를 메모리에 유지하기 위해서는 1나당 14 ~ 16 바이트가 필요하며 전체 데이터로는 약 15gb가 필요하다 이처럼 비싼 비용을 들이는 대신 세개의 교유 한 문자열을 식별, 정렬해서 번호를 매긴다 0, 1, 2 이처럼 하게 되면 아래와 같이 메모리 사용량이 15gb에서 1gb미만으로 줄게 된다 문자열 보단 숫자가 용량을 훨씬 더 적게 먹기 때문이고 비교 연산, 네트워크 등등에서 많은 이점을 가지고 갈 수 있게 ..
-
세그먼트의 불변성 - 장점elasticsearch 2021. 2. 12. 12:55
세그먼트의 불변성으로 인해 많은 장점을 가져갈 수 있다 1. 불변이기 때문에 동시성을 신경 쓸 필요가 없다 스레드가 데이터를 점유한 상황일 때를 신경 쓸 필요가 없는 것이다 수정이 가능하다면 수정하는 동안 다른 스레드는 접근 불가능하게 한다거나 해서 퍼포먼스가 떨어질 수 있다 2. 엘라스틱 서치는 하나의 필드에 또 여러 개의 필드를 만들어서 사용한다 그런데 수정이 가능하다면 그 수많은 필드의 수많은 Terms를 찾아서 수정해줘야 한다 그리고 그걸 수정하는 동안 해당 데이터가 검색이 안될 수 있다 그래서 불변으로 해서 새로운 세그먼트를 추가해서 기존 데이터는 삭제 비트에 마크만 해주고 나중에 병합으로 백그라운드 스레드에서 처리해서 *리소스도 절감하고 검색도 빠르게 제공할 수 있다 3. 시스템 캐시를 적극 ..
-
elasticsearch(with lucene) field_data에 대해서 알아보자elasticsearch 2021. 2. 9. 11:04
예전에 무신사 es 서비스 성능 튜닝을 하기 위해 여러가지 점검을 하였는데 그 중 fielddata, doc_value, eager_global_ordinals에 정리해보려고 한다 doc_value와 eager_global_ordinals은 다음에 작성할 예정이며 오늘은 field_data에 정리해보려고 한다 루씬을 내부적으로 데이터를 역색인하여 저장하고 특정 query에 대해 관련 있는 문서를 얻기 위해서 만들어졌다 그런데 단순 질의뿐만 아니라 집계나 필드 기준으로 정렬하는 것에 대한 요구사항이 있었고 이런 요구사항을 해결하기위해 루씬은 역색인 된 데이터를 univerted하여 컬럼 중심 뷰를 만들게되었다 검색시점이나, close한 인덱스를 다시 open 하거나 할 때 등등 univerted(이것 또한..