1. 엘라스틱 서치 소개
- Elasticsearch는 2010년 2월 샤이 베논이 아파치의 루씬 라이브러리를 기반으로 만든 분산 검색 엔진
- 2013년에 데이터를 손쉽게 시각화하는 Kibana와 색인 데이터 수집&변환을 하는 Logstash 프로젝트에 엘라스틱에 합류
- 엘라스틱서치는 현재 검색 엔진 분야에서 가장 각광받고 있는 시스템이다. 분산처리나 고가용성, 수평적 확장성 등 엔터프라이즈 영역에 필요한 주요 기능을 제공하고 있으며, 이러한 요소들의 효용성이 많은 기업 사용자에 의해 다년간 충분히 검증되었다.
- 엘라스틱서치는 JSON 기반의 문ㅅ를 저장, 색인, 검색하기에 분산 NoSQL 스토리지의 성격을 가지고 있다.
1.1 엘라스틱서치의 기본 콘셉트
- 루씬은 데이터를 색인하고 검색하는 기능을 제공하는 검색엔진의 코어 라이브러리이다.
검색 엔진
- 엘라스틱서치는 기본적으로 검색엔진이다.
- 다른 RDBMS나 경쟁 NoSQL에 비해 매우 강력한 검색 기능을 지원한다.
- 단순한 텍스트 매칭 검색이 아닌 본격적인 전문 검색(full-text search)이 가능하고, 다양한 종류의 검색 쿼리를 지원하다.
- 역색인을 사용하여 검색 속도도 매우 빠르다.
- 다양한 analzyer)를 조합하여 여러 비즈니스 요구사항에 맞는 색인을 구성할수 있고, 형태소 분석도 가능하다.
분산 처리
- 데이터를 여러 노드에 분산 저장하며 검색이나 집계 작업 등을 수행할 때도 분산 처리를 지원한다.
고가용성 제공
- 클러스터를 구성하고 있는 일부 노드에 장애가 발생해도 복제본 데이터를 이용해 중단 없이 서비스를 지속할 수 있다.
- 장애 상황에서 엘라스틱 서치는 다시 복제본을 만들어 복제본 개수를 유지하면서 노드 간 데이터의 균형을 자동으로 맞춘다.
수평적 확장성
- 요청 수나 데이터의 양 증가에 따라 더 많은 처리 능력이 요구되는 때가 생기는데, 엘라스틱서치는 이런 상황을 대비하여 수평적 확장을 지원한다.
JSON 기반의 REST API 제공
- JSON 형태의 문서를 저장, 색인, 검색한다.
- 특별한 클라이언트 라이브러리 사전 설치 없이 환경에 구애받지 않고 HTTP API를 통해 쉽게 이용 가능하다.
데이터 안정성
- 높은 데이터 안정성을 제공한다.
- 데이터 색인 요청 후 200 OK를 받았다면 그 데이터는 확실히 디스크에 기록됨을 보장한다.
다양한 플러그인을 통한 기능 확장 지원
- 다양한 플러그인을 사용해 기능을 확장하고 변경할수 있다.
- 또, 핵심적적인 기능들도 플러그인을 통해 제어할수 있도록 설계됐다.
준실시간 검색
- 엘라스틱서치는 준실시간 검색(near real-time search)을 지원한다.
- 데이터를 색인하자마자 조회하는 것은 가능하지만, 색인 직후의 검색 요청은 성공하지 못할 가능성이 높다.
- 기본 설정 운영시 최대 1초 정도 지연시간이 발생한다.
트랜잭션이 지원되지 않음.
- 일반적인 RDBMS와는 다르게 트랜잭션을 지원하지 않는다.
- 서비스와 데이터 설계시 이 점을 고려해야 한다.
사실상 조인을 지원하지 않음.
- 기본적으로 조인을 염두에 두고 설계되지 않았다.
join
이라는 특별한 데이터 타입이 있지만, 이는 굉장히 제한적인 상황을 위한 기능이고, 성능도 떨어진다.- 설계시 RDBMS와는 다르게 데이터를 비정규화하고, 가급적 조인을 아예 사용할수 없다고 가정하여 설계를 해야 한다.
1.2 라이선스 정책
- 엘라스틱 라이선스와 SSPL(Server Side Public License)라는 2가지 라이선스 정책을 채택한다.
- github에 공개되는 소스코드는 사용자가 원하는 라이선스 정책을 선택해 사용할 수 있다.
- SSPL은 소스코드에 비롯된 파생작업을 만드는 경우 파생 작업물도 SSPL 라이선스로 공개해야 하는 카피레프트 성격의 라이선스이다. (상업 서비스에서 SSPL 라이선스로 소스코드를 이요하려면 사전검토가 필요하다.)
- 특수한 사정이 있는 경우 7.10 버전 이하의 구버전을 선택하는 방법도 고려해볼만 하다.
- AWS OpenSearch 배포판을 선택하는 방법도 있다.
1.3 실습환경 구축
- 실습을 위해 elasticsearch와 kibana를 설치해보자.
- 책에서는 OS 환경별로 직접 app 설치하는 방법으로 정의되어있으나, 편의상 docker-compose를 이용해서 띄우는 방식으로 환경 구축을 진행합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
version: '3.7'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.5.2
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/Users/sungsupark/dev/personal/kotlin-spring-multi-module-starter/db/elasticsearch/starter/data
ports:
- 9200:9200
networks:
- internal-network
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:8.5.2
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/Users/sungsupark/dev/personal/kotlin-spring-multi-module-starter/db/elasticsearch/starter/data
networks:
- internal-network
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:8.5.2
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/Users/sungsupark/dev/personal/kotlin-spring-multi-module-starter/db/elasticsearch/starter/data
networks:
- internal-network
kibana:
image: docker.elastic.co/kibana/kibana:8.5.2
container_name: kibana
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- internal-network
depends_on:
- es01
cerebro:
image: lmenezes/cerebro:0.9.4
container_name: cerebro
environment:
- CEREBRO_PORT=8080
- ELASTICSEARCH_HOSTS=http://es01:9200
ports:
- 8080:8080
networks:
- internal-network
depends_on:
- es01
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
internal-network:
driver: bridge
- 개인 로컬 개발환경에서는 프로젝트 경로에
.gitignore
처리되어있는${project}/db/~
하위로 es 볼륨을 정의했습니다. - xpack.security.enabled=false
이 옵션은 배포 환경에서는 빠져야하는데 es8부터 해당 옵션이 빠지면 es 컨테이너 구동이 되지 않아 추가됨.
1.3.1 ES
1.3.2 Kibana
- 키바나는 ES와 함께 엘라스틱에서 배포하고 있는 스택의 일원으로 데이터를 효과적으로 시각화하는 솔루션이다.
- 샘플 데이터 추가
Home > Try sample data > Other sample data sets > Add data
1.3.3 Cerebro
- ES 클러스터의 상태 화인과 관리를 도와주는 서드파티 솔루션이다.
Comments powered by Disqus.