issues
search
yeomko22
/
TIL
Today I learned
1
stars
0
forks
source link
elasticsearch - shard, segment
#129
Open
yeomko22
opened
3 years ago
yeomko22
commented
3 years ago
Elasticsearch Shard, segment
하나의 인덱스는 여러 노드에 분산하여 저장
샤드는 인덱스에 색인되는 문서들이 저장되는 논리적인 공간을 의미, 세그먼트는 샤드의 데이터들을 가지고 있는 물리적인 파일을 의미
샤드는 원본인 프라이머리 샤드와 복제본인 레플리카 샤드로 구성
프라이머리 샤드의 개수는 최초 인덱스 생성시 개수를 결정하며, 이후에 변경이 불가
인덱스에 저장되는 문서는 해쉬 알고리즘에 의해 샤드에 분산 저장, 실제로는 세그먼트라는 물리파일에 저장됨
색인 및 검색
색인된 문서는 먼저 시스템의 메모리 버퍼 캐시에 저장, 이 단계에서는 검색에 걸리지 않는다.
이후 refresh 과정을 거쳐야 디스크에 세그먼트 단위로 문서가 저장되고 검색이 가능해진다.
세그먼트는 불변 특성을 갖는다. 즉, 기존에 기록한 데이터를 업데이트 하지 않는다.
elasticsearch에서 PUT을 실행하면 새로 문서를 색인하고 기존 문서는 불용처리한다.
이는 delete도 마찬가지로 불용처리만 진행한다.
이러한 segment는 문서의 규모가 커질 수록 크기가 커지게 된다. 떄문에 elasticsearch는 세그먼트 병합을 수행한다. (사실은 lucene이 수행해줄 듯)
세그먼트 병합시에 불용처리된 문서는 제외하고 병합함으로써 문서 삭제를 구현한다.
세그먼트를 병합할 경우 사용자 검색 요청 시 접근해야하는 파일의 개수가 줄어들어 적은 비용으로 검색을 처리할 수 있게 된다.
yeomko22
commented
3 years ago
프라이머리 샤드의 복제본인 레플리카 샤드는 데이터 노드 별로 원본과 복제본 샤드의 번호가 중복되지 않도록 할당한다.
기본적으로 하나의 프라이머리샤드는 하나의 레플리카샤드를 갖는다.
인덱스 생성 시에 샤드와 레플리카의 개수를 설정할 수 있다.
"index": { "number_of_shards": 5, "number_of_replicas": 1 }
인덱스 생성한 뒤, PUT을 통해서 index의 number_of_shards를 변경하려고 하면 에러가 발생한다.
레플리카 샤드의 개수는 운영 중에도 개수를 변경할 수 있다.
Elasticsearch Shard, segment
색인 및 검색