[ELK] ELK 개념 정리 (ELK 1)
2025. 5. 22. 12:31

(작성일: 2024.05.05)

 

ES (Elastic Search)

- 방대한 양의 데이터를 신속하게, 거의 실시간(NRT, Near Real Time)으로 저장, 검색, 분석할 수 있다. 
- 엘라스틱서치는 검색을 위해 단독으로 사용될 수 있고
  ELK(Elasticsearch/Logstash/Kibana) 스택으로 사용되기도 한다. 
  

ELK

- Logstash
  - 다양한 소스(db, csv 등)의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 elasticsearch로 전달
Elasticsearch
  - logstash로부터 받은 데이터를 검색 및 집계하여 필요하거나 관심 있는 정보 획득
Kibana
  - elasticsearch의 빠른 검색을 통해 데이터를 시각화 및 모니터링

 

 

- 인덱싱 방식은 전통적인 관계형 데이터베이스에서 주로 사용된다.
  인덱스를 통해 해당하는 데이터들을 조회할 수 있다. 
    - LIKE문 등의 검색을 할 경우, 해당 데이터에 검색어가 포함되어 있는지 일일히 비교하여
      해당하는 데이터들을 반환하는 방식이기에 시간이 오래 소요되고 비효율적이다. 

- 하지만 역인덱싱 방식의 경우 검색 시 검색어가 포함되어 있는 데이터들을 이미 저장 단계에서부터 
  알고 있기 때문에 한 번의 검색 만으로 해당하는 데이터를 반환하기에 검색에 특화되어 있다. 

 

 

역색인

- 일반적인 색인의 목적은 '문서의 위치'에 대한 index를 만들어서 빠르게 그 문서에 접근하고자 하는 것이다. 
- 반면 역색인은 '문서 내의 문자와 같은 내용물'의 매핑 정보를 색인해 놓는 것이다. 

 

- ex.)
  - 일반 색인 (forward index)
    - 책의 목차와 같은 의미
  - 역색인 (inverted index)
    - 책 가장 뒤의 단어 별 색인 페이지

- ex.)
  - DB에서 "Trade"라는 문구가 포함된 문자열을 찾는다면 %Trade% 라고 명확히 입력해야 검색 가능
  -> trade, TRADE, trAde 등의 문자열은 직접 명시하지 않는다면 찾을 수 없다. 
      하지만 역색인을 활용하면 대소문자 구분없이 어떤 문구가 들어와도 찾을 수 있다. 

 

 

 

ES 특징

- ElasticsearchNOSQL의 일종.
- 분산 처리를 통해 실시간성으로 빠른 검색 가능
- 기존 데이터로 처리하기 힘든 대량의 비정형 데이터 검색 가능
- 전문 검색(full text)구조 검색 모두 지원
- 기본적으로 검색 엔진이지만 MongoDBHbase와 같은 대용량 스토리지로도 활용 가능

 

 

ES 장단점

장점

오픈 소스 검색 엔진
    - Elasticsearch를 끊임없이 개선하고 발전시키고 있다.


전문 검색
    - 내용 전체를 색인해서 특정 단어가 포함된 문서를 검색할 수 있다.
        - 기능별, 언어별 플러그인을 적용할 수 있다.


통계 분석
    - 비정형 로그 데이터를 수집하여 통계 분석에 활용할 수 있다.
    - Kibana를 연결하면 실시간으로 로그를 분석하고 시각화할 수 있다.


Schemaless
    - 정형화되지 않은 문서도 자동으로 색인하고 검색할 수 있다.


RESTful API
    - HTTP기반의 RESTful를 활용하고 요청/응답에 JSON을 사용해 
     개발 언어, 운영체제, 시스템에 관계없이 다양한 플랫폼에서 활용이 가능하다.


Multi-tenancy
    - 서로 상이한 인덱스일지라도 검색할 필드명만 같으면 여러 인덱스를 한번에 조회할 수 있다.


Document-Oriented
    - 여러 계층 구조의 문서로 저장이 가능하며, 계층 구조로된 문서도 한번의 쿼리로 쉽게 조회할 수 있다.


역색인(Inverted Index)


확장성
    - 분산 구성이 가능하다. 분산 환경에서 데이터는 shard라는 단위로 나뉜다.

 

 

단점

- 완전한 실시간이 아니다.
    - 색인된 데이터는 1초 뒤에나 검색이 가능하다.
    - 내부적으로 commitflush같은 복잡한 과정을 거치기 때문.


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


데이터의 업데이트를 제공하지 않는다.
    - 업데이트 명령이 올 경우 기존 문서를 삭제하고 새로운 문서를 생성한다.
    - 업데이트에 비해서 많은 비용이 들지만 이를 통해 불변성(Immutable)이라는 이점을 취한다.

 

 

ES 기본 용어

- Index
    - 데이터 저장 공간 하나의 물리 노드에 
    여러 개 논리 인덱스 생성하나의 인덱스가 여러 노드에 분산 저장 (M:N)


Shard
    - 색인된 문서는 하나의 인덱스 — 인덱스 내부에 색인된 데이터는 여러개의 파티션으로 나뉘어 구성됨.
     (파티션 = 샤드)


Type
    - 인덱스의 논리적 구조6.1부터 인덱스당 하나의 타입만 설정 가능
     (6.0 이하에서는 music 인덱스에서 rock, pop등 장르별로 분리하는데 타입을 사용할 수 있었음)


Document
    - 데이터가 저장되는 최소 단위 JSON 포맷으로 저장 DB의 Row에 대응됨.


Field
    - 문서를 구성하기 위한 속성DB의 컬럼과 비교할 수 있음.
    - 하나의 필드는 목적에 따라 다수의 데이터 타입을 가질 수 있음


Mapping
    - 문서의 필드, 필드 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스
    - 스키마 정의 프로세스라고 보면 된다.

 

 

ES 대안

MYSQL FullText Search + N gram

- 데이터가 크지 않다면 mysql FullText Search로도 충분히 검색 속도를 높일 수 있다.
  (Elasticsearch는 추가적으로 인프라를 구축해야 하기 때문)
- MySQL을 사용하면 항상 데이터를 인덱싱하고 검색할 수 있다.
- Elasticsearch를 사용하면 하나의 단위로 색인화하는 데 더 많은 유연성이 있다.
- ElasticsearchMySQl 검색과 가장 큰 차이점은 인덱싱을 통해 많은 양의 데이터가 있을 때 
   ES가 더 빠르게 작동한다는 것이다. 적은 양의 데이터의 경우 차이를 느끼지 못할 것이다.

 

 

MySQL Full-Text 검색

- MySQLFull-Text 검색은 MySQL 데이터베이스 내에 내장검색 기능이다.
- 이 기능은 특정 테이블의 컬럼에서 텍스트 데이터를 검색할 때 사용할 수 있으며, 
   인덱스를 구축하여 검색 성능을 향상시킨다.

 

장점

- 별도의 검색 엔진을 설치하고 구성할 필요가 없어 구현이 간단하다.
- MySQL 환경 내에서 모든 작업이 이루어지므로, 별도의 시스템 간 동기화가 필요 없다.
- SQL 쿼리를 사용하여 검색을 수행할 수 있으며, 검색 조건을 SQL 문법으로 표현할 수 있다.

 

단점

- 검색 기능이 비교적 기본적이며, 
   Elasticsearch와 같은 전문 검색 엔진에 비해 검색 옵션이 제한적이다.
- 대규모 데이터셋에 대한 검색 성능이 Elasticsearch보다 떨어질 수 있다.
- 텍스트 분석 기능(예: 자동 언어 감지, 동의어 처리)이 제한적이다.

 

사용 사례

- 간단한 텍스트 검색 요구 사항을 가진 소규모에서 중규모 애플리케이션
- 검색 기능이 애플리케이션의 주 기능이 아닌 경우.

 

 

 

Full-Text 인덱스 생성

- Full-Text 인덱스CREATE TABLE 문이나 ALTER TABLE 문을 사용하여 
  테이블의 특정 TEXT, CHAR, 또는 VARCHAR 타입 컬럼에 대해 생성할 수 있다.
- 예를 들어, posts 테이블의 title과 content 컬럼에 Full-Text 인덱스를 생성하는 방법


      
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
FULLTEXT(title, content)
);
-- 또는 기존 테이블에 인덱스 추가
ALTER TABLE posts ADD FULLTEXT(title, content);

 

 

Full-Text 검색 수행

- Full-Text 인덱스가 생성되면, MATCH() ... AGAINST() 구문을 사용하여 
  해당 컬럼에서 텍스트를 검색할 수 있다.
AGAINST 함수에 검색하려는 단어나 구문을 지정한다.


      
SELECT * FROM posts
WHERE MATCH(title, content) AGAINST('검색어');

 

 

 

검색 모드

- MariaDBFull-Text 검색은 두 가지 모드를 지원한다.
- 자연어 모드(Natural Language Mode)와 불리언 모드(Boolean Mode).
- 위의 예시는 자연어 모드 검색을 사용한 것이며, 
  불리언 모드 검색은 더 복잡한 검색 쿼리를 작성할 수 있게 해준다.


      
-- 불리언 모드 검색 예시
SELECT * FROM posts
WHERE MATCH(title, content) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);

 

 

참고

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

 

[Elastic Search] 기본 개념과 특징(장단점)

엘라스틱서치의 기본 개념, 특징에 대해 정리

jaemunbro.medium.com

https://aws.amazon.com/ko/what-is/elasticsearch/

 

Elasticsearch란 무엇인가요? - Elasticsearch 엔진 설명 - AWS

Elasticsearch는 Apache Lucene에 구축되어 배포된 검색 및 분석 엔진입니다. 2010년에 릴리스되기 시작한 이후로 Elasticsearch는 빠르게 인기 검색 엔진이 되었으며 로그 분석, 전체 텍스트 검색, 보안 인텔

aws.amazon.com

 

 

https://victorydntmd.tistory.com/308

 

[Elasticsearch] 기본 개념잡기

1. Elasticsearch란?Elasticsearch는 Apache Lucene( 아파치 루씬 ) 기반의 Java 오픈소스 분산 검색 엔진입니다.Elasticsearch를 통해 루씬 라이브러리를 단독으로 사용할 수 있게 되었으며, 방대한 양의 데이터를

victorydntmd.tistory.com

 

https://dealicious-inc.github.io/2021/11/22/dealibird-elastic-search.html

 

엘라스틱서치 그게 뭔데 그거 어떻게 하는 건데

딜리버드 검색 Elasticsearch 적용기

dealicious-inc.github.io

 

https://tecoble.techcourse.co.kr/post/2021-10-19-elasticsearch/

 

Spring Data Elasticsearch 설정 및 검색 기능 구현

실습 Repository에서 코드를 확인할 수 있습니다. 1. Elasticsearch Elasticsearch는 Apache Lucene 기반의 Java 오픈소스 분산형 RESTful…

tecoble.techcourse.co.kr

 

https://annajin.tistory.com/218

 

[TIL] 07/25 항해99 78일차 - MySQL 검색기능 : FullText Search

들어가며 프로젝트에 음식점 검색 기능을 구현해야했다. 초반에는 Elasticsearch를 이용해서 구현을 해보려고 목표를 잡아두었었는데, Elasticsearch의 러닝커브가 높고 리소스도 많이 드는 기술이기

annajin.tistory.com

 

 

'SpringBoot' 카테고리의 다른 글

[ELK] ELK + SpringBoot MSA (ELK 3)  (0) 2025.05.25
[ELK] ELK 설치 및 구축 방법 (ELK 2)  (0) 2025.05.25
[SpringBoot] JPQL Query Methods  (0) 2025.05.20