
최근 회사에서 검색 관련 기능을 구현하는 도중 Elasticsearch를 사용하는 것이 좋을 것 같다는 얘기가 나왔는데, 한번도 다뤄본 적이 없었던 터라 이번 기회에 '엘라스틱서치 바이블 (여동현 저)' 로 독학하며 공부한 내용을 기록하려 한다.
엘라스틱서치 얘기를 하면서 키바나, 로그스태시가 같이 나왔던 기억이 나는데, 이 책의 첫 장에서 엘라스틱서치에 대한 설명을 읽으며 왜 같이 나왔었는지를 알 수 있었다.
2013년에 엘라스틱서치의 데이터를 손쉽게 시각화하는 키바나(Kibana)와 엘라스틱서치에 색인할 데이터를 수집하고 변환하는 로그스태시(Logstash) 프로젝트가 엘라스틱에 합류했다. 이렇게 엘라스틱서치와 둘을 합쳐 ELK 스택 이라고 부른다.
ELK 스택을 이용해 데이터의 수집부터 변환, 저장, 색인, 검색, 시각화까지 데이터 생명 주기 전체를 모두 엘라스틱의 솔루션으로 해결할 수 있다.
루씬은 데이터를 색인하고 검색하는 기능을 제공하는 검색 엔진의 코어 라이브러리인데, 엘라스틱 서치는 이 루씬을 코어로 이용하여 JSON 문서의 저장, 색인, 검색 등의 작업을 분산 처리하는 검색 엔진이다.
1. 검색 엔진
1) 엘라스틱 서치는 다른 RDBMS나 경젱 NoSQL에 비해 매우 강력한 검색 기능을 지원한다.
2) 본격적인 전문 검색(full-text search)이 가능하며, 다양한 종류의 검색 쿼리를 지원한다.
3) 검색 엔진이기 때문에 역색인을 사용해 검색 속도도 매우 빠르다.
4) 다양한 애널라이저(analyzer)를 조합해 여러 색인을 구성할 수 있고, 형태소 분석도 가능하다.
2. 분산 처리
데이터를 여러 노드에 분산 저장하며 검색이나 집계 작업 등을 수행할 때도 분산 처리를 지원한다.
3. 고가용성(High Availability) 제공
클러스터를 구성하고 있는 일부 노드에 장애가 발생해도 복제본 데이터를 이용해 중단 없이 서비스를 지속할 수 있다. 복제본의 개수를 유지하면서 노드 간 데이터의 균형을 자동으로 맞춘다.
4. 수평적 확장성
더 많은 처리 능력이 필요할 때에는 새로운 노드에 엘라스틱서치를 설치해 클러스터에 참여시키는 것만으로도 확장이 된다. 새 노드에 데이터를 복제하거나 옮기는 작업도 엘라스틱서치가 자동으로 수행한다.
5. JSON 기반의 REST API 제공
엘라스틱서치는 JSON 형태의 문서를 저장/색인/검색하며, 엘라스틱서치에 작업 요청을 보낼 때도 JSON 기반의 REST API를 사용하여 HTTP를 통해 쉽게 이용할 수 있다.
6. 데이터 안정성
데이터 색인 요청 후 200 OK를 받았다면 그 데이터는 확실히 디스크에 기록된다.
7. 다양한 플러그인을 통한 기능 확장 지원
다양한 플러그인을 통해 여러 비즈니스 요구사항에 맞게 엘라스틱서치를 커스터마이즈할 수 있다.
8. 준실시간(near real-time search) 검색
데이터를 색인하자마자 조회하는 것은 가능하지만, 데이터 색인 직후의 검색 요청은 성공하지 못할 가능성이 높다. 이는 엘라스틱 서치가 역색인을 구성하고 이 역색인으로부터 검색이 가능해지기까지 최대 1초 정도 시간이 걸리기 때문이다.
9. 트랜잭션이 지원되지 않음
엘라스틱서치는 RDBMS와는 다르게 트랜잭션을 지원하지 않으므로, 서비스와 데이터 설계 시 이 점을 고려해야 한다.
10. 사실상 조인을 지원하지 않음
엘라스틱서치는 기본적으로 조인을 염두에 두고 설계되지 않았다. 기본적으로 RDBMS와는 다르게 데이터를 비정규화해야 한다. 서비스와 데이터 설계에 있어 조인을 아예 사용하지 않는다고 생각해야 한다.