소개
아파치 루씬(Lucene) 기반의 검색엔진이며, 시각화 도구인 Kibana, 수집 도구인 Logstash, Beats 등과 함께 Elastic Stack 으로 구성되어 있다.
(1) 검색 : 커머스 사이트의 상품 검색 또는 위키피디아 등의 문서 검색
(2) 분석 : 의료, 보안 등의 특수 데이터 분석
(3) 로그분석 : 웹 로그, 머신 로그 등의 시계열(확률적 현상을 관측하여 얻은 값을 시간의 차례대로 늘어놓은 계열) 기반의 데이터 분석
(1) 기본적으로 분산 시스템으로 구성되며 스케일 아웃(Scale-out)과 데이터 유실을 대비한 고가용성
(2) JSON 과 REST API 를 이용하여 다양한 클라이언트와 연동하여 유연한 데이터 모델 지원
(3) 전문(Full Text) 검색을 지원하며 다양한 시계열 데이터와 수치 데이터의 집계 및 연산 가능
(4) 실시간 데이터 검색, 분석 및 다양한 쿼리 문법 지원
기능 요약
(1) 오픈소스 : Apache 2.0
(2) 분산시스템 : 샤드 기반의 데이터 분산 저장
(3) 고가용성 : 복제본을 통한 데이터 유실 방지
(4) 문서기반 : JSON 도큐먼트 기반
(5) RESTFul : http 프로토콜을 통한 REST API 지원
(6) 전문검색 (Full Text) : 문서 전체를 Term 기반으로 색인
(7) 실시간 : 배치 기반의 사이클 분석이 아닌 데이터 실시간 저장, 쿼리 가능
설치하기 (수정 2018 06 09) : Window 환경
처음에 설치할때는 뭣도 모르고 설치했는데, 다시 설치하려고 보니, 윈도우 환경에서 설치하는것, MSI 파일로 다운받는 것이 낫다고 생각합니다. GUI 환경에서 말끔하게 설치하고 이후에 엘라스틱서치를 실행시키는 것에 있어서 큰 무리 없는 것 같습니다. 따라서 내용을 전면 수정합니다.
(1) 아래의 사이트로 이동합니다.
https://www.elastic.co/downloads/past-releases/elasticsearch-6-1-1
( 처음 포스팅을 작성했던 5월 14일 기준에서 엘라스틱의 버전을 6.2.4 버전으로 설치했지만, 나중에 여러 플러그인 관련한 문제 때문에 좀 더 낮은 버전은 6.1.1 버전을 다운받습니다.)
(2) 화면의 MSI(BETA) 를 클릭합니다. MSI 는 Microsoft Installer 의 준말로 윈도우 운영체제에 설치하기 쉽게 되어있습니다.
(3) 아마 창이 하나 뜨면서 쭉쭉쭉 내용들을 밀고나가시면 됩니다. NEXT 버튼을 쭉 누르시면 설치가 완료되었음을 확인가능합니다. (관련 사진은 여기를 참고하면 됩니다.)
(4) ctrl + R 을 누르면 윈도우에서 실행창이 나타압니다. services.msc 를 입력하고 엔터를 입력하면 창이 하나 뜨는데, Elasticsearch 가 있는 것을 확인할 수 있습니다.
(5) 실행되면 브라우저의 주소창에 http://localhost:9200 를 입력하시면 아래의 창이 나타나는 것을 확인하면 설치가 제대로 된 것입니다.
(6) 추가로 curl 명령어로도 확인이 가능합니다. 파워쉘로 확인했는데, curl 명령어를 파워쉘에서 쓸려면 몇가지 일들을 해야하기 때문에 차라리 윈도우에서 제공하는 WSL (우분투 배시) 를 사용합니다.
http://sanghaklee.tistory.com/39 에서 확인하면 됩니다.
여기까지 수정글입니다.
curl
command line 용 data transfer tool 이다. download/upload 모두 가능하며 HTTP/HTTPS/FTP/LDAP/SCP/TELNET/SMTP/POP3 등 주요 프로토콜을 지원한다고 한다. API 를 테스트하거나 웹 사이트의 정보를 얻기 위해 쓰인다. 자세한 내용은 여기를 클릭하자.
또한 curl 명령어를 쓰지 않더라도 POSTMAN 으로 API 테스팅을 할 수 있다.
기능소개
기능을 소개하기 이전에, 너무 많은 글들을 보았고, 복잡하고 생소해서 다시 정리를 할 필요성을 느꼈다. 일단 우선적으로 해당 내용은 참고링크의 세번째 내용을 참조하였다.
REST API
ElasticSearch 는 REST API를 이용한 HTTP 통신을 통해 데이터를 처리한다.
데이터는 인덱스와 타입이라고 하는 논리적 영역에 저장되며, JSON 도큐먼트 형식으로 저장된다.
JSON 도큐먼트의 개별 요소 값을 필드라고 한다.
각 도큐먼트의 접근 URI 는 {HOST}:{PORT}/{Index}/{Type}/{document ID} 로 이루어진다.
http 메소드인 PUT / POST / GET / DELETE 등을 이용하여 문서를 입력 / 조회/ 삭제를 수행한다.
HTTP |
CRUD |
SQL |
GET |
READ |
SELECT |
PUT |
UPDATE |
UPDATE |
POST |
CREATE |
INSERT |
DELETE |
DELETE |
DELETE |
클러스터
엘라스틱서치 시스템의 가장 큰 단위이다. 전체 데이터를 가지고 모든 노드 간의 통합 인덱싱 및 검색이 가능한 1개 이상의 노드(서버)의 집합이다.
하나의 클러스터는 다수의 노드로 구성
하나의 클러스터를 다수의 서버로 바인딩해서 운영, 또는 역으로 하나의 서버에서 다수의 클러스터를 운영 가능
Elasticsearch 설치 경로의 config 디렉토리 아래에 있는 elasticsearch.yml 파일, 또는 실행 시 -E 커맨드 옵션으로 설정이 가능
노드
엘라스틱서치를 구성하는 하나의 단위 프로세스이며, 클러스터의 부분이 되는 단일 서버이다.
다수의 샤드로 구성
같은 클러스터 명을 가진 노드들은 자동으로 바인딩
Elasticsearch 설치 경로의 config 디렉토리 아래에 있는 elasticsearch.yml 파일, 또는 실행 시 -E 커맨드 옵션으로 설정 가능
http 통신 포트 : 9200 ~ 부터 차례대로 증가
노드 간 데이터 교환 포트 : 9300 ~ 부터 차례대로 증가
같은 클러스터 명을 가진 노드들은 자동으로 한 클러스터 안에서 바인딩된다. 이 말인 즉슨 같은 클러스터 명 내에서 노드들을 증가하는 것만으로도 자동확장이 가능하다.
클러스터명이 다르면 같은 서버 또는 네트워크 내에서도 다른 클러스터로 구성된다. (클러스터 명을 기준), 결과적으로 노드는 클러스터 명을 가지고 참여여부를 설정한다. 별도로 설정하지 않으면 elasticsearch 라는 클러스터 명을 가지고 노드가 구성된다.
아무런 설정 없이 동일 네트워크 상에서 다수의 노드를 가동하게 되면, elasticsearch 라는 이름으로 단일 클러스터가 자동으로 구성이 되어 있는 것이다. 네트워크 상에서 어떤 노드가 클러스터에 구성되었는지 관리하기 쉽게하기 위해서는 각각의 노드에 이름을 정의하는 것이 좋다.
- 샤드 : 데이터 검색 단위 루씬 인스턴스
- 레플리카 : 샤드의 복사본
- 인덱스 별로 설정, 기본값은 샤드 : 5, 레플리카 : 1
- REST API의 PUT 메소드를 이용해서 인덱스 안의 setting 값으로 설정
- 각 노드 별로 샤드가 분배되어 저장
- 동일한 샤드와 레플리카는 항상 서로 다른 노드에 저장
- 일부 노드가 중지되더라도 샤드와 레플리카 중 최소 1개만 살아있으면 클러스터는 정상적으로 동작
(레플리카, 즉 복사본을 유지하여 각종 충돌로부터 노드 데이터를 보호)
- 모든 데이터는 Elasticsearch안에 색인되어 저장되고, 조회, 집계된다.
- REST API를 지원하는 애플리케이션이라면 모두 데이터 수집이 가능하지만, Elastic 에서는 데이터 수집기인 Logstash 와 Beats 를 지원
- Logstash는 다양한 입/출력 파이프라인 및 데이터 변조, 필터링을 지원
- Beats 는 수집한 데이터를 Elasticsearch 또는 Logstash 로 전송하는 기능만 있으며 대신 가볍고 빠르다. - 시각화 툴인 Kibana를 이용해서 Elasticsearch 에 저장된 데이터를 다양한 도표로 시각화가 가능하다.
- Elasticsearch, Logstash, Beats, Kibana를 묶어 Elastic Stack 이라고 부르며 이 스택에 해당되는 제품들은 모두 오픈소스 (Apache 2.0) 이다. 여기서 Elasticsearch/Logstash/Kibana 의 앞 글자만 따서 ELK Stack 이라고 부른다.
- 추가로 Elastic 사에서 X-Pack 이라는 상용 플러그인을 배포중이며, X-Pack은 보안, 알람, 모니터링, 그래프, 머신러닝 등의 추가 기능을 제공한다.
- ES-Hadoop 이라는 제품을 통해 하둡 시스템으로부터 데이터 수집이 가능하다.
- Beats 및 다양한 소스로부터 수집된 데이터가 Logstash를 거쳐 Elasticsearch 클러스터에 저장되고 Kibana 및 다른 애플리케이션들을 통해 검색 및 조회가 된다.
- Kibana를 이용해 Elasticsearch 안에 있는 데이터를 쉽게 시각화 가능하다.
- 기존 마스터노드가 종료되면 새로운 마스터 노드가 선출
- 데이터노드가 하나밖에 없는 경우 복사본은 생성되지 않음
- 마스터노드와 데이터노드가 반드시 상호 배타적 관계는 아니다.
- 일반적으로 데이터노드는 외부접근을 차단
- 마스터 노드는 클러스터를 관리
- 인덱스를 추가 또는 삭제를 수행
- 도큐먼트 검색은 모든 노드에서 처리 가능하여, 마스터 노드가 병목되지는 않는다.
- 효율적인 스케일아웃을 위해 네트워크에 있는 다른 서버의 노드와도 바인딩
- 네트워크 바인딩을 위해 젠 디스커버리(ZEN DISCOVERY) 기능 내장
- 멀티캐스트와 유니캐스트 방식을 모두 지원
- 공식 운영 그룹에서는 유니캐스트의 사용을 권장
샤드는 데이터 검색을 위해 구분되는 최소 단위
색인된 데이터는 여러 개의 샤드로 분할되어 저장
기본적으로 인덱스당 5개의 샤드와 5개의 복사본으로 분리
개수 설정을 제외하면 사용자가 직접 샤드에 접근하는 경우는 없음
데이터가 색인되어 저장되는 공간을 최초 샤드(Primary Shard)라 칭함
최초 샤드에 데이터가 색인되면 동일한 수만큼 복사본을 생성
최초 샤드가 유실되는 경우 복사본을 최초 샤드로 승격
최초 샤드와 복사본을 동시 검색 대상이 되어 성능 향상에 이점이 있음
최초 샤드와 복사본은 서로 다른 노드에 저장
생성된 인덱스의 샤드 설정은 변경 불가능
엘라스틱서치는 해당 키워드가 어느 도큐먼트에 저장되었는지에 대해서 저장을 실시한다. 엘라스틱 서치의 자료구조를 살펴보면 가장 큰 개념이 인덱스이고, 그 안에 타입을 가지고 있으며 타입 안에는 여러 도큐먼트를 가지고 있다. 도큐먼트는 같은 프로퍼티를 가지고있다. 이를 관계형 데이터베이스의 내용과 매칭시킬 수 있다. 또한 엘라스틱서치에서는 REST API를 이용하여 데이터를 삽입, 삭제, 조회, 수정이 가능하다. curl 커맨드 명령을 통해서 관계형 데이터베이스의 구문과 같이 사용이 가능하다.
엘라스틱서치 개념 )
준실시간 (Near RealTime : NRT)
엘라스틱서치는 준 실시간 검색 플랫폼이다. 문서가 검색 가능하기까지 색인하는데 1초 이하의 아주 작은 시간이 걸린다는 것을 의미한다.
인덱스 (Index)
인덱스는 비슷한 형질을 가지는 문서 간의 집합이라고 보면 된다. 소문자로 구성된 이름으로 구분되며, 인덱스 이름은 문서에 대한 인덱싱/검색/갱신/삭제 등을 수행할 때 참조값으로 사용된다. 단일 클러스터에서 원하는 대로 다수의 인덱스를 정의할 수 있다.
타입 (Type)
인덱스 안에 1개 이상의 타입을 정의할 수 있다. 타입은 당신이 정의한 의미 기준으로 인덱스를 논리적으로 분류하는 혹은 파티션이다. 일반적으로 문서의 공통 속성들을 가지고 정의된다.
문서 (Document)
문서는 인덱싱된 정보의 기본 단위이다. 문서는 어디든 호환이 가능한 JSON으로 구성된다. 인덱스 타입과 함께 원하는 만큼의 문서를 저장할 수 있다. 문서는 물리적으로 인덱스에 있기는 하지만, 필히 인덱스 안에 있는 타입을 기준으로 인덱싱/할당 되어야 한다.
샤드 & 레플리카 (Shards & Replicas)
인덱스 자체로는 단일 노드의 하드웨어 한계를 초과하는 정보를 저장할 수 있어야 한다. 예로 백만개의 문서 인덱스는 아마 1TB 정도의 디스크 용량을 사용하고 단일 노드에 들어가지 않거나, 검색 요청을 처리하는데 많이 느릴 것이다. 이 문제를 해결하기 위해서 엘라스틱서치는 샤드라고 불리우는 수 많은 조각들을 인덱스로 나눌 수 있다. 인덱스를 만들 때 원하는 만큼의 샤드 개수를 정의할 수 있다. 샤드는 클러스터의 노드에 상주하고 있는 모든 기능을 할 수 있는 독립적인 인덱스라고 보면 된다.
샤드는 두 가지 중요 내용이 있다.
데이터 분량을 수평적으로 분할하거나 확장할 수 있다.
샤드별(노드별)로 분산/병렬 처리를 하여 성능/출력을 향상시킬 수 있다. 검색 요청을 처리하기 위하여 샤드를 어떻게 분산하고 다시 문서로 합치는지에 대한 과정은 전적으로 엘라스틱서치가 처리하기 때문에 고민하지 않아도 된다.
- 노드/샤드의 장애에 대응하는 고가용성(높은 사용성)을 제공하며, 이 이유로 복제본은 원본과 동일한 노드에 저장하지 않는 것이 매우 중요하다.
- 검색을 모든 레플리카에서 병렬적으로 처리하여 검색분량/결과를 확장할 수 있도록 한다.
결과적으로, 각각의 인덱스는 샤드로 나뉘어질 수 있다. 그리고 0개 이상의 레플리카를 가질 수 있다. 인덱스를 복제한다면, 가장 먼저 레플리카된 샤드와 레플리카로 구성될 것이다. 인덱스가 생성되는 시점에 샤드와 레플리카의 수를 정의할 수 있다. 인덱스가 생성된 뒤에는 레플리카의 수는 동적으로 변경이 가능하나 이후 샤드의 수는 수정이 불가능하다.
기본적으로 엘라스틱서치의 인덱스는 5개의 샤드로 구성되고 1개의 레플리카를 가지게 된다. 다시말해, 적어도 2개 이상의 노드를 구성하면 인덱스는 5개의 샤드와 5개의 레플리카 샤드로 구성되어 인덱스 당 총 10개의 샤드가 있을 것이다.
GET - SELECT : 조회
PUT - UPDATE : 수정
POST - INSERT : 삽입
DELETE - DELETE : 삭제
(1) 인덱스를 만드는데, 엘라스틱서치 내부에 인덱스가 있는지 여부를 확인한다. curl 커맨드로 rest api 를 호출할 것이다.
curl -XGET http://localhost:9200/classes (조회)
curl -XPUT http://localhost:9200/classes (수정)
curl -XGET http://localhost:9200/classes (조회)
curl -XDELETE http://localhost:9200/classes (삭제)
(2) ES (Elasticsearch vs RDBMS)
curl -XGET localhost:9200/classes/class/1
select * from class where id = 1
curl -XPOST localhost:9200/classes/class/1 -d '{xxx}'
insert into class values {xxx};
curl -XPUT localhost:9200/classes/class/1 -d '{xxx}'
update class set XXX where id = 1;
curl -XDELETE localhost:9200/classes/class/1
delete from class where id = 1
'데이터 사이언티스트' 카테고리의 다른 글
20180520 엘라스틱서치 : 노드 살펴보기 (0) | 2018.05.20 |
---|---|
20180518 ES 명령어 및 체크리스트 (0) | 2018.05.18 |
20180517 엘라스틱서치 : 루씬(Lucene) 이해 (0) | 2018.05.17 |
20180515 엘라스틱서치 : shards & replicas 이해 (0) | 2018.05.15 |
20180514 엘라스틱서치 : 특징 (및 스키마 설명) (0) | 2018.05.14 |