
Elasticsearch 관련 문서를 읽을 때 자주 나오는 키워드 위주로 개인적으로 공부하면서 간단하게 정리해보았습니다.
* 7.15 버전을 기준으로 작성하였습니다.
Basic Concept
Elasticsearch 는 오픈소스/java로 개발된 아파치 루센을 기반으로 구축된 실시간 분산 및 분석을 수행하는 검색 엔진입니다.
이것저것이 많이 붙은 일종의 NoSQL 정도로만 이해하고 필요할 때 이 서비스가 지원하는 기능인지 찾아보면 될 것 같습니다.
(저는 서버 로깅 APM 기능을 사용할 예정입니다.)
그리고 HTTP 프로토콜로 접근이 가능한 REST API 로 데이터 조작을 지원합니다.
ELK stack 에서는 주로 Elasticsearch, Kibana, Logstash 로 구성하여 사용합니다.
MVC 모델로 비유하자면 Logstash 는 Model, kibana 는 일종의 View, Elasticsearch는 Controller 와 유사한 기능을 수행한다고 이해할 수 있습니다.
Elasticsearch 구성 요소
RDBMS (관계형 데이터 베이스 구조) 와 비교했을 때
RDMBS 같은 경우에는 `데이터베이스 ⇨ 표 ⇨ 열 / 행`
Elasticsearch 같은 경우에는 `클러스터 ⇨ 노드 ⇨ 인덱스 ⇨ 샤드 ⇨ 키-값 쌍이 있는 문서` 로 구성되어있습니다.
엑셀 비유와 함께 좀 더 기술적인 설명을 덧붙여서 설명하는 방식으로 진행해보겠습니다.
(순서대로 상위에서 하위 개념으로 진행됩니다.)
1. 클러스터 (Elasticsearch) → 여러 개의 엑셀 워크북

클러스터는 Elasticsearch에서 데이터와 작업을 관리하는 전체 시스템을 말합니다.
클러스터는 노드를 관리하는 가장 큰 단위 (클라우드 서비스로 비유하자면 가용 영역 Ability Zone (AZ)) 입니다.
노드가 추가/삭제되면 클러스터는 데이터 분산 처리를 위해 자체적인 노드를 재구성합니다. (master node 선정 등)
엑셀로 비유하자면, 컴퓨터에 저장된 여러 개의 엑셀 워크북 파일들 전체를 생각하면 됩니다.
그리고 각각의 워크북은 서로 다른 주제나 프로젝트를 위한 것처럼, 클러스터 내의 각 인덱스는 서로 다른 데이터 집합을 위한 것입니다.
2. 노드 (Node) → 엑셀 워크북 1개
Elasticsearch의 노드는 클러스터 내에서 데이터를 저장하고 작업을 처리하는 독립된 서버 또는 인스턴스를 의미합니다.
이를 엑셀의 개별 워크북에 비유할 수 있습니다.
각 워크북에는 여러 개의 워크시트(sheet)가 있고, 각 워크시트에는 데이터가 저장되어 있는 것처럼, 각 Node 별로 독립적으로 동작하면서 데이터를 저장하고 처리합니다.
노드는 클러스터의 일부이며 데이터를 저장하고 클러스터의 인덱싱 및 검색 기능에 참여하는 단일 서버입니다.
데이터를 인덱싱하고 찾고 하는 작업에는 CPU, Memory, I/O 자원을 많이 사용하기 때문에 큰 규모에서는 data node와 master node를 구별합니다. (그 외에 여러 종류의 노드가 있습니다. 참고 페이지: Node | Elasticsearch Guide [7.17] | Elastic)
만약 마스터 노드가 삭제될 경우, 노드를 관리하는 클러스터에서 남아있는 노드 중 선출(elect)하여 마스터 노드로 승격시킵니다.
3. 인덱스 (Index) → 엑셀 워크북의 탭 (시트)
엑셀의 워크북에는 여러 개의 탭(시트)로 또 다시 데이터를 분류할 수 있습니다.
각 시트에서는 "2023년 판매 데이터"라는 인덱스 (엑셀 - 시트 1) 는 2023년의 판매 관련 데이터만 모아둔 것처럼 이해할 수 있습니다.
이와 비슷하게 인덱스는 일종의 추상적인 namespace 같은 개념으로 이해할 수 있습니다.
좀 더 기술적인 용어를 사용해서 설명해보자면 인덱스는 Shard (바로 다음 항목에서 언급됨) 를 관리하는 논리적인 집합, 하나 이상의 물리적인 shard 를 가르키는 논리적 namespace 입니다.
다시 말해, 인덱스는 관련된 데이터를 그룹화한 컬렉션을 말합니다.
각 인덱스는 고유한 이름으로 식별되며, 하나 이상의 샤드로 분할됩니다.
살질적인 정보(Document)는 샤드에 저장되고 색인되지만, 어플리케이션은 샤드와 직접 상호작용하지 않고, 인덱스를 통해서 정보(Document)를 관리합니다.
4. 샤드 (Shard) → 엑셀 시트의 여러 영역들
Elasticsearch에서는 데이터를 관리하고 빠르게 검색하기 위해 인덱스를 여러 부분, 즉 '샤드'로 나눕니다.
샤드가 실질적인 데이터를 저장하는 컨테이너인데요.
샤드는 Elasticsearch 가 클러스터에서 데이터를 배포하는 단위입니다.
이때 샤드는 검색 오픈소스 Lucene 의 단일 인스턴스이며 그 자체로 완전한 검색 엔진이라는 것만 알아도 충분합니다.
샤드의 동작 원리를 더 딥하게 자세히 찾아보고 싶다면, Inside a Shard | Elasticsearch: The Definitive Guide [2.x] | Elastic 문서를 읽어보시길 추천드립니다.
종류로는 Primary Shard (이하 기본 샤드), Replica Shard (이하 복제본 샤드) 로 구성되어있습니다.
말 그대로 기본 샤드는 원본, 복제본 샤드는 복제본으로 작동하며, 분산 처리를 할 때 사용됩니다.
문서 (Document)는 샤드에 저장되고, 샤드는 클러스터의 노드에 할당되기 때문에, 노드가 커지거나 줄어들면 클러스터가 균형을 유지할 수 있도록 Elasticsearch 가 노드 간에 샤드를 자동으로 마이그레이션합니다. (위 공식 문서에서 자세히 설명되어있습니다.)
엄밀하지는 않지만 엑셀로 비유하자면, 큰 시트를 여러 영역으로 나눠서 관리하는 것으로 연상할 수 있습니다.엑셀의 A1부터 M100까지는 영역 1, N1부터 Z100까지는 영역 2처럼 생각하고 데이터를 실질적으로 저장하고 처리하는 곳과 비슷하구나 정도로 이해하면 될 것 같습니다.
5. 키-값 쌍이 있는 문서 (Document) → 엑셀의 한 행
Document 는 Key-value 쌍이 있는 문서로, JSON 으로 직렬화되어 고유 ID 로 Elasticsearch 에 저장되는 최상위 수준 또는 루트 객체입니다.
엑셀로 비유하면, 각 행이 문서와 같습니다.
예를 들어 "이름 - 홍길동, 나이 - 25, 직업 - 망나니"이라는 키-값 쌍을 엑셀에서는 한 행에 "홍길동", "25", "망나니"으로 저장하는 것과 비슷합니다.
Conclusion
전체적인 구성을 정리해보겠습니다.
앞서 말했듯이, Elasticsearch 는 REST API 를 통해 관리할 수 있는 기능을 제공합니다.
그 기능을 사용하여 샤드 개수를 3개, 복제본 1개인 인덱스-000001 를 생성할 수 있습니다.
PUT /index-000001
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
만약 이 인덱스를 노드 2개를 가진 클러스터 내에 생성한다면 아래 그림과 같이 구성되는 것을 확인할 수 있습니다.

이런 구성을 통해서 Elasticsearch 는 데이터 가용성과 유연성을 보장합니다.
이번 포스팅에서는 간단히 Elasticsearch 를 구성하는 요소를 살펴보았습니다.
ELK stack 서버를 구축하고 배워나가는 과정에 있으니 혹여 오개념이나 참고할만한 정보가 추가적으로 있다면 언제든 편하게 커멘트 부탁드립니다.
시간내어 읽어주셔서 감사합니다!
참고 문서
- Elasticsearch 인덱스란 무엇인가? | Elastic Blog
- Life Inside a Cluster | Elasticsearch: The Definitive Guide [2.x] | Elastic
- Managing data automation through hot, warm, cold, and frozen tiers — No coding needed! | Elastic Blog
'Infra > ELK stack' 카테고리의 다른 글
트러블슈팅: APM 서버가 Health Status Red 인 문제 해결 (0) | 2023.10.31 |
---|