"엘라스틱서치 바이블" 도서를 학습하며 기록한 내용입니다
기본 용어
- 문서(document)
- 엘라스틱서치가 저장하고 색인을 생성하는 JSON 문서
- 인덱스(index)
- 문서를 모아 놓은 단위, 클라이언트는 이 인덱스 단위로 엘라스틱서치에 검색을 요청하게함
- 샤드(shard)
- 인덱스는 그 내용을 여러 샤드로 분리하여 분산 저장
- 엘라스틱서치는 고가용성을 제공하기 위해 샤드의 내용을 복제해둠
- 원본 역할을 담당하는 샤드 - 주 샤드(primary shard)
- 복제본 - 복세본 샤드(replication shard)
- 타입(type)
- 엘라스틱서치는 과거에 하나의 인덱스 안에 있는 여러 문서를 묶어 타입이라는 논리 단위로 나눔
- ex. 상품정보 인덱스 → 가전 타입, 식품 타입 등
- 현재 이 개념은 폐기, 더 이상 사용되지 않음
- 지금은 문서의 묶음을 논리적으로 구분해야 할 필요가 있다면 별도의 인덱스로 독립시켜야함
- 엘라스틱서치 6 부터는 인덱스 하나에 타입 하나만 둘 수 있도록 제한
- 7버전 부터는 타입을 명시하는 부분들이 지원 중단(deprecated)
- 타입 이름이 들어가야 할 자리에 _doc가 들어간 API를 사용해야함
기본 동작
PUT {index}/_doc/{id}
{
[문서내용]
}
POSt {index}/_doc
{
[문서내용]
}
GET {index}/_doc/{id}
PUT {index]/_update/{id}
{
"doc": {
[문서내용]
}
}
GET {index}/_search
{
"query": {
"match": {
{key}: {value}
}
}
}
엘라스틱서치와 루씬
엘라스틱서치는 아파치 루씬을 코어 라이브러리로 사용
🖥️ 루씬 : 문서를 색인하고 검색하는 라이브러리
루씬 flush
- 문서 색인 요청 시 최초 생성 자체는 메모리 버퍼에 들어감
- 주기적으로 디스크에 flush
- 루씬은 색인한 정보를 파일로 저장 → 검색을 하려면 먼저 파일을 열어야함
- 파일을 연 시점에 색인이 완료된 문서만 검색 가능
- 색인 변경 사항 발생 후 검색 결과에 반영하고 싶다면 파일을 새로 열어야함
- 엘라스틱서치 refresh
- 엘라스틱서치는 내부적으로 루씬의 DirectoryReader 클래스를 이용해 파일을 열고 IndexReader 객체를 얻음
- 변경 내용을 검색에 반영하기 위해 변경 사항이 적용된 새 IndexReader를 열고 기존의 IndexReader를 닫음 → refresh
- 여기까지 온 데이터가 검색의 대상이 됨
- 비용이 드는 작업이기 때문에 색인이 변경될 때마다 수행하지 않고, 일정 간격마다 주기적으로 실행
- 명시적으로 refresh API 호출 가능
루씬 commit
- 루씬의 flush → 시스템의 페이지 캐시에 데이터를 넘겨주는 것까지만 보장, 디스크에 파일이 실제로 안전하게 기록되는 것은 보장하지 않음
- fsync 시스템 골을 통해 커널 시스템의 페이지 캐시와 디스크에 기록된 내용의 싱크를 맞춤 → commit
- 엘라스틱서치의 flush
- 내부적으로 루씬 commit을 거침
- 루씬의 flush ≠ 엘라스틱서티의 flush
- refrech 보다 큰 비용이 드는 작업
- 적절한 주기로 수행
- 명시적으로 flush API 호출 가능
세그먼트
- 디스크에 기록된 파일들이 모이면 세그먼트가됨
- 이 세그먼트가 루씬의 검색 대상
- 불변(immutable) 객체로 구성
- 기존 문서를 삭제하는 경우 삭제 플래그만 표시
- 업데이트가 발생한 경우 기존 문서 삭제 플래그 표시 후 새로운 세그먼트 생성
- 중간중간 세그먼트 병합 수행
루씬 인덱스와 엘라스틱서치 인덱스
- 여러 세그먼트 → 하나의 루씬 인덱스
- 루씬은 이 인덱스 내에서만 검색 가능
- 엘라스틱서치 샤드는 이 루씬 인덱스 하나를 래핑한 단위
- 엘라스틱서치 샤드 여러개 → 엘라스틱서치 인덱스
- 엘라스틱서치 레벨에서는 여러 샤드에 있는 문서를 모두 검색할 수 있음
- 엘라스틱서치 샤드는 여러 노드에 분산 → 이러한 노드가 모여 하나의 엘라스틱서치 클러스터
translog
- 색인된 문서들은 루씬 commit까지 완료되어야 디스크에 안전하게 기록
- 색인할 때마다 commit을 하기에는 큰 비용이 든다
- 엘라스칙서치 샤드는 모든 작업마다 translog라는 이름의 작업 로그를 남김
- translog는 루씬 인덱스 수행된 직후 기록
- 엘라스틱서치에 장애가 발생한 경우 샤드 복구 단계에서 translog를 읽음
- translog 기록은 성공했지만 루씬 commit에 포함되지 않은 작업 내용이 있다면 복구
- translog가 너무 커지면 샤드 복구에 오랜 시간이 걸리므로, translog의 크기를 적절히 유지하기 위해 일정 시간마다 새로운 translog를 만듬
- 엘라스틱서치 flush
- 루씬 commit을 수행하고 새로운 translog를 만드는 작업
출처
엘라스틱서치 바이블 - 이동현
즐겁게 읽었습니다. 유용한 정보 감사합니다.