elasticsearch는 분산 검색엔진입니다. 분산 시스템이기 때문에 검색 대상 용량이 증가했을 때 대처하기가 매우 쉽다.
elasticsearch에 대해서 알아보기 전에 elasticsearch가 나온지 꽤 된 저장소이다. 과연 얼마나 최근에 업데이트가 되었는지 github에서 살펴보았는데 최근 커밋 내역이 2분전이다... ㅋㅋㅋㅋ(죄송합니다.)
해당 포스트에서는 0.20 버전을 사용하지만 현재 5.x버전까지 나왔습니다
관계형 데이터베이스 VS elasticsearch 비교
관계형 데이터베이스
|
elasticsearch
|
Database
|
Index
|
Table
|
Type
|
Row
|
Document
|
Column
|
Field
|
Schema
|
Mapping
|
Index
|
Everything is indexed
|
SQL
|
Query DSL
|
index라는 개념이 관계형에서의 개념이 잡혀있어서 문서에서 index라고 나올 때마다 Database로 딱 안 떠오른다 ㅋㅋ
elasticsearch의 특징은 다음과 같다.
JSON 기반의 스키마 없는 저장소
elasticsearch는 검색엔진이지만 NoSQL처럼 사용가능
Multi-tenancy
하나의 서버안에 여러 인덱스 저장가능. 여러 인덱스의 데이터를 하나의 쿼리로 검색 가능
확장성과 유연성
플러그인을 이용해 기능확장이 용이함. BigDesk, Head를 설치하면 elasticsearch 모니터링 기능을 사용할 수 있게 된다.(직접 사용해보니 플러그인을 설치하는 것이 상당히 쉬움)
분산 저장소
노드 추가의 용이함. 키에 따라 여러 샤드가 구성되는 방식으로 데이터를 분산.인덱스는 각 샤드마다 구성, 각 샤드는 0개 이상의 복제본을 가진다.클러스터가 가동될 때 여러 노드 중 하나의 메타데이터 관리를 위한 마스터 노드로 선출.
elasticsearch 설치하기
다운로드
$ wget http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.4.tar.gz
$ tar xvzf elasticsearch-0.20.4.tar.gz
서버실행
$ cd elasticsearch-0.20.4
$ bin/elasticsearch -f
[2017-05-04 19:07:47,897][INFO ][node ] [Whizzer] {0.20.4}[10109]: initializing ...
[2017-05-04 19:07:47,915][INFO ][plugins ] [Whizzer] loaded [jetty, transport-thrift], sites [bigdesk]
[2017-05-04 19:07:54,662][INFO ][node ] [Whizzer] {0.20.4}[10109]: initialized
[2017-05-04 19:07:54,662][INFO ][node ] [Whizzer] {0.20.4}[10109]: starting ...
[2017-05-04 19:07:54,684][INFO ][thrift ] [Whizzer] bound on port [9500]
[2017-05-04 19:07:54,759][INFO ][transport ] [Whizzer] bound_address {inet[/0:0:0:0:0:0:0:0:9301]}, publish_address {inet[/192.168.1.88:9301]}
[2017-05-04 19:07:57,824][INFO ][cluster.service ] [Whizzer] detected_master [Mary Walker][c-B02SPPQ3im2fuwR6m7kQ][inet[/192.168.1.88:9300]], added {[Mary Walker][c-B02SPPQ3im2fuwR6m7kQ][inet[/192.168.1.88:9300]],}, reason: zen-disco-receive(from master [[Mary Walker][c-B02SPPQ3im2fuwR6m7kQ][inet[/192.168.1.88:9300]]])
[2017-05-04 19:07:57,857][INFO ][discovery ] [Whizzer] elasticsearch/vFZb7vcRRE6_NhwilTlF5Q
[2017-05-04 19:07:57,863][INFO ][http ] [Whizzer] bound_address {inet[/0:0:0:0:0:0:0:0:9201]}, publish_address {inet[/192.168.1.88:9201]}
[2017-05-04 19:07:57,864][INFO ][node ] [Whizzer] {0.20.4}[10109]: started
elasticsearch의 기본 포트는 9200입니다.
플러그인 설치하기
bin/plugin -install Aconex/elasticsearch-head
bin/plugin -install lukas-vlcek/bigdesk
bin/plugin -install elasticsearch/elasticsearch-transport-thrift/1.4.0
bin/plugin -url https://oss-es-plugins.s3.amazonaws.com/elasticsearch-jetty/elasticsearch-jetty-0.20.1.zip -install elasticsearch-jetty-0.20.1
bin/plugin을 이용하여 쉽게 플러그인을 설치할 수 있다.
첫 번째와 두 번째 줄에서 보이는 head와 bigdesk 플러그인은 모니터링을 위한 필수 플러그인이다. 설치 후 http://localhost:9200/_plugin/head/ 와 http://localhost:9200/_plugin/bigdesk/로 접속하면 웹 브라우저를 이용해 상태를 확인해 볼 수 있다.
첫 번째와 두 번째 줄에서 보이는 head와 bigdesk 플러그인은 모니터링을 위한 필수 플러그인이다. 설치 후 http://localhost:9200/_plugin/head/ 와 http://localhost:9200/_plugin/bigdesk/로 접속하면 웹 브라우저를 이용해 상태를 확인해 볼 수 있다.
설정변경
간단한 테스트에는 설정 변경이 필요 없으나, 성능 테스트, 실서비스에 적용할 때에는 몇가지 변경이 필요하다고 한다.
# 클러스터를 식별하기 위한 이름이므로 유일성과 의미를 가진 이름을 사용하자
cluster.name: es-cluster
# 노드 이름은 자동으로 생성되지만 호스트명과 같이 클러스터 내에서 식별 가능한 이름을 활용하는 것이 좋다.
node.name: "es-node1"
# 기본값은 아래 두 값이 모두 true다. node.master는 노드가 마스터가 될 수 있지에 대한 설정이고, node.data는 데이터를 저장하는 노드인지에 대한 설정이다. 보통은 두 값을 true로 설정하면 되고, 클러스터의 규모가 큰 경우에는 3가지 종류의 노드를 구성하기 위해 이 값을 노드별로 조정해 설정한다. 자세한 사항은 토폴로지(topology) 설정에서 다시 설명하겠다.
node.master: true
node.data: true
# 샤드와 리플리카 수를 변경하는 설정이다. 아래 값은 기본값이다.
index.number_of_shards: 5
index.number_of_replicas: 1
#JVM의 스왑을 방지하려면 아래 설정 값을 true로 한다.
bootstrap.mlockall: true
# 클러스터 내의 각 노드의 상태 체크를 위한 타임아웃 값으로, 너무 작게 하면 노드가 클러스터에서 자주 이탈하는 문제가 발생할 수 있어 적절한 값을 설정한다. 기본값은 3초다.
discovery.zen.ping.timeout: 10s
# 기본값은 멀티캐스트를 사용하지만, 실환경에서는 다른 클러스터와 노드가 섞이는 위험이 발생할 수 있으므로 유니캐스트를 사용하고 두 번째 설정 값에 마스터가 될 수 있는 서버들의 목록을 나열하는 것이 좋다.
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]
설정파일은 config/elasticsearch.yml에 작성되어 있다.
기본적으로 설정파일은 전부 주석 처리가 걸려있다.해당 설정값을 위 설정값과 하나하나 비교를 해보았는데node.master: true이 부분이랑 클러스터이름, 노드 이름, discovery.zen.ping.timeout: 10s 부분빼고는 나머지는 전부 똑같다.
node.master:true값에 따라사 기존의 마스터 노드가 죽었을 때 마스터 노드가 될 수 있는 자격에 대한 설정인 것 같다.
아마 elasticsearch를 설치하고 디렉토리를 보면 전체적으로 한눈에 들어올 것이다. 매우 직관적으로 잘 만들어졌다.
개인적으로 접근성은 괜찮은 것 같다.
다음번 포스팅에서는 REST API와 python을 이용하여 elasticsearch를 사용하는 방법에 대해서 알아보도록 하겠습니다.
기본적으로 설정파일은 전부 주석 처리가 걸려있다.해당 설정값을 위 설정값과 하나하나 비교를 해보았는데node.master: true이 부분이랑 클러스터이름, 노드 이름, discovery.zen.ping.timeout: 10s 부분빼고는 나머지는 전부 똑같다.
node.master:true값에 따라사 기존의 마스터 노드가 죽었을 때 마스터 노드가 될 수 있는 자격에 대한 설정인 것 같다.
아마 elasticsearch를 설치하고 디렉토리를 보면 전체적으로 한눈에 들어올 것이다. 매우 직관적으로 잘 만들어졌다.
개인적으로 접근성은 괜찮은 것 같다.
다음번 포스팅에서는 REST API와 python을 이용하여 elasticsearch를 사용하는 방법에 대해서 알아보도록 하겠습니다.
댓글
댓글 쓰기