상세 컨텐츠

본문 제목

Elasticsearch 개념정리

Ops/Monitoring

by 크리두 2021. 12. 16. 13:28

본문

반응형

1.1 Elasticsearch란

Elasticsearch는 Apache Lucene에 구축되어 배포된 검색 및 분석 엔진입니다. 2010년에 릴리스되기 시작한 이후로 Elasticsearch는 빠르게 인기 검색 엔진이 되었으며 로그 분석, 전체 텍스트 검색, 보안 인텔리전스, 비즈니스 분석 및 운영 인텔리전스 사용 사례에 일반적으로 사용되었습니다. 클러스터를 추가하여 부하 분산에 이용하기가 용이한 점이 큰 특징이다. 주로 웹 문서 검색, 소셜 데이터 분석, 쇼핑몰 검색 등에 활용되고 있으며, 빅데이터 분석/처리 및 MSA 환경의 로그 모니터링 등에도 활용되고 있다.

1.2 특징

  1. 준실시간 검색 엔진 실시간으로 생각이 들 만큼 index 한 데이터가 굉장히 빠르게 검색된다.
  2. 클러스터 구성 (고가용성) 한 대 이상의 노드를 클러스터로 구성이 가능하며 높은 수준의 안정성으로 부하 분산할 수 있다. 그로 인해 죽은 노드를 감지하고 삭제하여 사용자 데이터는 안전하게 접근 가능하도록 유지하게 된다.
  3. 스키마리스(Schemaless) 입력 데이터를 json 형식으로 저장하게 되며 미리 데이터 형식이나 크기 등을 정의하지 않아도 동적으로 스키마를 생성할 수 있다.
  4. 플러그인 형태 RestAPI 기반의 쉬운 형태로 인터페이스를 제공하고 필요한 기능에 대한 플러그인이 적용하여 확장할 수 있다. 그로인해 진입장벽이 낮다는 장점을 가질수 있다.

데이터 : 문서(JSON) 및 색인(index)

Elasticsearch는 데이터 최소 단위가 JSON으로 다른 RDBMS와 달리 테이블 형식이 아니라 문서로 비교적 복잡한 데이터 구조로 저장한다. 중첩 구조를 지원하기 때문에 Document 내부에 Document가 들어가는 것도 가능하다.

분산 문서 저장소로 이루어져 있으므로 여러 노드들이 있는 경우에는 저장된 문서가 클러스터 전체에 분산되어 저장하게 된다.

인덱스는 최적화 된 문서의 모음으로 생각될 수 있으며 각 문서는 데이터를 포함하는 키-값(key-value) 쌍인 필드의 모음이다. 기본적으로 Elasticsearch는 모든 필드의 모든 데이터를 인덱싱하고 각 인덱싱 된 필드에는 최적화 된 전용 데이터 구조가 존재한다.

문서(JSON)가 저장되면 인덱스(Index)가 생성되고 1초 이내에 거의 실시간으로 전체 검색이 가능하다. Elasticsearch는 역 인덱스(Inverted Index)라는 데이터 구조를 사용하여 빠른 전체 텍스트 검색이 가능하다. 역 인덱스는 문서에 나타나는 모든 고유 단어를 나열하고 각 단어가 나오는 모든 문서를 식별한다.

  • 전체 텍스트 문자열 필드와 정확한 값 문자열 필드 구분
  • 언어 별 텍스트 분석 수행
  • 부분 일치를위한 필드 최적화
  • 사용자 지정 날짜 형식 사용
  • 자동으로 감지 할 수 없는 geo_point , geo_shape 와 같은 데이터는 데이터 유형을 사용

정보 출력 : 검색 및 분석

문서 저장소로 사용하고 문서와 해당 메타 데이터를 검색할 수도 있지만, Apache Lucene 검색 엔진 라이브러리를 사용하여 전체 검색 기능을 쉽게 사용가능하다.

클러스터를 관리하고 데이터를 인덱싱 및 검색하기 위한 간단하고 일관된 REST API를 제공한다. 테스트 목적으로 명령 줄에서 직접 요청하거나 Kibana의 개발자 콘솔을 통해 쉽게 요청할 수 있다. 다양한 언어 (Java, JavaScript, Go, .NET, PHP, Perl, Python 또는 Ruby)로 Elasticsearch 클라이언트 를 사용할 수 있다 .

데이터 검색

Elasticsearch REST API는 구조화된 쿼리, 전체 텍스트 쿼리, 두 가지를 결합하는 복잡한 쿼리를 지원한다. 구조화된 쿼리는 SQL에서 생성 할 수있는 쿼리 유형과 유사하다.

예를 들어,

select gender, age
from person
group by employee
order by hire_date;

위 구문과 같이, 구조화된 쿼리는 색인에서 gender, age 필드를 검색 하고 필드 employee별로 일치 항목을 hire_date로 정렬 할 수 있다. 전체 텍스트 쿼리는 쿼리 문자열과 일치하는 모든 문서를 찾아 관련성 ( 검색어와 얼마나 일치하는지) 별로 정렬하여 반환한다 .

개별 용어를 검색하는 것 외에도 구문 검색, 유사성 검색 및 접두사 검색을 수행하고 자동 완성 제안을 받을 수 있다.

검색하고자 하는 데이터가 지리, 숫자 데이터일 경우, Elasticsear는 고성능 지리, 수치 쿼리를 지원하는 최적화된 데이터 구조에서 비 텍스트 데이터를 인색싱해 검색한다.

Elasticsearch는 JSON스타일 쿼리언어(Query DSL)을 사용하여 모든 검색 기능에 엑세스 할 수 있다. 또 SQL 스타일 쿼리를 구성해 Elasticsearch내 기본적으로 데이터를 검색하고 집계할 수 있어 JDBC, ODBC 드라이버를 사용하면 SQL을 통해 검색 가능하다.

확장성, 복원성 (클러스터, 노드, 샤드)

분산 및 확장을 위해 용량을 늘려 클러스터에 서버 (노드)를 추가 할 수 있으며 사용 가능한 모든 노드에 데이터와 쿼리로드를 자동으로 분산합니다. 또한, 확장성과 고가용성을 제공하기 위해 다중 노드 클러스터의 균형을 맞춘다.

내부적으로 Elasticsearch 인덱스는 실제로 하나 이상의 물리적 샤드의 논리적 그룹이며 각 샤드는 실제로 자체 포함 된 인덱스이다. 인덱스의 문서를 여러 샤드에 분산하고 이러한 샤드를 여러 노드에 분산함으로써 Elasticsearch는 중복성을 보장 할 수 있다. 이 두 가지 모두 하드웨어 장애로부터 보호하고 노드가 클러스터에 추가 될 때 쿼리 용량을 증가시킨다. 클러스터가 확장 (또는 축소)되면 Elasticsearch는 자동으로 샤드를 마이그레이션하여 클러스터를 재조정한다.

샤드에는 기본 및 복제본의 두 가지 유형이 있다. 인덱스의 각 문서는 하나의 기본 샤드에 속한다. 복제본 샤드는 기본 샤드의 복사본이다. 복제본은 데이터의 중복을 제공하여 하드웨어 오류로부터 보호하고 문서 검색 또는 검색과 같은 읽기 요청을 처리하는 용량을 증가시킨다.

인덱스의 기본 샤드 수는 인덱스가 생성 될 때 고정되지만 복제본 샤드 수는 인덱싱 또는 쿼리 작업을 중단하지 않고 언제든지 변경할 수 있다.

 

샤드 크기, 인덱스에 대해 구성된 기본 샤드 수와 관련하여 여러 가지 성능 고려 사항이 있다. 샤드가 많을수록 해당 인덱스를 유지하는 데 더 많은 오버 헤드가 발생한다. 샤드 크기가 클수록 Elasticsearch가 클러스터를 재조정해야 할 때 샤드를 이동하는 데 더 오래 걸린다.

작은 샤드를 많이 쿼리하면 샤드 당 처리 속도가 빨라지지만 쿼리가 많을수록 오버 헤드가 증가하므로 더 적은 수의 큰 샤드를 쿼리하는 것이 더 빠를 수 있다.

  • 평균 샤드 크기를 몇 GB에서 수십 GB 사이로 유지하는 것을 목표로 한다. 시간 기반 데이터가있는 사용 사례의 경우 20GB ~ 40GB 범위의 샤드를 보는 것이 일반적이다.
  • 무수히 많은 샤드를 피해야 한다. 노드가 보유 할 수있는 샤드 수는 사용 가능한 힙 공간에 비례한다. 일반적으로 힙 공간 GB 당 샤드 수는 20 개 미만이어야 한다.

사용 사례에 대한 최적의 구성을 결정하는 가장 좋은 방법은 자체 데이터 및 쿼리로 테스트하는 것 이다. 성능상의 이유로 클러스터 내의 노드는 동일한 네트워크에 있어야 한다. 그렇지 않으면 여러 데이터 센터의 노드간에 클러스터의 샤드 균형을 맞추는 데 너무 오래 걸릴수 있다. 그러나 고 가용성 아키텍처에서는 모든 노드를 한 네트워크에 묶지 않아야 한다. 한 위치에서 중단이 발생하는 경우 다른 위치에있는 서버가 대신 원활하게 동작할 수 있어야 한다. 이를 CCR (클러스터 간 복제)을 통해 해결한다.

반응형

관련글 더보기

댓글 영역