Elastic Stack
Elasticsearch는 분산형 RESTful 검색 및 분석 엔진으로 Elastic Stack의 중심에 위치한다.
Elastic Stack이란 Elastic 사의 오픈 소스 데이터 분석 플랫폼으로, 모든 유형의 데이터를 실시간으로 검색, 분석, 시각화할 수 있다.
Elastic Stack은 데이터 저장소 역할을 하는 Elasticsearch, 데이터 수집을 담당하는 Beats, 정제와 전처리를 수행하는 Logstash, 시각화 관리 기능을 제공하는 Kibana로 구성된다.

Elasticsearch와 RDB 비교하기
RDB, NoSQL만 다루어봤기 때문에 Elasticsearch가 기존의 RDB와 어떻게 다른지 알아보았다.
일반적인 RDB는 행(row)을 기반으로 데이터를 저장한다. Elasticsearch는 단어를 기반으로 데이터를 저장한다.
RDB 검색 방식의 한계: 데이터를 행 기반으로 저장하고 특정 단어를 검색하는 경우, 행의 개수만큼 해당 단어가 있는지 확인을 반복하게 되므로, 행의 수가 많을 경우 비효율적이다.
Elasticsearch 검색 방식: 데이터를 단어 기반으로 저장하기 때문에 특정 단어가 어디에 저장되어 있는지 이미 알고 있게 되므로, 모든 document를 검색할 필요 없이 1번의 조회로 검색이 가능하다.
Elasticsearch의 검색 방식이 분명 RDB의 검색 방식과 비교했을 때 장점이 있는 것은 맞지만, 데이터의 수정/삭제 편의성측면에서는 RDB를 완전하게 대체할 수는 없다.

데이터 모델링 관점에서의 차이도 알아보았다.
Elasticsearch의 데이터 모델: 문서 (Document) 기반, 비정형 데이터 중심
JSON 형태로 데이터를 저장하고 Indexing하여 빠른 검색이 가능하다.
{
"title": "Deep Learning in Medicine",
"author": "John Doe",
"abstract": "This paper explores AI in the medical field...",
"publication_date": "2024-02-01"
}
RDB의 데이터 모델: 관계형 데이터 구조 (Table-Row), 정형 데이터 중심
테이블을 기반으로 데이터를 저장하며 엄격한 Schema가 필요하다.
CREATE TABLE papers (
id SERIAL PRIMARY KEY,
title TEXT,
author VARCHAR(100),
abstract TEXT,
publication_date DATE
);
검색 속도 측면에서의 차이는 다음과 같다.
Elasticsearch의 검색 방식: Full-Text Search
데이터를 단어 중심으로 저장하는 역색인(Inverted Inedx) 방식을 활용하기 때문에 검색 속도가 매우 빠르다.
검색어와 일치하는 문서를 O(1)에 가까운 속도로 찾을 수 있다.
RDB의 검색 방식: SQL Search
SELECT * FROM papers WHERE title LIKE '%Deep Learning%';
위와 같이 LIKE 연산자를 사용하는 경우 전체 테이블을 스캔하기 때문에 검색 속도가 느려진다.
대량의 데이터베이스에서 LIKE 검색을 수행할 경우 성능이 매우 저하될 수 있다는 것이다.
확장성 측면에서의 차이는 다음과 같다.
Elasticsearch의 확장 방법: 수평 확장 (Scale-out)
Sharding과 Replication을 사용해 클러스터를 확장할 수 있다.
Sharding이란, 하나의 인덱스를 여러 개의 조각(Shard)로 나누어 저장하는 것을 말한다.
데이터가 많아질수록 단일 서버의 용량과 성능은 한계에 도달한다. 이를 해결하기 위해 데이터를 여러 개의 노드로 분산 저장한다.
PUT /documents
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
위의 예제에서 document라는 인덱스를 저장하고 데이터를 저장한 것을 볼 수 있다.
number_of_shards: 3 -> 데이터를 3개의 Shard로 분할
number_of_replicas: 1 -> 각 Shard의 복제본(Replica)을 1개씩 생성
최종적으로 저장되는 형태는 다음과 같다.
인덱스: documents
└── Shard 1 → Doc1, Doc4, Doc7
└── Shard 2 → Doc2, Doc5, Doc8
└── Shard 3 → Doc3, Doc6, Doc9
이와 같이 서버 여러 대로 샤드를 분산해 수평 확장이 가능하며, 각 샤드가 독립적으로 검색을 수행하기 때문에 데이터 처리 속도가 향상된다. 대량의 데이터를 처리할 때 성능 저하를 방지할 수 있다.
Replication이란, 각 Shard의 복제본인 Replica를 여러 개 생성하여 장애를 복구하고, 읽기 성능을 향상시키는 것을 의미한다.
Primary Shard의 데이터가 손실되었을 때 복제본(Replica Shard)가 역할을 대신 수행하게 된다.
다중노드에서 읽기 성능을 높이기 위해 요청을 여러 개의 노드에 분산시키는 방법으로도 활용할 수 있다.
Primary Shards:
├── Shard 1 → Doc1, Doc4, Doc7
├── Shard 2 → Doc2, Doc5, Doc8
├── Shard 3 → Doc3, Doc6, Doc9
Replica Shards:
├── Shard 1 (Replica) → Doc1, Doc4, Doc7
├── Shard 2 (Replica) → Doc2, Doc5, Doc8
├── Shard 3 (Replica) → Doc3, Doc6, Doc9
위 예제는 shard 3개, 각 shard 당 복제본을 1개 생성한 것이다.
Sharding과 Replication의 차이를 간단히 정리하면 다음과 같다.

RDB의 확장 방법:수직 확장 (Scale-up)
1) RDB는 ACID (원자성, 일관성, 독립성, 지속성)을 보장하기 위해 단일 데이터베이스 내에서 일관성을 유지하도록 설계되었다. (Elasticsearch는 트랜잭션을 지원하지 않는다. 이는 실시간 검색에는 유용하나, 데이터 정합성이 중요한 시스템에는 부적합함을 의미한다.)
Sharding을 적용하게 되면 여러 개의 데이터베이스에 데이터가 분산되므로 트랜잭션을 분산하는 것이 매우 어렵다.
2) RDB는 데이터를 정규화해 여러 테이블에 분산 저장하고 JOIN 연산을 통해 필요한 데이터를 가져오는 방식으로 동작한다.
Sharding을 적용하게 되면 서로 다른 shard에 데이터가 저장될 수 있어 JOIN 연산이 어려워진다.
3) 기존 SQL 기반 애플리케이션은 Sharding을 고려하지 않고 설계된 경우가 많다.
Sharding을 적용하게 되면 기존의 SQL 쿼리를 모두 변경해야하며, 애플리케이션 로직도 sharding된 환경에 맞게 수정해야한다.
Elasticsearch 구조

클러스터(Cluster)
클러스터는 Elasticsearch 시스템 전체를 관리하는 최상위 단위이다.
여러개의 노드가 모여 클러스터를 형성하며, 클러스터 내에서 데이터를 자동으로 분산/복제하여 안정성을 보장한다.
서로 다른 클러스터는 데이터의 접근/교환을 할 수 없는 독립적인 시스템으로 유지되고, 여러 대의 서버가 하나의 클러스터를 구성할 수 있다. 반대로 한 서버에 여러 개의 클러스터가 존재할 수도 있다.
노드(Node)
노드는 Elasticsearch의 실행 단위이다. (서버 1개 = 노드 1개)
클러스터 내에 여러 개의 노드가 존재할 수 있으며 노드의 유형은 다음과 같다.
- 마스터 노드 (Master Node): 클러스터 관리 (샤드 분배, 노드 추가/제거)
- 데이터 노드 (Data Node): 실제 데이터가 저장되고 검색을 처리하는 노드
- 코디네이팅 노드 (Coordinating Node): 사용자의 쿼리를 받아 노드들에 전달하고 결과를 병합하는 노드
인덱스 (Index)
RDB에서 테이블과 유사한 개념이다.
하나의 인덱스 안에는 여러 개의 Document가 저장된다.
인덱스를 생성할 때, shard와 replica 개수를 설정할 수 있다.
샤드 (Shard) / 레플리카 (Replica)
데이터를 분산해 저장하는 작은 단위
Replica는 또 다른 형태의 Shard라고 할 수 있다. 노드를 손실했을 경우를 대비해 복제한 Shard이다.
- Primary Shard: 데이터를 저장하는 기본 단위
- Replica Shard: Primary Shard의 복제본
도큐먼트 (Document)
Elasticsearch에서 데이터를 저장하는 기본 단위이다.
JSON 형식으로 저장되며, RDB의 행(row)과 유사하나 스키마가 유연하다는 특징이 있다.
Elasticsearch 특징
1) Scale out
2) Replica를 통한 데이터 안정성 (고가용성)
3) 유연한 스키마
4) RESTful
Elasticsearch에서 데이터를 CRUD할 때 RESTful API를 사용한다.

모든 작업을 RESTful API로 수행할 수 있기 때문에 데이터 조작이 쉽다.
HTTP 기반이므로 여러 언어에서 호출해 사용할 수 있다.
JSON 형식을 사용해 가독성이 높고 가볍다.
서버가 클라이언트 상태를 유지할 필요가 없는 무상태성(Stateless)의 특징을 가진다
(무상태성은 RESTful API의 기본 개념)