[Elasticsearch] 클러스터 구성
클러스터 구성은 Elasticsearch 2.4.6 기준으로 작성한다.
https://www.elastic.co/downloads/past-releases 페이지에서 Elasticsearch 2.4.6 버전을 다운로드 받는다. (tar 파일)
검색 필터를 이용해서 원하는 제품과 버전을 빠르게 찾을 수 있다.
다운로드 받은 tar파일을 압축해제 하면 설치 끝이다.
Elasticsearch 서비스를 구동하려면 /bin/elasticsearch 를 실행하면 된다.
백그라운드 실행할 때에는 /bin/elasticsearch & 와 같이 하도록 하자.
구성은 한 장비에 3개의 Elasticsearch node를 실행할 것이다.
master node : nklee-data-node1
data node : nklee-data-node2
data node : nklee-data-node3
마스터 노드
클러스터를 유지하기 위한 역할을 하고 인덱싱이나 검색 요청을 데이터 노드들에 요청.
데이터 노드
마스터 역할을 수행하지 않고, 데이터만 저장. 클라이언트로부터의 요청이 왔을 때 샤드에서 데이터를 검색하거나 인덱스를 생성.
검색 노드
검색 요청이 오면 노드들에 데이터를 요청 후 취합해 결과를 전달.
노드 구성을 위해 /config/elasticsearch.yml을 수정하자.
[master node]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | cluster.name: nklee-data-cluster node.name: nklee-data-node1 node.master: true node.data: false index.number_of_shards: 5 index.number_of_replicas: 1 network.host: 0.0.0.0 transport.tcp.port: 9300 transport.tcp.compress: true http.port: 9200 http.enabled: true discovery.zen.minimum_master_nodes: 1 discovery.zen.ping.timeout: 10s discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] | cs |
[data node1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | cluster.name: nklee-data-cluster node.name: nklee-data-node2 node.master: false node.data: true index.number_of_shards: 5 index.number_of_replicas: 1 network.host: 0.0.0.0 transport.tcp.port: 9301 transport.tcp.compress: true http.port: 9201 http.enabled: true discovery.zen.minimum_master_nodes: 1 discovery.zen.ping.timeout: 10s discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] | cs |
[data node2]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | cluster.name: nklee-data-cluster node.name: nklee-data-node3 node.master: false node.data: true index.number_of_shards: 5 index.number_of_replicas: 1 network.host: 0.0.0.0 transport.tcp.port: 9302 transport.tcp.compress: true http.port: 9202 http.enabled: true discovery.zen.minimum_master_nodes: 1 discovery.zen.ping.timeout: 10s discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] | cs |
같은 네트웍에 ES 클러스터가 여러 개 구축되어 있으면 예기치 못한 결과와 오류를 만날 수 있으니 elasticsearch.yml 파일의 cluster-name을 유니크하게 생성해야 한다.
discovery.zen.ping.unicast.hosts 에 명시적으로 클러스터에 참가하는 ip와 포트를 정의해 주는 것 또한 안전한 방법이다.
설정이 완료되고 모든 Elasticsearch를 구동하자.
매번 bin/elasticsearch 실행하는 것이 귀찮아 shell script를 작성했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash RED='\033[0;31m' GREEN='\033[0;32m' NC='\033[0m' # No Color ps -ef | grep elasticsearch | grep -v grep | awk '{print $2}' | xargs kill printf "Stoped Elasticsearch process....${GREEN}OK${NC}\n" { /test/es/elasticsearch-1/bin/elasticsearch & /test/es/elasticsearch-2/bin/elasticsearch & /test/es/elasticsearch-3/bin/elasticsearch & } &> /dev/null printf "Starting Elasticsearch process....${GREEN}OK${NC}\n" | cs |
Elasticsearch를 구동하면 다음과 같은 로그들을 확인할 수 있다.
버전 확인
1 | [node] [War Machine] version[2.4.6], pid[3456], build[5376dca/2017-07-18T12:17:44Z] | cs |
플러그인 로드
1 | [plugins] [War Machine] modules [lang-groovy, reindex, lang-expression], plugins [head], sites [head] | cs |
9300 포트는 노드끼리의 통신 포트
1 | [transport] [War Machine] publish_address {127.0.0.1:9300}, bound_addresses {[::]:9300} | cs |
9200 포트는 HTTP에서 사용
1 | [http] [War Machine] publish_address {127.0.0.1:9200}, bound_addresses {[::]:9200} | cs |
디스크에 저장되어 있는 index를 복원 (2개의 index가 존재)
1 | [gateway] [War Machine] recovered [2] indices into cluster_state | cs |
구동이 완료되면 다음의 URL에서 클러스터의 상태를 확인할 수 있다.
http://127.0.0.1:9200/_cluster/health?pretty=true
이제 Elasticsearch 클러스터에는 3대의 노드가 운영중이다.
다양한 테스트를 해보자.
1. nklee-data-node3 노드를 종료해보자.
nklee-data-node3 이 제거되었다는 메세지가 출력된다.
nklee-data-node1번 노드에 출력되는 로그
1 2 | [2017-11-30 09:26:28,106][INFO ][cluster.service ] [nklee-data-node1] removed {{nklee-data-node3}{VGDm2GC1SzOcDl47kgbIcQ}{172.20.50.26}{172.2 0.50.26:9302},}, reason: zen-disco-node-left({nklee-data-node3}{VGDm2GC1SzOcDl47kgbIcQ}{172.20.50.26}{172.20.50.26:9302}), reason(left) | cs |
nklee-data-node2번 노드에 출력되는 로그
1 2 3 | [2017-11-30 09:26:28,126][INFO ][cluster.service ] [nklee-data-node2] removed {{nklee-data-node3}{VGDm2GC1SzOcDl47kgbIcQ}{172.20.50.26}{172.2 0.50.26:9302},}, reason: zen-disco-receive(from master [{nklee-data-node1}{Iri6Al-nQnqPgdWiRNw54Q}{172.20.50.26}{172.20.50.26:9300}{data=false, master =true}]) | cs |
2. nklee-data-node3 노드를 다시 구동하자.
nklee-data-node3가 추가되었다는 메세지가 출력된다.
nklee-data-node1번 노드에 출력되는 로그
1 2 | [2017-11-30 09:33:19,441][INFO ][cluster.service ] [nklee-data-node1] added {{nklee-data-node3}{j75XcEk8RSuDK9XhdZPVgg}{172.20.50.26}{172.20. 50.26:9302},}, reason: zen-disco-join(join from node[{nklee-data-node3}{j75XcEk8RSuDK9XhdZPVgg}{172.20.50.26}{172.20.50.26:9302}]) | cs |
nklee-data-node2번 노드에 출력되는 로그
1 2 3 | [2017-11-30 09:33:19,444][INFO ][cluster.service ] [nklee-data-node2] added {{nklee-data-node3}{j75XcEk8RSuDK9XhdZPVgg}{172.20.50.26}{172.20. 50.26:9302},}, reason: zen-disco-receive(from master [{nklee-data-node1}{Iri6Al-nQnqPgdWiRNw54Q}{172.20.50.26}{172.20.50.26:9300}{data=false, master=t rue}]) | cs |
3. nklee-data-node1 마스터 노드를 종료해보자.
다음과 같은 오류가 발생하며 cluster가 동작 불능 상태가 된다.
1 2 3 | [2017-11-30 09:41:57,247][DEBUG][action.admin.cluster.health] [nklee-data-node2] no known master node, scheduling a retry [2017-11-30 09:41:58,727][DEBUG][action.admin.cluster.state] [nklee-data-node2] no known master node, scheduling a retry [2017-11-30 09:41:58,730][DEBUG][action.admin.cluster.health] [nklee-data-node2] no known master node, scheduling a retry | cs |
클러스터의 상태를 확인하는 http://127.0.0.1:9200/_cluster/health?pretty=true 호출해보면 다음과 같이 리턴된다.
4. 데이터 노드를 마스터 노드로 승격시키기 위한 방법
데이터 노드가 마스터 노드로 승격되려면 다음의 설정이 제거되어야 한다.
1 2 | node.master: false node.data: true | cs |
nklee-data-node2 의 elasticsearch.yml 에서 위의 옵션을 제거 후 재시작하자.
자~ 이제 마스터 노드를 종료하면 어떻게 될 것인가?
nklee-data-node2 가 new_master가 되었다는 메세지가 출력된다.
1 2 | [2017-11-30 10:27:14,369][INFO ][cluster.service ] [nklee-data-node2] new_master {nklee-data-node2}{w0gsyuozRIKzmUDuJbgIKw}{172.20.50.26}{172 .20.50.26:9301}, reason: zen-disco-join(elected_as_master, [0] joins received) | cs |
'서버' 카테고리의 다른 글
[Elasticsearch] Query 검색 결과 구조 (0) | 2017.12.06 |
---|---|
[Elasticsearch] 한번 정해진 mapping 속성은 변경 불가 (0) | 2017.12.05 |
[Elasticsearch] index 매핑 (analyzed, not_analyzed, no) (0) | 2017.12.01 |
[Elasticsearch] 모니터링 툴 (0) | 2017.11.30 |
[Elasticsearch] 용어 정리 (0) | 2017.11.29 |
Apache2 설치 (Ubuntu 16.04) (0) | 2017.09.15 |
[ElasticSearch] 윈도우 설치 및 기본 동작 이해 (4) | 2017.08.31 |
EFK Stack 구축 using Docker compose (0) | 2017.08.24 |