엘라스틱서치(Elasticsearch) 구조, 개념, 용어 정리
엘라스틱서치(Elasticsearch)
- Elasticsearch는 Apache Lucene(아파치 루씬) 기반의 Java 오픈 소스 분산 검색 엔진입니다. Elasticsearch를 통해 Lucene 라이브러리를 단독으로 사용할 수 있으며, 방대한 양의 데이터를 신속하게 저장, 검색, 분석을 수행할 수 있습니다.
- Elasticsearch는 검색을 위해 단독으로 사용되기도 하며, ELK(Elasticsearch, Logstash, Kibana) 스택으로 사용되기도 합니다. ELK 스택이란
- Elasticsearch : Logstash또는 백엔드 전처리 과정을 거친 데이터를 검색 및 집계하여 필요한 정보를 획득합니다.
- Logstash : 다양한 소스(DB, csv 등)의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 Elasticsearch로 전달합니다.
- Kibana : Elasticsearch의 데이터를 시각화 및 모니터링 할 수 있도록 도와줍니다.
- 주로 ELK는 로드밸러싱되어 있는 WAS의 흩어져 있는 로그를 한 곳으로 모으고, 원하는 데이터를 빠르게 검색한 뒤 시각화하여 모니터링하기 위해 사용합니다.
Elasticsearch와 RDB비교
- 관계형 DB는 Elasticsearch에서 각각 다음과 같이 대응시킬 수 있습니다.
Elasticsearch 물리적 구조
1. 클러스터 (Cluster)
- 클러스터란 Elasticsearch에서 가장 큰 시스템 단위를 의미하며, 최소 하나 이상의 노드로 이루어진 노드의 집합입니다.
- 서로 다른 클러스터는 데이터의 접근, 교환할 수 없는 독립적인 시스템으로 유지되며, 여러 대의 서버가 하나의 클러스터를 구성할 수 있고 한 서버에 여러 개의 클러스터가 존재할 수 있습니다.
2. 노드 (Node)
- 노드는 Elasticsearch 클러스터에 포함된 단일 서버로서 데이터를 저장하고 클러스터의 색인화 및 검색 기능에 참여합니다.
- 노드는 클러스터처럼 이름으로 식별되며, 원한다면 특정 노드 이름으로 정의할 수 있으며 관리의 목적에 맞게 정의합니다.
- RDB와는 다르게 여러 개의 노드로 구성된 Elasticsearch 클러스터는 관리하는 데이터가 켜져도 노드를 추가시켜 대용량 처리도 가능하게 해줍니다.
- Elasticsearch에서 제공해주는 노드는 다음과 같습니다.
- Master-eligible node
- 클러스터 관리 노드입니다.
- 노드 추가/제거, 인덱스 생성/삭제 등 클러스터의 전반적 관리 담당합니다.
- 여러 개의 마스터 노드를 설정하면 하나의 마스터 노드로 작동됩니다.
- 설정하려면 elasticsearch.yml의 node.master : true로 설정합니다.
- Data nodes
- 데이터(Document)가 저장되는 노드입니다.
- 데이터가 분산 저장되는 물리적인 공간인 샤드가 배치되는 노드입니다.
- 검색, 색인, 통계 등 데이터 작업 수행합니다.(리소스가 많이 필요합니다 / 모니터링 필수입니다.)
- 마스터와는 분리가 필요합니다.
- 설정하려면 elasticsearch.yml의 node.data : true로 설정합니다.
- Ingest node
- 문서 전처리 작업을 수행합니다.
- 인덱스 생성 전 문서의 형식 변경을 다양하게 할 수있습니다.
- 설정하려면 elasticsearch.yml의 node.ingest : true로 설정합니다.
- Coordinating only node
- 사용자의 요청을 받고 라운드로빈(Round Robin) 방식으로 분산시켜주는 노드입니다.
- 클러스터에 관련된 것은 마스터 노드로 넘기고 데이터 관련된 것은 데이터 노드로 넘깁니다.
- 설정하려면 elasticsearch.yml 내부의 노드 종류 관련 옵션 전부 false로 설정합니다.
- Master-eligible node
3. 샤드 (Shard)
- 인덱스 : RDB에서 데이터베이스와 같은 개념입니다.
- 인덱스 내부에는 색인된 데이터들이 존재하는데 이 데이터들은 하나로 뭉쳐서 존재하지 않고 물리적 공간에 여러 개의 부분들로 나뉘어서 존재합니다. 이러한 부분들을 샤드라고합니다.
- Elasticsearch는 기본적으로 인덱스를 5개의 샤드로 나누어서 저장합니다.(변경가능)
- 인덱스를 여러 샤드로 나누어 저장하기 때문에 컨텐츠 볼륨의 수평 분할 / 확장이 가능하고, 작업을 여러 샤드에서 수행하기 때문에(병렬화) 성능 / 처리량을 늘릴 수 있습니다.
- 샤드는 프라이머리 샤드(Primary Shard)와 레플리카 샤드(Replica Shard)로 구분됩니다.
- Primary Shard : 데이터의 원본입니다. Elasticsearch에서 데이터 업데이트 요청하면 반드시 프라이머리 샤드에 요청을 하게 되고 해당 내용은 레플리카에 복제됩니다. 검색 성능 향상을 위해 클러스터의 샤드 갯수를 조정하는 튜닝을 합니다.
- Replica Shard : 프라이머리 샤드의 복제본입니다. 기존 원본 데이터가 무너졌을 때 대신 쓰면서 장애 극복 역할을 수행합니다. 기본적으로 원본인 프라이머리 샤드와 동일한 노드에 배정되지 않습니다.
- 아래는 샤드와 레플리카의 구조 사진과 하나의 노드에 장애 발생 시 프라이머리 샤드와 레플리카 샤드의 흐름 사진입니다.
샤드 기본 구조 하나의 노드에 장애 발생 시 흐름
4. 세그먼트 (Segment)
- 세그먼트란 Elasticsearch에서 문서의 빠른 검색을 위해 설계된 자료구조입니다. 각 샤드는 다수의 세그먼트로 구성되어 있습니다.
- Elasticsearch에서 데이터(Document)를 저장하면, Elasticsearch는 이것을 메모리에 모아두고 새로운 세그먼트를 디스크에 기록하여 검색을 리프레쉬합니다. 이로 인해 새로운 검색 가능한 세그먼트가 만들어지게 됩니다.
- 샤드에서 검색 시, 먼저 각 세그먼트를 검색하여 결과를 조합한 후 최종 결과를 해당 샤드의 결과로 반환하게 됩니다.
- 세그먼트는 불변의 성질을 가지고 있기 때문에 데이터가 업데이트되면 실제로는 삭제되었다고 마크만 하고 새로운 데이터를 가르킵니다. 그리고 삭제되었다고 마크된 데이터는 디스크에 남아 있다가 백그라운드에서 주기적으로 또는 특정 임계치를 넘기면 더 이상 필요없어진 데이터들을 정리하고 새로운 세그먼트로 병합 한 후 세그먼트를 삭제하며 이때 비로소 디스크에서 완전히 삭제되는데 이를 세그먼트 병합(Segment Merge)라고합니다.
- 세그먼트 병합 시에는 새로운 세그먼트를 만들 공간이 있어야 하기 때문에 디스크가 꽉 찬 상태에서는 수행할 수 없으며, 세그먼트 병합은 시스템 자원을 많이 쓰는 부담스러운 작업이므로 시스템 자원이 여유로울 때 시스템에 영향을 주지 않는 선에서 진행합니다.
5. 정리
Elasticsearch 논리적 구조
1. 도큐먼트 (Document)
- Elasticsearch 데이터 최소 단위(RDB의 Row와 비슷합니다.)입니다. 하나의 Document는 다양한 필드로 구성되어 있으며, 이 필드에는 데이터 필드에 해당하는 타입이 들어갑니다. 중첩 구조를 지원하기 때문에 Document 내부에 Document가 들어가는 것도 가능합니다.
2. 필드 (Field)
- 필드는 Document에 들어가는 데이터 타입으로 RDB의 열(Column)과 비슷합니다. 하지만 Elasticsearch의 필드는 RDB보다 동적입니다. RDB에서는 하나의 열이 하나의 데이터 타입만 가질 수 있지만, Elasticsearch에서는 하나의 필드가 여러 개의 타입을 가질 수 있습니다.
3. 매핑 (Mapping)
- 매핑은 필드와 필드의 속성을 정의하고 색인 방법을 정의합니다.
- 매핑 정보에 여러가지 데이터 타입 지정이 가능하지만 필드명 자체는 중복이 불가능합니다.
Elasticsearch의 특징
1. 분산, 확장성, 병렬처리
- Elasticsearch 구성 시 보통 3개 이상의 노드를 클러스터로 구성하며, 데이터를 샤드로 저장 시 클러스터 내 다른 호스트에 레플리카(복사본)를 저장해 놓기 때문에 하나의 노드가 죽거나 샤드가 깨져도 복제되어 있는 다른 샤드를 활용하기 때문에 데이터의 안정성을 보장합니다.
- 또한 데이터의 분산과 병렬처리가 되므로 실시간 검색 및 분석을 할 수 있고, 노드를 수평적으로 늘릴 수 있게 설계되어 있기 때문에 더 많은 용량이 필요한 경우 노드를 클러스터에 추가할 수 있습니다.
2. 고가용성
- Elasticsearch는 동작 중에 죽은 노드를 감지하고 삭제하며 사용자의 데이터를 안전하고 접근 가능하도록 유지하기 때문에, 동작 중에 일부 노드에 문제가 생기더라도 문제 없이 서비스를 제공합니다.
3. 멀티테넌시
- 클러스터는 여러 개의 인덱스들을 저장하고 관리하며, 하나의 쿼리나 그룹 쿼리로 여러 인덱스의 데이터를 검색할 수 있습니다.
4. 문서(Document) 중심 & 스키마(schema) 미존재
- 복잡한 현실 세계의 요소들을 구조화된 JSON 문서 형식으로 저장합니다. 모든 필드는 기본적으로 인덱싱되며, 모든 인덱스들은 단일 쿼리로 빠르게 검색 및 활용할 수 있습니다.
- 또한 NoSQL이나 RDBMS와 같은 스키마 개념이 없으며, 사용자의 데이터가 어떻게 인덱싱 될 것인지를 사용자가 커스터마이징 할 수 있습니다.
5. 플러그인 형태로 구현
- 검색엔진을 직접 수행하지 않고, 필요한 기능에 대한 플러그인을 적용하여 기능을 확장할 수 있습니다.
- 예를 들면 외부에서 제공하는 형태소 분석기나 REST API를 구현하여 적용할 수 있습니다.
6. HTTP Method
-
http method 기능 GET 데이터 조회 POST 인덱스 업데이트, 데이터 조회 PUT 데이터 생성 DELETE 데이터 삭제 HEAD 인덱스 정보 확인
'Technology > Elastic' 카테고리의 다른 글
[Elastic] - ElasticSearch 개념 및 설치, Kibana 연동 (0) | 2024.04.07 |
---|---|
[Elastic] - ElasticSearch(엘라스틱 서치) 란? (0) | 2024.04.05 |