Elasticsearch는 Apache Lucene 기반의 검색 엔진입니다. HTTP 웹 인터페이스와 스키마에서 자유로운 Json 문서와 함께 멀티테넌트 지원 전문 검색 엔진을 제공합니다. 더불어, 자바 기반의 오픈 소스이지만, 클라이언트는 수많은 언어(Java, C#, PHP, Python..)로 이용이 가능합니다.
Apache Lucene 특징
- 자바 언어로 개발
- 사용자 위치 정보 이용 가능
- 다국어 검색 지원
- 자동 완성, 미리 보기 지원
- 철자 수정 기능 지원
Elasticsearch 특징
- 분산 시스템
- 여러 개의 node로 구성되는 분산 시스템
- 기존 node에서 새 node를 실행하여 연결하는 것만으로 확장 가능
- data는 각 node에 분산하여 저장
- 복사본(replica)을 유지하여 각종 충돌로부터 node data 보호
- discovery를 내장하여 별도의 분산 시스템 관리자 불필요
- 높은 가용성
- 각 노드는 1개 이상의 원본 및 복사본을 다른 위치에 저장
- 노드가 종료되거나 실행에 실패할 경우 다른 노드로 data 이동
- 멀티 테넌시(multi tenancy)
- data는 여러 개로 분리된 인덱스들에 그룹으로 저장 (index = RDBMS의 DB에 대응)
- 서로 다른 인덱스의 데이터를 하나의 질의로 검색하여 하나의 출력으로 도출 가능
- JSON DOCUMENT / RESTFUL API
- 기본적으로 모든 필드를 색인 후 Json 구조로 저장
- Json 구조로 인해 모든 레벨의 필드에 접근이 쉽고, 빠른 속도로 검색이 가능합니다.
- 사전 매핑 없이, Json 문서 형식으로 데이터를 입력하면 바로 색인 작업 수행
- Rest 자원은 색인된 데이터 및 질의, 검색되어 Json 형식으로 출력된 문서를 뜻합니다.
- Json 문서를 Uri로 명시, 이 문서를 처리하기 위해 HTTP Method 이용
- 실시간 분석
- 저장된 데이터는 검색에 사용되기 위해 별도의 재시작 / 갱신이 불필요
- 색인 작업이 완료됨과 동시에 바로 검색 가능
- 실시간 분석 / 검색은 데이터 증가량에 구애받지 않습니다.
elasticsearch 환경설정
elasticsearch.yml
cluser.name = 클러스터 이름 설정 (default: elasticsearch)
node.name = 노드 이름 설정
bootstrap.mlockall = 사용 메모리 고정(JVM이 메모리를 다른 자바 프로그램으로 돌리는 것을 방지)
index.number_of_shard = 샤드 개수 지정(default: 5)
index.number_of_replicas = 복사본 개수 지정(default: 1)
HTTP Network Setting
network.bind_host: 서버 내부 IP 주소(방화벽, 공유기 사용시)
network.publish_host: 공개 IP 주소
network.host: 내부 IP와 공개 IP가 동일할 경우 사용
tranport.tcp.port: 다른 노드와 바인딩하여 통신하기 위해 사용하는 포트(default:9300)
transport.tcp.compress: 통신 내용의 압축 여부
http.port: REST API 서비스 포트(default:9200)
http.max_content_length: 최대 전송 데이터
http.enabled: REST API 제공 여부
System 구조
Cluster
- ES의 가장 큰 단위
- 여러 대의 서버나 노드가 함께 동작하여 데이터를 저장하고 처리하는 분산 환경
- 하나의 Cluster는 여러 개의 Node로 이루어져 있습니다.
- 여러 대의 서버가 하나의 클러스터를 구성할 수 있으며, 그 반대도 가능합니다.
- 같은 클러스터의 이름으로 노드를 실행하는 것만으로도 자동 확장
Node
- ElasticSearch를 구성하는 하나의 단위 프로세스
- node는 master, data node로 구분
- master node는 전체 cluster 상태의 메타 정보를 관리
- 기존의 master node가 종료되는 경우, 새로운 master node가 선출됨
- data node는 실제 데이터가 저장되는 node
- data node가 하나밖에 없는 경우, 복사본은 생성되지 않습니다.
- data node는 외부 접근을 차단합니다.
node binding
- 같은 cluster name을 가지고 실행된 노드는 자동으로 바인딩
- 9200 Port Number부터는 Rest API를 위한 HTTP Port가 할당
- 9300 Port Number 부터는 node binding을 위한 Port로 할당
Network binding
- Scale-Out을 위해 네트워크에 있는 다른 서버의 노드와도 binding 가능
- multicast, unicast 방식을 모두 지원
- 반드시 두 elasticsearch의 version은 동일해야 합니다.
Shard, Replica
- Shard: 데이터 검색을 위해 구분되는 최소 단위
- Index는 기본적으로 Shard 단위로 분리되고, 각 노드에 분산되어 저
- Replica: Shard에 대한 복제본
- Replica를 만드는 이유는 원본 Shard에 문제가 생기더라도, Replica를 통해 데이터를 제공할 수 있게 되어 고가용성 증대 및 하나의 데이터를 2개의 Shard가 갖고 있기 때문에 검색 성능이 향상되기 때문입니다.
Elasticsearch Data Structure
- Document: ES의 단일 데이터 단위
- Type: Document를 모아놓은 집합체
- Index: 여러 개의 Type을 모아놓은 집합체(Index라는 단어가 여러 뜻으로 사용되기 때문에 데이터 저장 단위인 인덱스는 indices라고도 표현)
- Indexing: 데이터가 검색될 수 있는 구조로 변경하기 위해 원본 문서를 검색어 토큰들로 변환하여 저장하는 일련의 과정 = 색인 (data를 Elasticsearch에 저장하는 과정)
Elasticsearch에서 데이터를 검색하는 과정 (Query or Filter)
- ES에서 데이터를 찾고 구분하는 기능은 크게 쿼리 및 필터를 이용하는 방법으로 나뉩니다.
- 쿼리와 필터는 모두 Json 형식으로 구현하며 이를 QueryDSL(Domain Specific Language)이라고 합니다.
- 각각 독립적인 요소로 실행하고, 문법은 Aggregation과 같은 API 내부에서도 사용합니다.
기본적인 형태소 분석 과정
- 대문자는 모두 소문자로 변환
- 중복 단어 제거
- 분석 과정을 거치고 저장된 토큰을 텀(term)이라 칭합니다.
ES의 사용 사례
- Wikipedia: 전문검색 수행, 실시간 타이핑 검색, 추천 검색어 기능
- Github: 13000억 줄이 넘는 소스 코드를 검색하는 데 사용
- Stack Overflow: 검색내용과 결과를 통합해 유사한 질문과 해답을 연결
Elasticsearch의 개념과 장점, 시스템 및 데이터 구조에 대해 알아보았습니다. 이제 다음 포스팅에서는 Data Indexing, Searching을 하기 위한 Query의 종류와 사용 방법에 대해 간략한 코드와 함께 보여드리도록 하겠습니다.
'Database > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] Data Indexing, Searching By Query (0) | 2023.11.15 |
---|