데이터 엔지니어( 실습 정리 )/elasticsearch

2. 엘라스틱서치 기본 동작과 구조

세용용용용 2024. 11. 26. 19:30

[ 엘라스틱 서치 바이블 ] 공부한 후 정리한 내용 입니다!!!

 

 

1. 엘라스틱 기본 동작

  • 키바나  > management > dev tools 로 들어가 편리하게 실습 가능

 

(1-1) 문서 색인

  • 엘라스틱서치 문서 색인 시 ( 색인할 인덱스 이름, _id 값, 문서내용 ) 을 본문에 담아 REST API를 호출
  • _id 값은 인덱스 내 고유 식별 값
### 엘라스틱서치 색인 형식
PUT [인덱스 명]/_doc/[_id]
{
	[문서 내용]
}

### PUT, POST 차이
PUT : ID값 명시 해줘야됨 ( 같은 id 존재시 덮어쓰기 )
POST : ID값 명시 별도 지정 안함 ( 엘라스틱서치가 자동으로 _id 값 생성 ) - id 지정은 가능..


### 실습 예제 ( PUT )
PUT sy_index/_doc/1
{
  "title": "hello world",
  "views": 1234,
  "public": true,
  "created": "2024-11-26"
}

### 실습 예제 ( POST )
POST sy_index/_doc
{
  "title": "hello world",
  "views": 1234,
  "public": true,
  "created": "2024-11-26"
}

 

 

(1-2) 문서 조회

엘라스틱서치 문서 조회시 인덱스 이름과 _id 값을 지정해 GET 메서드로 호출

### 엘라스틱서치 문서 조회
GET [인덱스 명]/_doc/[_id값]

### 실습 예제 ( GET 조회 )
1) GET sy_index/_doc/1 (키바나 조회)
2) curl -XGET "192.168.219.20:9200/sy_index/_doc/1" -H "Content-Type: application/json" (CLI 조회)
>>> 색인한 문서의 내용 확인 사능

 

조회 결과 확인

 

 

(1-3) 문서 업데이트

  • 엘라스틱서치 문서 업데이트 시 ( 인덱스 명, _id ) 값 지정
  • 업데이트 api는 _update 사용
  • 업데이트할 내용 doc 필드 안에 지정
### 엘라스틱서치 문서 업데이트
POST [인덱스 명]/_update/[_id 값]
{
  "doc": {
    [문서 내용]
  }
}

### 실습 예제 ( _update ), title 필드 업데이트
POST sy_index/_update/1
{
  "doc": {
    "title": "hello sy0218 elasticsearch!"
  }
}

 

 

(1-4) 문서 검색

  • 엘라스틱서치는 다양한 검색쿼리 가능
  • GET 메소드를 사용해 [인덱스 명]/_search를 붙여 본문에는 엘라스틱서치 쿼리를 사용
### 엘라스틱 서치 검색 ( match 쿼리 )
GET sy_index/_search
{
  "query": {
    "match": {
      "title": "hellow world"
    }
  }
}

 

검색 결과

  • title 필드 지정 검색어 "hello world"로 두 개 문서가 검색
  • _score에서 유사도 점수 확인가능 ( 전통적인 RDBMS와 다른 검색 방식 ) - 엘라스틱서치는 전문 검색을 지원하는 검색 엔진
  • 단순 주어진 텍스트와 매칭되는 문서를 찾는 것이 아닌 문서를 분석 후 역색인을 만들어 두고 검색어를 분석해 둘 사이 유사도가 높은 문서를 찾는것!!

 

(1-5) 문서 삭제

엘라스틱서치 문서 삭제 API는 DELETE 메서드를 사용해 [인덱스 명]/_doc/[_id값] 지정

### 엘라스틱서치 문서 삭제
DELETE [인덱스 명]/_doc/[_id값]

### 실습 예제 ( DELETE )
DELETE sy_index/_doc/1

### 삭제 확인
curl -X GET "http://192.168.219.20:9200/sy_index/_search"   -H "Content-Type: application/json"   -d '{
        "_source": false,
        "query": {
          "match_all": {}
        }
      }'

 

 


 

2. 엘라스틱 구조

 

 

  • 문서 : 엘라스틱서치 저장 및 색인을 생성하는 JSON 문서
  • 인덱스 : 문서를 모은 단위, 클라이언트는 인덱스 단위로 엘라스틱서치에 검색 요청
  • 샤드 : 인덱스는 내용을 샤드로 분리해 분산 저장, 샤드는 복제되어 저장 ( 원본 : 주 샤드, 복제 : 복제본 샤드 )
  • _id : 인덱스 내 문서에 부여되는 고유한 구분자 ( 인덱스명, _id 조합은 엘라스틱서치 클러스터내에 고유 )
  • 노드 : 엘라스틱서치 프로세스 하나가 노드 하나 구성, 노드는 여러개의 샤드를 가지는데 같은 종류 샤드는 같은 노드에 배치되지 않음 ( 고가용성 위해 )
  • 클러스터 : 엘라스틱서치 노드 여러개가 모여 하나의 클러스터 구성

 

노드의 역할

1) 마스터 노드 : 클러스터 관리의 중요한 역할을 하는 노드

2) 데이터 노드 : 샤드를 보유하고 샤드에 실제 읽기와 쓰기 작업을 수행하는 노드

3) 조정 노드 : 클라이언트 요청을 받아 데이터 노드에 요청을 분배, 클라이언트에 응답을 돌려주는 노드

 

 


 

3. 엘라스틱서치 내부 구조, 루씬

  • 엘라스틱서치는 루씬을 코어 라이브러리로 사용
  • 루씬 : 문서를 색인하고 검색하는 라이브러리

(3-1) 엘라스틱 동작 개념

  • 문서 색인 요청 시 루씬은 문서를 분석 후 역색인 생성
  • 루씬 flush : 최초 생성은 메모리 버퍼 >>> 문서 색인, 업데이트, 삭제 작업 수행되면 루씬은 이런 변경을 메모리에 기록하고 주기적으로 디스크에 flush 

 

1) 엘라스틱 색인 요청

- 데이터 메모리 버퍼에 저장, 트랜잭션 로그에 기록

 

2) 엘라스틱 refresh, 루씬 flush

  루씬 flush 엘라스틱 refresh
역할 메모리 데이터를 세그먼트로 디스크에 저장 새로 생성된 Lucene 세그먼트를 Elasticsearch 검색에 반영
검색 가능 Lucene에서 검색 가능 Elasticsearch에서 검색 가능
주기 메모리 용량 초과, 명시적 Flush 호출 시 발생 기본적으로 1초 간격으로 자동 실행(설정 변경 가능)

 

 

3) 엘라스틱 flush ,루씬 commit

- 루씬 commit 는 주기적으로 fsync를 호출하여 페이지 캐시 내용을 디스크에 강제로 기록 ( 동기화 보장 )

  엘라스틱서치 flush ( 작업 요약 )
Lucene flush 메모리 데이터를 세그먼트 파일로 저장 (검색 가능 상태로 만듦).
Lucene commit 세그먼트 파일과 메타데이터를 영구 저장 및 fsync로 디스크에 동기화.
Translog 초기화 Lucene 세그먼트에 반영된 데이터를 기반으로 Translog를 초기화하고 새로운 Translog 파일 생성.

 

 

(3-2) 세그먼트

  • 위의 작업을 거쳐 디스크에 기록된 파일들이 모이면 세그먼트 단위가 됨
  • 세그먼트는 루씬의 검색 대상
  • 세그먼트는 불변 데이터 ( 새로운 문서는 새로운 세그먼트 생성, 기존 문서 삭제 시 삭제 플래그만 표시 )
  • 불변인 세그먼트 개수를 무작정 늘려갈 수 없기에 루씬은 중간중간 세그먼트 병합 수행
  • 세그먼트 병합 : 삭제 플래그 표시된 데이터를 삭제
  • 세그먼트 병합은 오버헤드가 많지만 수행하면 검색 성능 향상 가능

세그먼트 병합은 더 이상 추가 데이터 색인이 없을 것이 보장될 떄 수행!!!!!!!

추가된 세그먼트는 병합 대상 선정에서 영원히 누락될 수 있음... ㅠㅠ

 

 

(3-3) 루씬 인덱스, 엘라스틱서치 인덱스

  • 루씬 인덱스 >>> 엘라스틱서치 샤드 >>> 엘라스틱서치 인덱스
  • 새 문서 색인시 해당 내용을 라우팅해 여러 샤드에 분산시켜 저장, 색인
  • 엘라스틱서치 검색 요청 : 각 샤드를 대상으로 검색 후 결과를 모아 병합해 최종 응답
  • 샤드는 여러 노드에 분산 저장, 노드가 모여 엘라스틱서치 클러스터가 됨

 

(3-4) translog ( 트랜잭션 로그 )

  • 장애 발생시 데이터 유실을 해결하기 위해 엘라스틱서치 샤드는 모든 작업마다 translog 라는 작업 로그를 남김
  • translog는 ( 색인, 삭제 ) 작업이 루씬 인덱스에 수행된 직후 기록, translog 기록까지 끝난 이후 작업 요청 성공 승인
  • es 장애 발생시 >> 샤드 복구 단계서 translog를 읽음 >> translog 기록은 했지만 루씬 commit에 포함되지 못한 작업 내용을 복구
  • translog 크기가 커지면 복구에 오랜 시간이 걸림, 이를 위해 엘라스틱서치 flush로 루씬 commit를 수행하고 새로운 translog를 만드는 작업을 진행 ( translog를 적절한 수준으로 유지 )