검색 엔진 Search/Elastic Search

[Basic] Elasticsearch에 대해 알아봅시다!

엘라스틱서치(Elasticsearch, ES) 검색엔진에 대해 차근차근 알아가는 시리즈 글을 써볼 예정입니다.

해당 시리즈는 ES의 색인과 검색, 형태소 분석기 등 기본적인 기능 또는 검색엔진 구축 과정에서의 이슈 해결을 주제로 이어질 예정입니다.

 

오늘은 그 첫 번째로 Elasticsearch의 기본 개념에 대해 전반적으로 살펴봅시다!

 

Elasticsearch 란?

Elasticsearch 이미지 (출처: https://www.elastic.co/kr/elasticsearch/)

 

You know, for search (and analysis)
당연히 검색(그리고 분석)을 위한 엔진입니다!

 

ES는 엘라스틱 스택(Elastic Stack)의 핵심인 분산 검색 및 분석 엔진입니다.

Elastic Stack 중 로그스태시(Logstash)와 비츠(Beats)는 데이터 수집, 집계, 보강을 용이하게 하여 ES에 저장할 수 있게 합니다. 키바나(Kibana)를 사용하면 데이터에 대한 인사이트를 상호작용하며 탐색, 시각화, 공유하고 스택을 관리 및 모니터링할 수 있습니다.

 

ES는 정형, 비정형 등 다양한 유형의 대규모 데이터를 저장하고, 거의 실시간으로(near real-time) 사용자가 원하는 방식으로 검색하고 집계하여 정보를 얻을 수 있습니다.

또한, 데이터와 검색 규모가 증가함에 따라 원활하게 확장할 수 있습니다.

 

클러스터와 노드

클러스터연결된 하나 이상의 노드 집합을 말합니다.

이는 ES에서 가장 큰 시스템상의 단위이며, 서로 독립적인 시스템으로 유지됩니다.

 

서버 여러 대로 하나의 클러스터를 구성할 수도 있고, 하나의 서버에 여러 개의 클러스터를 구성할 수도 있습니다.

 

* 참고: 독립적인 클러스터 간 단일 검색 요청이 가능합니다. (참고 문서)

 

 

노드분산 시스템에서 작동하는 하나 이상의 역할을 수행하는 서버를 의미합니다. 

단일 노드의 ES를 실행하는 경우, 하나의 노드로 구성된 클러스터를 갖게 됩니다.

 

클러스터의 모든 노드는 기본적으로 HTTP 및 전송 트래픽을 처리할 수 있습니다.

모든 노드는 클러스터의 다른 모든 노드에 대해 알고 있으며, 클라이언트 요청을 적절한 노드로 전달할 수 있습니다.

 

노드는 다양한 역할을 수행할 수 있는데, 노드마다 역할을 직접 설정할 수 있습니다.

ES는 적절하게 역할에 따라 노드를 나눌 것을 가이드하고 있지만,

실제로 개발 환경에서 사용할 수 있는 자원에는 한계가 있기 때문에 다양한 역할로 노드를 나누기 어렵습니다.

 

다만, 반드시 사용되는 클러스터 제어 역할의 마스터 노드, 실제로 색인된 데이터를 저장하는 데이터 노드, 클러스터 간 검색을 수행하려면 리모트 노드,  그리고 머신러닝 관련 기능을 사용할 경우 ML 노드 정도를 알아두면 좋을 듯합니다.

 

검색엔진 개발 중 필요한 경우에 나머지 역할에 대해 알아보기를 추천합니다. (문서 참고)

 

도큐먼트, 인덱스와 샤드

ES에 저장되는 하나의 데이터 단위도큐먼트(Document)라고 불립니다. RDBMS로 말하자면 하나의 행에 해당하며, ES에서는 JSON 형식으로 저장됩니다.

도큐먼트의 집합인덱스(Index)라고 하며, RDBMS에서 데이터베이스(database)를 의미합니다.

 

인덱스는 스케일 아웃을 위해 물리적으로 샤드(shard)라는 단위로 분리되어 노드에 분산되어 저장됩니다. 여기서 ES의 샤드란, 루씬(Lucene)에서의 단일 인덱스입니다.

 

인덱스를 생성할 때 원하는 샤드의 수를 직접 정의할 수 있습니다.

2개 이상의 샤드로 인덱스를 분할함으로써, 단일 인덱스의 디스크 부하나 검색 요청 처리 속도 저하 등의 문제를 해결할 수 있습니다. 

 

또한, 언제든 오류의 가능성이 있는 네트워크와 클라우드 환경에서는 어떤 이유에서든 샤드/노드가 오프라인 상태가 되거나 사라지게 될 때를 대비해야 합니다. 이러한 이유로 ES에서는 인덱스의 샤드에 대해 하나 이상의 복사본을 생성할 수 있습니다.

 

인덱스 초기 구성 시 처음 생성된 샤드를 프라이머리(Primary) 샤드, 그 샤드의 복제본을 레플리카(Replica) 샤드라고 합니다.

 

예를 들어, 클러스터 내 노드가 3개 존재하며 인덱스를 샤드 3개와 레플리카 2개로 구성한다고 정의하면, 총 6개의 샤드가 3대의 노드에 골고루 나뉘어 저장됩니다.

 

클러스터-노드-샤드 구성 예시

 

레플리카 샤드의 수는 인덱스 생성 이후라도 언제든지 변경할 수 있으나, 샤드 수는 변경이 불가능합니다.

 

프라이머리와 레플리카 샤드는 반드시 다른 노드에 저장되어야 하며, 따라서 노드가 1개만 있는 경우 레플리카 샤드를 생성할 수 없습니다.

이렇게 인덱스를 구성하면, 프라이머리 샤드가 유실되더라도 데이터를 잃어버리지 않고, 데이터의 가용성과 무결성을 보장할 수 있습니다.

 

 

마무리

Elasticsearch를 알아가기 위해 필수적인 용어와 그 개념들을 알아보았습니다.

처음 ES 공부를 시작할 때 클러스터, 노드, 샤드 등 다양한 용어가 낯설었지만, 어쨌든 계속 공부하며 자주 접하게 될 단어이기도 하니 크게 걱정하지 않으셔도 될 것 같습니다.

 

클러스터와 노드, 인덱스와 샤드의 관계는 중요한 개념이고, 검색 엔진을 구축하면서 헷갈리는 부분을 다시 공부하는 경우도 종종 있었습니다.

다양한 관점에서 ES 구성 요소들을 다시 공부할 기회가 또 있으리라 생각하고 이번 글은 여기에서 마무리하려 합니다.

 

 

다음 글부터는 실제로 검색 엔진을 구축한다고 가정하고, 기본적인 기능들을 알아보고자 합니다.

처음 ES 공식 문서를 보면 너무 방대한 양이 존재하여 어디서부터 시작해야 할지 알기 어렵습니다. 이런 경우 가장 좋은 방법은 실전으로 바로 들어가는 것이라 생각합니다.

 

그럼, 다음 시간부터 본격적으로 ES에 인덱스를 구성하는 방법부터 소개하겠습니다!

 

 

Reference

https://www.elastic.co/kr/elasticsearch/

https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html#elasticsearch-intro

https://www.elastic.co/guide/kr/elasticsearch/reference/current/gs-basic-concepts.html

 

시리즈 다음 글

 

[Basic 2] Elasticsearch 인덱스(Index) 구성하기 (1)

검색 엔진을 구축하기 위해서 가장 먼저 필요한 것은 무엇일까요? 검색 대상이 되는 도큐먼트(Document)가 들어갈 수 있는 DB 같은 공간을 만들어야겠죠? 이번 글의 목표는 도큐먼트의 집합인 인덱

chae-data.tistory.com

 

 

[Basic 3] Elasticsearch 인덱스(Index) 구성하기 (2)

오늘은 지난 글에 이어서, 인덱스를 구성하기 위한 요소들에 대해 알아봅시다. 지난 글에서는 인덱스 샤드 수, 레플리카 수 등 일반적인 설정을 정의할 수 있는 Settings와 각 필드의 속성과 전체

chae-data.tistory.com