Elasticsearch란
회사에서 일하고 있는 프로젝트에서 Elasticsearch 를 사용하고 있어 좀 더 자세히 알고싶은 마음에
찾아보게되었다.
Elasticsearch란
Elasticsearch는 Apache Lucene기반의 Java 오픈소스 분산 검색 엔진이다. 기본적으로 모든 데이터를 색인하여 저장하고 검색, 집계 등을 수행하며 결과를 클라이언트 또는 다른 프로그램으로 전달하여 동작하게 한다. 기존 RDBMS에서 다루기 어려운 full text search 기능이 제공된다.
특징
1. 오픈소스
Elastic Stack의 모든 제품들은 (https://github.com/elastic) 깃헙 리파지토리에서 소스들을 찾을 수 있다.
2. 실시간 분석
Elasticsearch는 하둡 시스템과 달리 Elasticsearch 클러스터가 실행되고 있는 동안에는 계속해서 데이터가 입력 (검색엔진에서는 색인 – indexing) 되고, 그와 동시에 실시간에 가까운 (near real-time) 속도로 색인된 데이터의 검색, 집계가 가능하다.
3. 전문 검색 엔진
Elasticsearch는 색인된 모든 데이터를 역파일 색인 구조로 저장하여 가공된 텍스트를 검색한다.JSON 문서 기반 Elasticsearch는 내부적으로는 역파일 색인 구조로 데이터를 저장하고 있으나, 사용자의 관점에서는JSON 형식으로 데이터를 전달합니다.
3. RESTFul API
Elasticsearch는 Rest API를 기본으로 지원하며 모든 데이터 조회, 입력, 삭제를 http 프로토콜을 통해 Rest API로 처리한다.
4. 멀티테넌시(multitenancy)
Elasticsearch의 데이터들은 인덱스(Index) 라는 논리적인 집합 단위로 구성되며 서로 다른 저장소에 분산되어 저장됩니다. 서로 다른 인덱스들을 별도의 커넥션 없이 하나의 질의로 묶어서 검색하고, 검색 결과들을 하나의 출력으로 도출할 수 있는데, Elasticsearch의 이러한 특징을 멀티테넌시 라고 합니다.
Kibana
Kibana는 Elasticsearch를 가장 쉽게 시각화 할 수 있는 도구입니다. 검색, 그리고 aggregation의 집계 기능을 이용해 Elasticsearch로 부터 문서, 집계 결과 등을 불러와 웹 도구로 시각화를 한다.
ES와 RDBMS
ES에서 사용되는 데이터 구조와 RDBMS에 대해 비교해보면 다음과 같다.
ES | RDBMS |
Index | DATABASE |
Shard | PARTITION |
Type | TABLE |
Document | ROW |
Field | COLUMN |
Mapping | SCHEMA |
Query DSL | SQL |
ES는 기본적으로 REST API를 통해 데이터 조작을 지원한다. 이를 RDBMS SQL과 비교해보면 다음과 같다.
ES HTTP METHOD | RDBMS SQL |
GET | SELECT |
PUT | INSERT |
POST | UPDATE, SELECT |
DELETE | DELETE |
HEAD (인덱스 정보확인) |
ES의 장단점
장점
- 오픈소스 검색엔진이다.
- 전문검색
내용 전체를 색인해서 특정 단어가 포함된 문서를 검색할 수 있다. 기능별, 언어별 플러그인을 적용할 수 있다. - 통계 분석
비정형 로그 데이터를 수집하여 통계 분석에 활용할 수 있다. Kibana를 연결하면 실시간으로 로그를 분석하고 시각화할 수 있다. - Schemaless
정형화되지 않은 문서도 자동으로 색인하고 검색할 수 있다. - RESTful API
HTTP기반의 RESTful를 활용하고 요청/응답에 JSON을 사용해 개발 언어, 운영체제, 시스템에 관계없이 다양한 플랫폼에서 활용이 가능하다. - Multi-tenancy
서로 상이한 인덱스일지라도 검색할 필드명만 같으면 여러 인덱스를 한번에 조회할 수 있다. - Document-Oriented
여러 계층 구조의 문서로 저장이 가능하며, 계층 구조로된 문서도 한번의 쿼리로 쉽게 조회할 수 있다. - 역색인(Inverted Index)
- 확장성
분산 구성이 가능하다. 분산 환경에서 데이터는 shard라는 단위로 나뉜다.
단점
- 완전 실시간은 아니다.
색인된 데이터는 1초 뒤에나 검색이 가능하다. 내부적으로 commit과 flush같은 복잡한 과정을 거치기 때문. - Transaction Rollback을 지원하지 않는다.
전체적인 클러스터의 성능 향상을 위해 시스템적으로 비용 소모가 큰 롤백과 트랜잭션을 지원하지 않는다. - 데이터의 업데이트를 제공하지 않는다.
업데이트 명령이 올 경우 기존 문서를 삭제하고 새로운 문서를 생성한다. 업데이트에 비해서 많은 비용이 들지만 이를 통해 불변성(Immutable)이라는 이점을 취한다.
용어
- Index
데이터 저장 공간
하나의 물리 노드에 여러개 논리 인덱스 생성
하나의 인덱스가 여러 노드에 분산 저장 (M:N) - Shard
색인된 문서는 하나의 인덱스-인덱스 내부에 색인된 데이터는 여러개의 파티션으로 나위어 구성됨.
(파티션=샤드) - Type
인덱스의 논리적 구조
6.1부터 인덱스당 하나의 타입만 설정 가능 - Document
데이터가 저장되는 최소 단위
JSON 포맷으로 저장
DB의 Row에 대응됨 - Field
문서를 구성하기 위한 속성
DB의 컬럼과 비교할 수 있음 - Mapping
문서의 필드, 필드 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스
스키마 정의 프로세스라고 보면 된다.
Reference