ElasticSearch는 실시간 분산 검색 및 분석 엔진으로, 복잡한 검색 요구사항과 대용량 데이터 처리가 필요한 다양한 환경에서 사용된다. 이 엔진은 아파치 루씬(Lucene) 기반으로 만들어져 있으며, JSON 문서 형태로 데이터를 저장한다.
주요 특성:
- 분산처리: ElasticSearch는 클러스터 내에서 자동으로 데이터 샤딩을 지원하므로, 대용량 데이터를 효율적으로 처리할 수 있다.
- 실시간: 거의 실시간(NRT, Near Real Time)에 가까운 데이터 인덱싱과 검색이 가능. 데이터 처리에 1초 가량이 걸리기 때문에 완전 실시간이 아니라 거의 실시간이다..
- 다양한 Query DSL: ElasticSearch는 다양한 검색 쿼리를 JSON 형태로 제공한다. 이를 통해 복잡한 검색 요구사항도 손쉽게 충족시킬 수 있다.
- 호라이즌 스케일링: 노드를 추가하거나 제거함으로써 수평적으로 스케일 아웃이 가능.
- RESTful API: 모든 작업은 HTTP 메서드(GET, POST, PUT, DELETE)를 통해 RESTful API로 수행된다.
- 다양한 클라이언트 라이브러리: Python, Java, Ruby, JavaScript 등 다양한 언어로 클라이언트 라이브러리가 지원된다.
주요 컴포넌트:
- 노드(Node): ElasticSearch 클러스터를 구성하는 하나의 인스턴스입니다.
- 인덱스(Index): 관련된 데이터 타입을 모아놓은 컨테이너입니다. SQL에서의 '데이터베이스'와 유사한 개념입니다.
- 샤드(Shard): 인덱스를 구성하는 하위 단위로, 데이터의 일부분을 저장합니다. 샤딩을 통해 데이터를 분산 저장하고, 병렬 처리를 가능하게 합니다.
- 타입(Type): 더 이상 사용되지 않는 구식 개념으로, 현재는 메타데이터와 매핑만을 위해 사용됩니다.
- 문서(Document): 데이터 레코드를 JSON 형태로 저장한 단위입니다.
- 매핑(Mapping): 데이터를 어떻게 저장할지 정의하는 스키마입니다. 각 필드의 데이터 타입, 색인 유형 등을 지정할 수 있습니다.
활용 사례:
- 풀텍스트 검색: 웹사이트나 앱 내에서 복잡한 검색 기능을 제공할 때
- 로그 분석: 실시간으로 대용량 로그 데이터를 분석하여 모니터링, 알림, 보고서 생성 등
- 데이터 시각화: Kibana와 연동하여 다양한 형태의 데이터 시각화 제공
- 기타: 시계열 데이터 분석, 추천 시스템 등 다양한 분야에서 사용됩니다.
- 데이터 처리 파이프라인
- 데이터 수집과 변환: 다양한 소스에서 로그 또는 이벤트 데이터를 수집하여 필요에 따라 변환
- 플러그인 아키텍처: 입력, 필터, 출력 플러그인을 통해 다양한 데이터 소스와 목적지에 연결
- Elasticsearch와 통합: 일반적으로 Logstash는 Elasticsearch로 데이터를 전송하여 색인을 생성하거나 업데이트
- 시각화 기능
- 데이터 시각화: Elasticsearch에서 저장된 데이터를 기반으로 다양한 차트나 대시보드를 만들 수 있다
- 데이터 탐색: 저장된 데이터를 쉽게 검색하고 탐색
- Dev Tools: Elasticsearch의 RESTful API를 직접 사용하여 데이터를 질의할 수 있는 기능을 제공
도커 컴포즈를 통해서 3개의 elasticsearch 노드와 kibana, logstash를 띄우려고 했지만 프리티어 인스턴스의 스펙이 너무 낮아 싱글노드의 elasticsearch와 각각의 도커 명령어를 통해서 실행시켰다
실행 전 인스턴스의 보안그룹에서 포트 열어주는 것 잊지말자
# elasticsearch 실행
$ docker run --name elasticsearch -d -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" -p 9200:9200 docker.elastic.co/elasticsearch/elasticsearch:7.14.0
# kibana 실행
$ docker pull docker.elastic.co/kibana/kibana:7.14.0
$ docker run -d --link elasticsearch:elasticsearch -p 5601:5601 --name kibana docker.elastic.co/kibana/kibana:7.14.0
# logstash 실행
$ docker pull docker.elastic.co/logstash/logstash:7.14.0
$ docker run -d --link elasticsearch:elasticsearch -p 5044:5044 --name logstash docker.elastic.co/logstash/logstash:7.14.0
http:{인스턴스ip}:5601로 접속확인
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
environment:
- cluster.name=docker-cluster
- node.name=elasticsearch
- "ES_JAVA_OPTS=-Xms256m -Xmx256m"
- "discovery.type=single-node"
ports:
- 9200:9200
networks:
- esnet
volumes:
- es-data:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:7.14.0
ports:
- 5000:5000
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- esnet
depends_on:
- elasticsearch
volumes:
- logstash-data:/usr/share/logstash/data
kibana:
image: docker.elastic.co/kibana/kibana:7.14.0
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://elasticsearch:9200
networks:
- esnet
depends_on:
- elasticsearch
volumes:
- kibana-data:/usr/share/kibana/data
volumes:
es-data:
logstash-data:
kibana-data:
networks:
esnet: