안녕하세요, 오늘은 베스핀글로벌 SRE실 차예진님이 작성해주신 Elasticsearch 시작 가이드에 대해 알아봅니다.
궁금한 부분이 있으시면 편하게 댓글을 달아주세요 🙂
1. Elasticsearch 란?
Elasticsearch는 Elastic사의 실시간 분산 검색 및 분석 엔진입니다. 수집한 데이터를 저장, 검색, 분석하며, 복잡한 검색을 빠르게 수행할 수 있게 해줍니다.
RESTful API를 통해 데이터를 JSON 형식으로 색인화하고, 여러 유형의 검색 쿼리를 이용하여 맞춤형 결과를 얻을 수 있습니다. 또한, 분산 시스템으로 설계되어 신뢰성과 확장성이 뛰어납니다. 실시간 분석이 필요한 다양한 어플리케이션에서 활용됩니다.
1-1. 주요 기능과 용도
위 내용처럼 Elasticsearch를 활용하면 가지고 있는 데이터를 가지고 비즈니스에 맞게 데이터를 활용할 수 있는 폭이 넓어 질 수 있습니다.
다음은 Elasticsearch의 주요 기능과 사용 용도에 대해 자세히 살펴보겠습니다.
주요 기능
Full Text Search : Elasticsearch는 루씬(Lucene) 검색 라이브러리를 기반으로 하며, 풍부한 풀 텍스트 검색 기능을 제공합니다. 이를 통해 복잡한 검색 쿼리와 함께 정확한 검색 결과를 빠르게 제공할 수 있습니다.
Distributed and Scalable : Elasticsearch는 분산형 구조로 설계되어, 대량의 데이터를 처리하면서도 높은 성능과 신뢰성을 유지할 수 있습니다. 데이터를 여러 노드로 분산시켜 저장하며, 클러스터의 크기를 쉽게 확장할 수 있습니다.
Real-Time Analytics : Elasticsearch는 실시간 데이터 분석 기능을 제공합니다. 대량의 데이터에 대한 복잡한 질의를 실시간으로 처리하고, 결과를 즉시 얻을 수 있습니다.
RESTful API : Elasticsearch는 HTTP와 JSON을 기반으로 하는 RESTful API를 제공합니다. 이를 통해 언어에 구애받지 않고 다양한 환경에서 쉽게 Elasticsearch를 사용할 수 있습니다.
사용 용도
로그 또는 트랜잭션 데이터 분석 : Elasticsearch는 로그 분석, 시스템 모니터링, 운영 통계 등에 널리 사용됩니다. Logstash와 Kibana와 같은 도구와 함께 ELK 스택으로 구성되어 실시간 로그 분석을 제공합니다.
사이트 검색 : Elasticsearch는 웹사이트의 내부 검색 엔진으로 사용될 수 있습니다. 사용자가 입력한 키워드에 대해 정확하고 빠른 검색 결과를 제공합니다.
지리적 데이터 검색 및 분석 : Elasticsearch는 공간 정보를 다루는 Geo-Queries를 지원합니다. 이를 통해 지리적 데이터의 검색 및 분석이 가능합니다.
기계 학습 및 예측 분석 : Elasticsearch는 대량의 데이터 분석을 위한 기계 학습 기능도 제공합니다. 이를 통해 이상 탐지, 회귀, 분류 등의 복잡한 예측 분석이 가능합니다.
Elasticsearch는 위와 같이 다양한 분야에서 활용될 수 있는 도구입니다. Elasticsearch를 효과적으로 사용하려면, 본인의 데이터와 요구 사항에 맞는 적절한 검색 전략과 분석 방법을 사용하는 것이 중요합니다.
2. Elasticsearch 의 구조
Elasticsearch의 기본 구조인 클러스터, 노드, 그리고 샤드가 어떻게 연결되고 사용되는지 그리고 내부에서의 데이터를 Elasticsearch가 어떻게 관리하는지에 대해 설명하겠습니다.
2-1. Cluster (클러스터)
Elasticsearch 클러스터란 하나 이상의 노드(서버)로 구성된 집합체입니다. 클러스터는 동일한 클러스터 이름으로 구성된 모든 노드를 자동으로 발견하며, 노드들과 데이터와 작업을 공유하며, 이를 통해 대량의 데이터를 효율적으로 분산 처리하며, 대량의 데이터 처리와 높은 병렬 처리 성능을 보장합니다.
클러스터의 확장성과 상태 관리를 적절하게 이해하고 운영하면, 검색 성능과 데이터 안정성을 최대화할 수 있습니다.
2-1-1. Cluster Status (클러스터 상태)
Elasticsearch 에서 클러스터를 생성하고 실행하게 되면 상태의 통해 관리하게 됩니다. 실무에서는 클러스터의 상태 모니터링과 관리가 중요합니다. 이를 위해 주기적인 클러스터 상태 체크와 데이터 백업, 노드의 성능 모니터링 등이 필요합니다. 클러스터의 상태에 따라서 검색 성능과 데이터 안정성이 달라질 수 있으므로, 상태 변화를 지속적으로 모니터링하고 이에 대응하는 액션이 필요합니다.
2-1-2. Cluster Extensibility (클러스터 확장성)
Elasticsearch 클러스터는 노드 추가/제거를 통한 확장성을 제공합니다. 이는 클러스터의 크기와 성능을 유연하게 조절할 수 있게 해주며, 데이터 처리 용량에 따라 적절하게 클러스터를 확장하거나 축소할 수 있습니다. 이를 통해 대량의 데이터를 효율적으로 분산 처리하며, 대량의 데이터 처리와 높은 병렬 처리 성능을 보장합니다. 클러스터의 확장성을 적절하게 이해하고 운영하면, 검색 성능과 데이터 안정성을 최대화할 수 있습니다.
2-2. Node (노드)
노드는 Elasticsearch의 서버 단위로, 클러스터를 구성하는 기본 요소입니다. 각 노드는 데이터를 저장하고, 검색 쿼리를 처리하며, 클러스터의 작업을 분산 처리하는 데 참여하며, 특정 역할에 따라 다양한 작업을 처리합니다. 노드는 마스터 가능 노드, 데이터 노드, Coordinating 노드, Ingest 노드 등의 역할을 가질 수 있습니다.
실무에서는 노드의 상태와 역할을 이해하고 관리하는 것이 중요합니다. 특히, 노드의 부하 상태에 따라 검색 성능이 달라지므로, 노드의 상태를 지속적으로 모니터링하고 조정하는 것이 필요합니다.
2-2-1. Node 종류
Master Node : 클러스터의 관리와 제어를 담당하며, 클러스터 수준의 메타데이터 변경(인덱스 생성, 삭제 등)을 조정합니다.
Data Node : 데이터 관련 작업을 처리합니다. 데이터 인덱싱, 검색, 집계 및 문서 CRUD 연산 등이 포함됩니다.
Ingest Node : 데이터를 사전 처리하는 역할을 담당합니다. 파싱, 정규화, 변환 등의 작업을 수행합니다.
Coordinating Node : 클라이언트로부터의 요청을 수신하고, 요청에 대한 적절한 노드를 찾아 요청을 분산하며, 결과를 수집하여 클라이언트에 반환합니다.
2-3. 샤드 (Shard)
샤드는 Elasticsearch에서 데이터를 분산 저장하고 처리하는 기본 단위입니다. 샤드는 인덱스가 분할되어 저장되는 방식입니다. 하나의 인덱스는 여러 개의 샤드로 구성될 수 있으며, 이는 데이터의 분산 저장 및 병렬 처리를 가능하게 합니다. 샤드의 개수는 인덱스 생성 시 설정하며, 일단 설정하면 변경할 수 없습니다.
실무에서는 인덱스의 데이터 크기와 클러스터의 노드 수 등을 고려하여 샤드의 개수를 적절히 설정해야 합니다. 샤드가 너무 많으면 클러스터의 오버헤드가 증가하며, 샤드가 너무 적으면 데이터 분산 및 병렬 처리 효율이 떨어집니다.
2-3-1. Shard 종류
Primary Shard (기본 샤드) : 인덱스가 처음 생성될 때 결정되는 샤드입니다. 이 샤드는 데이터의 원본 복사본을 저장합니다.
Replica Shard (복제 샤드) : 기본 샤드의 복사본입니다. 복제 샤드는 데이터의 고가용성을 보장하며, 읽기 요청을 분산 처리하는데 사용됩니다.
각 샤드는 하나 이상의 복제본을 가질 수 있으며, 이는 서버 장애 등의 이슈에 대비하고, 동시 읽기 요청을 분산 처리하는 데 도움이 됩니다. 복제 샤드의 수는 인덱스 생성 후에도 변경할 수 있습니다.
실무에서는 복제를 통해 데이터의 안정성을 확보하고 읽기 성능을 향상시키는 것이 중요합니다. 하지만, 과도한 복제는 저장 공간을 차지하며 쓰기 성능을 저하시킬 수 있으므로, 적절한 복제 수를 설정해야 합니다.
2-4. 인덱스 (Index)
인덱스는 Elasticsearch에서 데이터를 저장하는 기본 단위입니다. 이는 RDBMS의 ‘데이터베이스’에 비유될 수 있습니다. 인덱스는 하나 이상의 샤드로 나뉘며, 각 샤드는 검색 연산을 병렬적으로 처리할 수 있는 독립적인 ‘인덱스 파티션’입니다. 인덱스에는 텍스트, 숫자, 날짜, 위치 좌표 등의 구조화된 JSON 문서가 저장됩니다.
실무에서는 인덱스의 구조와 매핑(mapping, 필드와 그들의 데이터 타입을 정의)을 정확히 정의하는 것이 중요합니다. 이는 검색 성능 및 정확성을 크게 좌우하며, 인덱스 설정 변경은 새로운 인덱스를 생성해야만 가능하므로, 초기 설계 단계에서 세심한 주의를 기울여야 합니다.
3. Elasticsearch 설치 및 설정
3-1. Elasticsearch 설치
Elasticsearch는 자바 기반으로 되어 있으므로, 설치 전에 JDK(Java Development Kit)가 설치되어 있어야 합니다. JDK 버전은 최신 버전을 사용하도록 권장하고 있습니다.
위의 공식 Elasticsearch 웹사이트에서 최신 버전의 Elasticsearch를 다운로드하여 설치를 진행합니다. 설치하려는 환경에 맞춰서 설치를 진행합니다.
3-2. Elasticsearch 기본 설정
Elasticsearch의 설정은 ‘elasticsearch.yml’ 파일에서 지정하고 클러스터 이름, 노드 이름, 메모리 등을 설정 할 수 있습니다. 이 파일은 Elasticsearch의 config 디렉토리에 위치해 있습니다.
클러스터 이름 설정 : cluster.name 항목을 찾아 클러스터 이름을 설정할 수 있습니다. Ex) cluster.name: test-cluster.
노드 이름 설정 : node.name 항목을 찾아 노드 이름을 설정할 수 있습니다. Ex) node.name: test-node
네트워크 설정 : network.host 항목을 찾아 호스트 주소를 설정할 수 있습니다. 일반적으로 localhost 또는 특정 IP 주소를 입력합니다.
Ex) network.host: [localhost]
포트 설정 : http.port 항목을 찾아 Elasticsearch가 사용할 포트를 설정할 수 있습니다. 기본값은 9200입니다.
Discovery 설정 : Elasticsearch 클러스터는 여러 노드로 구성될 수 있으므로, discovery.seed_hosts 설정을 통해 노드들이 서로를 발견할 수 있도록 해야 합니다. 연동하려는 노드들의 ip list 로 설정할 수 있습니다.
Ex) discovery.seed_hosts: [{node_ip1}, {node_ip2} … ]
3-3. Elasticsearch 실행
설정이 완료된 후에는 Elasticsearch를 실행할 수 있습니다. 터미널을 열고 Elasticsearch 디렉토리로 이동한 후, bin 디렉토리로 이동하여 다음 명령어를 사용해 Elasticsearch를 실행합니다 :./elasticsearch
Elasticsearch가 정상적으로 실행되면, 웹 브라우저에서 http://localhost:9200 (또는 설정한 주소와 포트)에 접속하여 Elasticsearch의 상태를 확인할 수 있습니다.
이 가이드는 Elasticsearch를 로컬 환경에 설치하고 설정하는 방법에 대해 설명한 것입니다.
실제 운영 환경에서는 보안 설정, 클러스터 설정, 메모리 설정 등 추가적인 설정이 필요할 수 있습니다.
감사합니다 🙂
Written by 차 예진 / Yejin Cha
Cloud Engineer