엘라스틱서치 (ES)

·2023년 3월 17일
0

Elastic Stack

Elasticsearch는 분산형 RESTful 검색 및 분석 엔진으로 Elastic Stack의 중심에 위치한다.
엘라스틱 스택은 검색.분석.데이터 저장소 역할을 하는 ES,
데이터 수집을 담당하는 비츠,
정제.전처리 수행하는 로그스태시,
시각화.관리 기능을 제공하는 키바나로 구성된다.

Elastic은 매우 빠른 속도, 확장성, 복원성, 정형.비정형 데이터 모두 수용할 수 있는 유연성 가짐
이 같은 장점으로 단순 검색엔진으로 활용하는 단계를 넘어 빠른 data 확인 필요한 모든 분야에 관심을 끌고 주로 마케팅 분석, 비즈니스 서비스, 인프라 모니터링, 보안, 실시간 탐지가 있다.

개념 정리

1. Index

  • 모든 document들은 index 내 저장됨
  • index는 모든 document들을 논리적으로 그룹화시키며 확장성, 기용성과 관련된 설정 옵션들을 제공
  • 정리하자면, index는 유사한 특성을 가지며 논리적으로 관련이 있는 documents들의 모음
  • index가 저장할 수 있는 document들의 개수 제한 없는 편
  • index는 검색 쿼리가 실행되는 주체

2. Document

  • 데이터는 document 형태로 저장되어 있으며 이는 JSON 형태
  • document들 index 통해 그룹화
  • 사용자가 ES 내 저장한 JSON 데이터는 "_source"라는 필드 내 저장
  • document 색인할 때, 사용자가 ES 내 저장한 JSON 데이터와 함께 메타데이터 저장됨

3. Node

  • ES 내 데이터 저장하고 있는 객체
  • 각각의 노드는 데이터의 일부를 저장하고 있음
  • 노드가 하나 밖에 없더라도 노드는 항상 클러스터를 형성해야함

4. Cluster

  • 유사한 특성을 가지며 논리적으로 관련된 노드들의 집합체
  • 클러스터 통해 노드들에 데이터 분산시키고 노드들과 데이터들을 매핑할 수 있음
  • 클러스터 덕분에 각 시스템의 디스크 용량이 수백 GB에 불과하더라도 TB의 데이터 저장 가능
  • 클러스터끼리는 기본적으로 서로 독립적이며 정말 가끔 드물게 cross-cluster 검색을 진행
  • 노드는 언제나 클러스터를 형성하기 때문에 새로운 노드 생겼을 때 설정에 따라 기존에 생성된 클러스터의 일부분이 되거나 새로운 클러스터를 형성함

5. Sharding

  • index를 작은 조각들로 나누는 방법, 각각의 조각을 shard라고 부름
  • 각각의 shard들은 독립적인 index
  • sharding은 노드, 클러스터 레벨이 아닌 index 레벨에서 시행되는데 이는 각각의 index가 포함하는 document들의 개수가 다르기 때문
  • sharding의 주 목적은 data의 volume을 수평으로 확장하는것
  • sharding을 통해 수많은 데이터를 하나의 index내 저장 가능
  • shard는 최대 20억 개의 document들을 저장 가능
  • sharding이 query paralleization을 해주는 덕분에 검색 쿼리를 여러 shard에서 동시 실행할 수 있으며 성능 및 처리량을 향상함

6. Replication

  • 단일 노드 환경에서는 노드의 하드 드라이브가 뻑날경우 한순간에 모든 데이터를 잃음
  • 따라서 replication 즉 노드를 복사해 저장하고 있으면 위 현상을 방지 가능
  • ES는 진작에 위 문제를 인지하고 디폴트로 config에서 replication을 지원하기 때문에 설정하기 쉬움
  • Replication은 index 레벨에서 설정이 되고 복습을 하자면 index는 여러 노드에 걸쳐 저장될 수 있는 data들을 여러 개의 shard 내에 저장하도록 구성되어있음
  • Replication은 shard를 완전히 복사하면서 진행이 되고, 복사된 shard를 replica shard 기존 shard를 primary shard라고 부름
  • replica shard는 primary shard와 반드시 다른 노드에 저장 돼야 함 ( 같은 노드 저장 시 둘 다 데이터 보존 못하는 불상사 발생 )
  • 따라서 replication을 적용하기 위해서는 클러스터가 두 개 이상의 노드들로 구성이 돼야 함
  • DB 이중화를 생각하면 이해하기 쉬움
  • 또한, replication은 index 처리량(throughput)을 높이는 역할도 함

6-1. Replication이 처리량(throughput)을 높이는 원리

두 개의 노드 존재, 하나의 노드에는 primary shard, 다른 노드에는 두 개의 replica shard가 존재하고 검색 요청이 들어온 상황

노드는 두 개이지만 CPU는 멀티코어이므로 쓰레드를 사용해 각 코어에서 동시에 작업 진행 가능
두 개의 replica shard를 호스팅 하는 노드가 각 shard에 대해 search query를 병렬로 실행할 수 있어 index의 처리량이 증가함

  • ES는 최적의 shard로 요청을 라우팅 하는 기능을 지원

7. Sanpshots

  • DB처럼 백업 용도를 위해 snapshot 기능 지원
  • Snapshot을 통해 지정된 시점으로 ES 복원 가능
  • Snapshot은 index 레벨 혹은 전체 클러스터 대상으로 생성 가능
  • Snapshot은 백업 용도, replication은 가용성과 성능 향상 용도로 사용

7.1 Snapshot vs Replication

  • snapshot을 통해 현재 클러스터의 상태를 파일로 내보낼 수 있으며, 이 파일을 사용해 클러스터 혹은 index 원하는 시점으로 복원 가능
  • Replication 또한 snapshot처럼 데이터 손실을 방지하는 방법이지만 replication의 경우 "실시간 데이터"에 한해서만 작동 즉, replication을 수행하면 특정 index가 현재 시점에서 저장되는 데이터가 손실되지 않음 (snapshot처럼 특정 시점으로 원복 기능은 지원하지 않음)

API 규격

  • HTTP 메서드 : GET/POST/PUT/DELETE
  • Index : 설정하기 나름
  • API : 컨벤션을 따르자면 _로 시작 ex) _search
  • command : 여러 커맨드 존재하는데 보통 노드들 혹은 클러스터들의 상태를 체크할 때 쓰임

Node의 역할

1. Master-eligible

  • 마스터 노드는 index 생성 및 삭제 담당
  • 투표 시스템으로 인해 선정되므로 master 역할이 있는 노드라고 해서 반드시 master node가 되는 것은 아님
  • 마스터 노드는 클러스터가 안정적인지 확인하는데 중요한 역할, 크기가 비교적 큰 클러스터에 유용함 -> 데이터 검색 및 수정은 하드웨어 리소스 측면에서 비용이 비싼 편이므로 마스터 노드에 높은 CPU, 메모리 혹은 I/O 사용량이 표시되는 경우 마스터 노드를 추가하는 것을 고려

2. Data

  • 노드가 data를 저장할 수 있도록 해주는 역할 (검색 쿼리와 같은 쿼리 수행 포함)
  • 주된 역할은 마스터 노드와 데이터 노드를 분리하는 것
  • 비교적 작은 클러스터의 경우 이 역할은 항상 사용하도록 설정해야 함 (이 역할이 설정이 안되어있다면 노드는 어떠한 shard도 저장하지 않을 것)

3. Ingest

  • Ingesting의 사전적 정의 : Index에 document를 저장
  • 노드 내 ingest pipeline 실행 가능하도록 하는 역할
  • ingest pipeline는 document들을 색인할 때 수행되는 일련의 단계

4. Machine Learning

  • node.ml은 노드를 머신 러닝 노드로 식별
  • xpack.ml.enabled 설정은 노드를 위한 머신러닝 API를 활성화/비활성화 시키는 설정
  • 위 설정들은 다른 작업에 영향을 주지 않도록 백그라운드에서 머신러닝 작업을 수행하는데 중요한 설정

5. Coordination

  • Coordination은 쿼리 배포 및 결과 집계를 의미
  • 해당 노드는 단독적으로 data를 검색하지 않음 (단독적으로 data를 검색하는 노드는 data 노드)
  • 크기가 상대적으로 큰 클러스터에서 Load-balancer 역할하는 노드

ES 참고 기사

https://www.samsungsds.com/kr/insights/elastic_data_modeling.html
https://jaemunbro.medium.com/elastic-search-%EA%B8%B0%EC%B4%88-%EC%8A%A4%ED%84%B0%EB%94%94-ff01870094f0

출처
https://jaimemin.tistory.com/1872

0개의 댓글