백엔드

Elasticsearch에 대하여

do_hyuk 2024. 3. 21. 15:48

Elasticsearch는 Apache Lucene 기반의 Java 오픈 소스 분산 검색 엔진이다.

Elasticsearch를 통해 방대한 양의 데이터를 신속하게(≒ 실시간) 저장, 검색, 분석을 수행할 수 있다.

Elasticsearch는 검색 엔진으로 단독으로 사용되기도 하며, ELK(Elasticsearch / Logstash / Kibana) 스택으로 사용되기도 한다.

 

이러한 Elasticsearch는 대규모 로그 파일 관리나 실시간 검색 서비스 등과 같이 대용량 데이터를 빠르게 처리해야 하는 경우

유용하게 사용될 수 있다.


데이터 저장 방법(RDBMS와 차이점)

  • RDB는 정규화된 스키마에 따라 데이터를 구조화하지만, Elasticsearch는 JSON 문서 형태로 비정형 데이터도
    저장하고 인덱싱할 수 있다.
  • RDB는 Row를 기반으로 데이터를 저장하지만, Elasticsearch는 단어를 기반으로 데이터를 저장한다.
  • Elasticsearch는 마치 NoSQL의 Key-Value DB와 같이 저장된다. 그렇기 때문에 Elasticsearch는
    수정과 삭제가 많은 경우에는 많은 리소스가 소비될 수 있지만 검색 속도는 빠르다는 장점이 있다.

RDB 와 Elasticsearch 용어 차이


Elasticsearch 내부 구조

클러스터 (Cluster)

여러 개의 노드가 네트워크로 연결된 것을 클러스터라고 한다. 즉, 클러스터는 노드의 집합이며 하나 이상의 노드로 구성된다.

같은 서버나 네트워크망 내부에 있다 하더라도, 클러스터명이 다르면 다른 클러스터로 실행되어 별개의 시스템으로 인식된다.


노드 (Node)

 

Elasticsearch의 기본 작동 단위이다.

노드는 Elasticsearch 서비스가 설치되어 실행되는 각 서버를 의미 한다.

노드들은 데이터를 저장하고, 클러스터의 일부로 동작하여 검색 및 인덱싱 작업 등을 수행한다.

 


인덱스 (Index)

RDB의 Row를 Elasticsearch에서는 도큐먼트(document)라고 부른다.

그리고 이 도큐먼트를 모아놓은 집합을 인덱스라고 한다. (RDB에서는 테이블)

인덱스는 아래처럼 하나 이상의 샤드로 분할될 수 있다.


샤드 (Shard)

샤드는 Elasticsearch에서 데이터를 분산 저장하는 방법으로, 각 샤드는 독립적인 "인덱스"라고 할 수 있으며

자체적으로 검색 가능하다. (Kafka와 같은 의미)

 

샤딩(sharding)은 대용량 데이터를 여러 노드에 분산시켜 저장하고 처리하는데 필요하며,

이로써 성능 향상과 확장성 등의 장점을 얻을 수 있다.

 

예를 들어 1TB 크기의 데이터가 있는데 단일 노드에서 다루기 어렵다면 이를 5개 샤드로 나누면 각각 200GB 크기의

작은 단위로 처리할 수 있게 되므로 성능 향상 및 관리 효율성 등이 올라간다.

 

단일 Elasticsearch 클러스터 내에서 샤딩된 각 부분은 서로 다른 노드에 위치할 수 있으므로 한 노드가 실패해도 다른 노드에서

해당 샤드와 연관된 작업을 계속 진행할 수 있다는 장점도 있다.

 

하지만 샤드의 개수만큼 cpu의 스레드를 사용하기 때문에 샤드의 개수가 많아질 수 록 리소스를 많이 잡아먹게 된다.

그렇기 때문에 데이터에 맞춰 샤드 개수를 적절히 설정해야 한다.


복제본 (Replica)

데이터 손실 방지와 검색 성능 향상을 위해 샤드가 복제될 수 있다.

복제본(replica shard)은 원래 샤드에 대한 복사본이며, 원래 샤드(primary shard)가 실패할 경우 자동으로 대체할 수 있다.


Elasticsearch 장점

JSON 문서를 통해 데이터 검색을 수행하므로 스키마 개념이 없다.

로그 데이터처럼 비구조화된 데이터는 스키마가 다이내믹하게 변할 수 있기 때문에 JSON 구조가 적합하다.

 

저장

방대한 양의 로그 데이터들을 RDB에 저장한다고 생각해 보자

RDB는 트랜잭션 처리와 데이터 일관성 유지에 중점을 두고 설계되었기 때문에 무수히 생성되는 로그 데이터를 실시간으로 저장하는 것은 

한계가 있을 수 있다.

대부분 RDBMS는 단일 노드에서 실행하지만 Elasticsearch는 처음부터 분산 시스템으로 설계되었다.

그렇기 때문에 데이터를 여러 노드에 분산 저장하고 처리 및 새로운 노드를 추가(수평 확장 = Scale out) 할 수 있고,

스키마리스(schema-less) 방식이므로, 비구조화된 대량 데이터도 유연하게 저장할 수 있다.

 

검색

로그 데이터는 구조화되어 있지 않고 비구조화된 텍스트로 이뤄져 있다.

비구조화된 많은 로그 데이터들을 RDB에서 조회하려면 복잡한 텍스트를 검색하기 힘들뿐더러, 인덱싱과 같은 추가 작업이

요구되어 시스템 부하가 증가할 수 있다.

반면에 Elasticsearch는 전체 텍스트 검색에 최적화된 엔진(Lucene 기반)을 사용해 대용량 데이터에서도 빠르게 정보를 찾을 수 있다.

또한 모든 데이터를 역색인 구조로 저장해 가공된 텍스트를 검색한다.

거의 실시간 검색으로 사용할 수 있기 때문에 보안 분석, 인프라 모니터링 같은 사용 사례에 적합하다.

 

데이터 구조 유연성

RDB에서는 스키마 변경이 필요한 경우에는 DDL 작업이 필요하며 이 작업은 리소스 소모가 크고 복잡하다.

반면에 Elasticsearch는 JSON 형식의 문서 기반 모델을 사용해 스키마 변경 없이도 다양한 형태의 데이터를 유연하게 저장할 수 있다.

 

가용성

자동 복제(replication)와 샤딩(sharding) 기능으로 인해, 하나 또는 여러 개의 노드가 실패해도 서비스 중단 없이 데이터 저장 및 검색 작업을 계속할 수 있다.


Elasticsearch의 단점

완전한 실시간 X

빠르지만 완전한 실시간은 아니다. Near real-time이다.

Elasticsearch는 데이터 저장 시점에 해당 데이터를 인덱싱 한다.

 

트랜잭션과 롤백 기능이 없다.

전체적인 클러스터의 성능 향상을 위해서 시스템적으로 비용 소모가 큰 롤백과 트랜잭션을 지원하지 않는다.

즉, 트랜잭션과 무결성이 중요한 데이터의 저장소로 사용하기에 적합하지 않다.

Elasticsearch가 DB의 기능도 하지만 메인 데이터베이스로 단독 사용하는 것은 권장되지 않는다.

엄격한 데이터 요구사항이 있는 경우에는 RDB가 더 적합하다.

 

데이터 삭제 및 수정의 비효율성

Elasticsearch는 실시간 검색과 분석을 위해 설계되었다. 그렇기 때문에 데이터 삭제나 수정 작업은 상대적으로 비효율적이다.

(Elasticsearch에서의 업데이트는 기존 문서를 삭제하고 다시 삽입하는 방식)


ELK (Elasticsearch / Logstash / Kibana) 란?

Elasticsearch, Logstash, Kibana의 앞글자를 따서 ELK라고 부른다.

주로 ELK는 WAS의 흩어져 있는 로그를 한 곳으로 모으고, 원하는 데이터를 빠르게 검색한 뒤 시각화하여 모니터링하기 위해 사용한다.

각각의 ELK 기술들에 대해 알아보자.

 

 

 

Beats

여러 데이터들을 서버에서 다른 곳으로 전송하는 역할을 한다.

밑에서 설명하는 Logstash의 동작 과정과 유사해 직접 사용해 본 차이점을 설명하자면,

Beats는 FileBeat라고도 많이 나와있는데 이름처럼 주로 로그파일의 변화를 감지해 logstash나 elasticsearch로 전달하는 역할을 한다고 볼 수 있다.

(필자는 콘솔의 특정 로그들을 전송한다면 logback 파일을 정의해 서비스의 로그를 logstash로 전달하고, 로그파일 전송이 필요하다면 Beats 추가하는 것이 적합하다고 생각한다.)

 

Logstash

Logstash는 실시간 파이프라인 기능을 가져 데이터를 수집하는 역할을 하며 크게 3가지 과정이 있다.

1. 입력(Input) : 데이터 저장소로부터 데이터를 입력받는 작업

2. 필터(filter) : 데이터를 확장, 변경, 필터링 및 삭제 처리하는 가공 작업

3. 출력 (Output) : 위 두 과정을 거친 데이터를 elasticsearch로  전송

 

Elasticsearch

ELK 구조에서의 elasticsearch의 역할은 Logstash를 통해 수신된 데이터를 ElasticSearch에 저장하는 데이터 저장소 역할을 한다.

NoSQL 기반 데이터베이스이며 RDB와 다르게 트랜잭션 Rollback을 지원하지 않으나 검색 및 분석 성능이 뛰어나다.

 

Kibana

Elasticsearch에 저장된 데이터들을 모아서 시각화하는 역할을 한다.

kibana를 이용해 시각화하면 한눈에 데이터를 파악하여 분석할 수 있다.


REF) ElasticSearch란? ELK란? 내부 구조, 장단점, RDB와 차이