본문 바로가기
  • 개발 삽질 블로그
데이터/데이터베이스

[ElasticSearch] ElasticSearch 개념 정리

by 갹둥 2024. 10. 24.

ElasticSearch

ElasticSearch는 Apache Lucene을 기반으로 하는 분산 검색 엔진으로, 대규모 데이터에서 빠른 검색과 집계 기능을 제공합니다. 실시간 검색 및 분석을 필요로 하는 시스템에서 많이 사용되며, JSON 기반의 RESTful API를 통해 상호작용합니다.

 

주요 특징

1. 분산 아키텍처

ElasticSearch는 클러스터로 구성되며, 각 클러스터는 여러 노드(Node)로 이루어집니다.
샤드(Shard): 데이터를 분산 저장하며, 장애 복구를 위해 복제본(Replica)을 유지하여 데이터 안정성을 보장합니다.

 

2. RESTful API

HTTP 메서드를 이용한 JSON 문서 기반 상호작용이 가능합니다. 즉, HTTP 메서드(GET, POST, PUT, DELETE)를 사용하여 데이터를 색인하고 검색할 수 있습니다.
예를 들어, PUT 요청으로 문서를 색인하고 GET 요청으로 검색합니다.

 

3. 문서 지향 저장 방식

데이터를 JSON 문서(Document)로 저장하며, 각 문서는 특정 인덱스(Index)에 속합니다.
인덱스는 RDBMS의 테이블과 유사한 개념입니다.

 

4. 실시간 검색 및 분석

  • Full-Text 검색: 텍스트 데이터를 기반으로 강력한 전체 텍스트 검색 기능을 제공합니다. 불리언 검색, 유사어 검색, 접두사 검색 등 다양한 방식으로 검색을 최적화할 수 있습니다.
  • Aggregations: 데이터를 집계하고 분석할 수 있는 다양한 집계 기능을 제공하여 실시간으로 통계 정보를 추출할 수 있습니다.
  • 실시간 검색: 새로운 데이터가 추가되더라도 거의 실시간으로 검색 결과에 반영됩니다.

 

5. 스키마리스(Schema-less) 데이터 저장

명시적인 스키마 없이 데이터를 저장할 수 있으나, 필요시 매핑(Mapping)을 설정하여 필드 유형을 정의할 수 있습니다.

 

6. 확장성(Scalability)

샤드와 노드를 통해 쉽게 클러스터 확장이 가능하며, 대량의 데이터를 효율적으로 처리할 수 있습니다.



ElasticSearch 아키텍처 구조

1. Standalone 모드

Standalone 모드는 단일 서버에서 ElasticSearch를 실행하는 방식입니다. 주로 소규모 데이터 처리나 테스트 환경에서 사용되며, 클러스터로 구성되지 않고 모든 역할을 단일 서버가 담당합니다.

  • 단일 서버에서의 운영: 모든 기능을 하나의 서버에서 동작시키며, 데이터 저장, 검색, 인덱싱, 클러스터 관리 등 모든 작업이 이 서버에서 처리됩니다.
  • 설정 및 관리의 간편함: 클러스터를 구성할 필요가 없기 때문에 ElasticSearch의 설정과 관리가 비교적 간단합니다. 외부 서버와의 통신을 고려하지 않아도 되며, 네트워크 지연에 대한 이슈도 발생하지 않습니다.
  • 성능의 한계: 서버 자원이 제한적이기 때문에 _대규모 데이터 처리에는 한계_가 있습니다. 특히 다수의 요청이 들어오는 경우 성능 저하가 발생할 수 있습니다.
  • 고가용성 부족: Standalone 모드는 복제(Replica) 기능이 없기 때문에, 서버에 장애가 발생하면 모든 데이터가 손실될 위험이 있으며, 서비스 가용성에 큰 영향을 미칩니다.

 

2. Cluster 모드

Cluster 모드는 여러 대의 노드(Node)를 묶어 클러스터를 구성하고 데이터를 분산하여 처리하는 방식입니다. 대규모 데이터를 다룰 때 효율적으로 데이터를 저장하고 검색할 수 있도록 설계되어 있으며, ElasticSearch의 주요 운영 방식입니다.

  • 확장성: 노드를 추가하여 클러스터를 확장할 수 있으며, 대규모 데이터 처리에도 적합합니다.
  • 고가용성: 데이터 복제본(Replica)을 통해 서버 장애 시에도 데이터를 복구하고 서비스 중단 없이 운영이 가능합니다.
  • 분산 처리: 데이터를 샤드로 나누어 여러 노드에 분산 저장하고 처리하기 때문에, 병목 현상을 최소화하여 높은 성능을 유지할 수 있습니다.
  • 구성의 복잡성: 노드 간의 통신, 샤드 할당, 복제본 관리 등 여러 요소를 신경 써야 하며, 운영 및 관리가 상대적으로 복잡합니다.
  • 운영 비용 증가: 다수의 서버를 운영해야 하므로 인프라 비용이 증가합니다.


Node

ElasticSearch가 실행되는 물리적 또는 가상 서버를 의미하며, 각 노드는 클러스터 내에서 다양한 역할을 수행합니다. 노드는 클러스터 내에서 서로 데이터를 분산 처리하고 상호작용합니다.

Master Node

  • 클러스터의 상태를 관리하고 모든 노드의 작업을 제어합니다.
  • 샤드(Shard)의 할당, 노드 추가/제거 관리, 인덱스 생성/삭제와 같은 클러스터 전반적인 관리 기능을 수행합니다.
  • Master Node는 다수의 노드 중 하나가 될 수 있으며, 장애 시 다른 노드가 Master 역할을 대신 수행할 수 있도록 Master 선출 기능이 존재합니다.
  • Data Node
  • 실제 데이터를 저장하고 CRUD(Create, Read, Update, Delete) 작업을 처리하는 노드입니다.
  • 데이터를 샤드로 분산 저장하며, 사용자로부터의 검색 요청에 대한 실질적인 작업(색인 및 검색)이 이루어집니다.
  • 복제본(Replica)을 통해 데이터 가용성을 보장하고, 장애 복구 기능을 지원합니다.

Data Node

  • 데이터를 실제로 저장하고 관리하는 노드입니다.
  • Data Node는 Primary ShardReplica Shard를 저장합니다. 하나의 인덱스는 여러 개의 샤드로 나뉘며, 각각의 샤드는 Data Node에 분산되어 저장됩니다.
  • 클러스터 내에서 새로운 문서가 생성되면, Master Node는 해당 문서를 어느 Data Node에 저장할지 결정합니다. 이때, 데이터를 특정 샤드에 할당하여 분산 저장합니다.
  • Data Node는 데이터의 생성(Create), 읽기(Read), 업데이트(Update), 삭제(Delete) 작업을 직접 수행합니다.

Coordinate Node

  • Coordinate Node는 클라이언트로부터의 검색 요청을 받아서 다른 Data Node에 분산 처리하는 역할을 합니다.
  • 클러스터의 전체 데이터를 직접 다루지 않지만, 검색 성능을 최적화하고 분산된 데이터를 효율적으로 병합하여 최종 결과를 반환하는 역할을 합니다.
  • Coordinate Node는 Master 또는 Data Node로서의 기능을 수행하지 않으며, 검색 요청의 분산 및 통합에만 관여합니다.



ElasticSearch의 주요 개념

인덱스(Index)

인덱스(Index)는 ElasticSearch에서 데이터를 저장하고 관리하는 논리적 단위입니다. 관계형 데이터베이스의 테이블에 해당하며, 특정 데이터를 효율적으로 검색하고 관리할 수 있도록 구조화된 컬렉션입니다. 각 인덱스는 고유한 이름을 가지며, 이 이름을 통해 데이터를 CRUD(생성, 읽기, 업데이트, 삭제) 작업에 사용할 수 있습니다.

 

인덱스 구성 요소

  • 문서(Document): 인덱스 내에 저장된 데이터의 단위입니다.
  • 필드(Field): 문서의 각 데이터 요소입니다.
  • 매핑(Mapping): 인덱스 내 데이터의 구조를 정의하는 스키마입니다.
    (ElasticSearch는 동적 매핑 기능을 지원하여 새로운 문서가 추가될 때 자동으로 필드 타입을 결정할 수 있지만, 성능 최적화와 데이터 일관성을 위해 명시적 매핑 설정을 사용하는 것이 일반적입니다.)
  • 샤드(Shard): 인덱스는 하나 이상의 샤드로 나뉘어 저장됩니다. 이는 인덱스의 데이터를 물리적으로 분산하여 저장하고 처리할 수 있게 하는 구조입니다.

 

샤드(Shard)

샤드는 대규모 데이터를 효율적으로 저장하고 처리할 수 있도록 인덱스를 작은 단위로 나누어 분산 저장하는 방식입니다. 각 샤드는 ElasticSearch의 분산 아키텍처에서 중요한 역할을 하며, 이를 통해 시스템의 성능을 확장할 수 있습니다.

 

샤드의 역할

  • 데이터 분산: 인덱스를 여러 샤드로 나누면 각각의 샤드가 다른 노드에 분산 저장됩니다. 이를 통해 한 서버에만 모든 데이터를 저장하는 것보다 많은 양의 데이터를 다룰 수 있게 됩니다.
  • 병렬 처리: 여러 노드에 걸쳐 데이터를 저장하고 검색하는 구조는 병렬 처리가 가능하게 만들어 성능을 극대화합니다. 예를 들어, 검색 요청이 들어왔을 때 각 샤드에서 데이터를 동시에 조회하여 응답 속도를 단축할 수 있습니다.
  • 수평적 확장: 노드를 추가함으로써 ElasticSearch 클러스터는 수평적 확장을 할 수 있습니다. 새로운 노드가 추가되면 기존 인덱스의 샤드가 자동으로 재배치되어 클러스터의 전체 성능을 향상시킬 수 있습니다.
  • ElasticSearch에서 샤드는 두 가지 종류로 나뉩니다: Primary Shard와 Replica Shard.

Primary Shard

  • 인덱스의 데이터를 최초로 저장하는 샤드입니다.
  • 기본적으로 클러스터 내에서 데이터를 나누어 저장하는 역할을 하며, 인덱스를 구성하는 모든 데이터를 고유하게 관리합니다.
  • 각 인덱스는 하나 이상의 Primary Shard로 나누어질 수 있으며, 인덱스 생성 시 몇 개의 Primary Shard를 생성할지 설정할 수 있습니다. 이후에는 Primary Shard의 수를 변경할 수 없습니다.

Replica Shard

  • Primary Shard의 복제본으로, 고가용성과 데이터 안정성을 보장합니다.
  • Replica Shard는 Primary Shard가 저장된 노드와는 다른 노드에 저장되며, 노드 장애 발생 시 Replica Shard가 Primary Shard 역할을 대신 수행하여 데이터 손실을 방지합니다.
  • Replica Shard는 또한 읽기 성능을 향상시킵니다. 검색 요청 시 Primary Shard와 함께 Replica Shard가 데이터를 제공하여 병목 현상을 줄일 수 있습니다.
  • 인덱스 생성 시 몇 개의 Replica Shard를 유지할지 설정할 수 있으며, 이후 클러스터 상황에 맞춰 조정할 수 있습니다.

 

문서(Document)

  • JSON 형식의 데이터로, ElasticSearch의 최소 단위입니다.
    다양한 데이터 타입 지원: 텍스트, 숫자, 날짜, 객체 이미지

출처: Elasticsearch 공식홈 Guide