[Elasticsearch] 클러스터 구성

서버|2017. 11. 30. 09:14

클러스터 구성은 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




댓글()