[엘라스틱서치 바이블] ElasticSearch 기본 개념 정리

Yerim·2023년 8월 6일
0

ElasticSearch

목록 보기
1/1

"엘라스틱서치 바이블" 도서를 학습하며 기록한 내용입니다

기본 용어

  • 문서(document)
    • 엘라스틱서치가 저장하고 색인을 생성하는 JSON 문서
  • 인덱스(index)
    • 문서를 모아 놓은 단위, 클라이언트는 이 인덱스 단위로 엘라스틱서치에 검색을 요청하게함
  • 샤드(shard)
    • 인덱스는 그 내용을 여러 샤드로 분리하여 분산 저장
    • 엘라스틱서치는 고가용성을 제공하기 위해 샤드의 내용을 복제해둠
    • 원본 역할을 담당하는 샤드 - 주 샤드(primary shard)
    • 복제본 - 복세본 샤드(replication shard)
  • 타입(type)
    • 엘라스틱서치는 과거에 하나의 인덱스 안에 있는 여러 문서를 묶어 타입이라는 논리 단위로 나눔
    • ex. 상품정보 인덱스 → 가전 타입, 식품 타입 등
    • 현재 이 개념은 폐기, 더 이상 사용되지 않음
    • 지금은 문서의 묶음을 논리적으로 구분해야 할 필요가 있다면 별도의 인덱스로 독립시켜야함
    • 엘라스틱서치 6 부터는 인덱스 하나에 타입 하나만 둘 수 있도록 제한
    • 7버전 부터는 타입을 명시하는 부분들이 지원 중단(deprecated)
    • 타입 이름이 들어가야 할 자리에 _doc가 들어간 API를 사용해야함

기본 동작

  • 문서 색인 - ID 지정
	PUT {index}/_doc/{id}
	{
		[문서내용]
	}
  • 문서 색인 - 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를 만드는 작업

출처
엘라스틱서치 바이블 - 이동현

profile
Backend-Developer

1개의 댓글

comment-user-thumbnail
2023년 8월 6일

즐겁게 읽었습니다. 유용한 정보 감사합니다.

답글 달기