본문 바로가기
개발/ELK

[Elasticsearch] 클러스터 구축하기 - 2

by parkkingcar 2023. 8. 20.

 

앞서 작성한 '클러스터 구축하기 - 1'을 기반으로 직접 클러스터를 구축합니다. elasticsearch.yml와 jvm.options파일의 설정은 엘라스틱서치 8.9.1버전을 기준으로 작성하였습니다.

 

 기본 값으로 구성된 elasticsearch.yml을 다중 노드 클러스터로 구성하는 방법에 대해 다루겠습니다.

 

 

 

클러스터 사용하기

단일 노드로 운영 중인 엘라스틱서치를 3대의 마스터 노드와 3대의 데이터 노드로 바꾸는 과정을 예시로 합니다.

 

먼저 모든 설정이 주석 처리 되어있는 elasticsearch.yml을 수정하지 않고 실행할 경우 단일 노드로 환경설정이 구성됩니다. 이때 클러스터의 이름은 기본값인 elasticsearch로 설정되기 때문에 일단 클러스터의 이름은 elasticsearch로 설정하여 파일을 구성합니다.

 

 

단일 마스터 노드의 elasticsearch.yml

#cluster.name: elasticsearch
#node.name: ${HOSTNAME} 
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
#bootstrap.memory_lock: true
#network.bind_host: 0.0.0.0 
#network.publish_host: master-1.es.com 
#http.port: 9200
#discovery.zen.ping.unicast.hosts: ["host1", "host2"] 
#discovery.zen.minimum_master_nodes:  
#gateway.recover_after_nodes: 3
#action.destructive_requires_name: true

 

 

 

먼저 마스터 노드를 추가합니다. 기존 노드와 동일한 스펙의 master-2.es.com, master-3.es.com서버를 만들고 두 대에 각각 아래와 같이 elasticsearch.yml을 설정합니다.



 

새로 추가되는 마스터 노드의 elasticsearch.yml 예시

cluster.name: elasticsearch
node.name: ${HOSTNAME} ⓐ
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.bind_host: 0.0.0.0 ⓑ
network.publish_host: master-2.es.com ⓒ
http.port: 9200
http.cors.enabled: true ⓓ
http.cors.allow-origin: "*" ⓔ
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["master-1.es.com:9300", "master-2.es.com:9300", "master-3.es.com:9300"] ⓕ
discovery.zen.minimum_master_nodes: 2 ⓖ
gateway.recover_after_nodes: 3
action.destructive_requires_name: true
node.master: true ⓗ
node.data: false ⓘ

 

ⓐ 노드의 이름을 호스트명으로 설정합니다.

ⓑ 외부와의 통신을 위해 노드 내에 있는 모든 IP를 사용할 수 있도록 설정합니다.

ⓒ 노드가 클러스터 내에 있는 다른 노드들과 통신할 때 사용할 IP를 설정합니다.

ⓓ, ⓔ 모니터링 도구 중 하나인 Head를 사용할 수 있도록 CORS 설정을 합니다.

ⓕ 클러스터에 합류하기 위해 클러스터의 정보를 받아올 노드들을 지정합니다. 

ⓖ 최소 두 대 이상의 마스터 노드가 있어야 클러스터가 유지될 수 있도록 설정합니다.

ⓗ, ⓘ 가장 중요한 설정으로, 이 설정을 통해 해당 노드가 마스터 노드의 역할만 할 수 있게 됩니다.

 

 

위와 같이 파일을 작성하고 엘라스틱 어플리케이션을 실행시키면 두 대의 마스터 노드가 기존 단일 노드와 함께 클러스터를 구성합니다.

이제 클러스터의 노드는 마스터 노드 3대, 데이터 노드 한 대지만  한 대가 마스터 노드와 데이터 노드의 역할을 함께 할 수 있기 때문에 전체 노드 수는 3대가 되었습니다.

 

 

이제 데이터 노드를 3대로 늘려봅니다.

 

새로 추가되는 데이터 노드의 elasticsearch.yml 예시

cluster.name: elasticsearch
node.name: ${HOSTNAME} 
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.bind_host: 0.0.0.0 
network.publish_host: data-1.es.com 
http.port: 9200
http.cors.enabled: true 
http.cors.allow-origin: "*" 
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["master-1.es.com:9300", "master-2.es.com:9300", "master-3.es.com:9300"]
discovery.zen.minimum_master_nodes: 2 
gateway.recover_after_nodes: 3
action.destructive_requires_name: true
node.master: false ⓐ
node.data: true ⓑ

 

이전 설정과 비교해보면 다른 설정은 모두 동일하고 ⓐ, ⓑ의 설정만 다릅니다. 이 설정을 통해서 해당 노드는 마스터 노드의 역할은 하지 못하고 데이터 노드의 역할만 할 수 있습니다.

 

위와 같이 설정한 후 엘라스틱서치 프로세스를 시작하면 클러스터는 아래 그림과 같은 모습을 갖추게 됩니다.

 

이제 클러스터의 노드는 총 6대가 되었습니다. 이 중 마스터 노드는 3대, 데이터 노드는 4대 입니다. 이제 맨 처음 설정한 단일 노드를 마스터 전용 노드로 바꿔야 합니다.

 

 

단일 노드로 운영되던 장비의 elasticsearch.yml 수정

# master-1.es.com 장비 elasticsearch.yml 설정

cluster.name: elasticsearch
node.name: ${HOSTNAME} 
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.bind_host: 0.0.0.0 
network.publish_host: master-1.es.com 
http.port: 9200
http.cors.enabled: true 
http.cors.allow-origin: "*" 
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["master-1.es.com:9300", "master-2.es.com:9300", "master-3.es.com:9300"] ⓐ 
discovery.zen.minimum_master_nodes: 2 ⓑ
gateway.recover_after_nodes: 3
action.destructive_requires_name: true
node.master: true
node.data: false ⓒ

 

위와 같이 설정하면 ⓐ를 통해 프로세스가 내려갔다 올라가도 동일한 클러스터에 합류할 수 있게 되고, ⓑ를 통해 두 대 이상의 마스터 노드가 있을 때만 클러스터를 유지할 수 있게 됩니다. ⓒ를 통해 데이터 노드로서의 역할은 하지 않습니다.

 

따라서 위 설정을 최초의 마스터 노드에 적용하고 엘라스틱서치 어플리케이션을 재시작하면 최초 마스터 노드가 가지고 있던 사용자의 데이터가 앞서 추가한 데이터 노드들로 이동합니다. 최종적으로 클러스터는 아래와 같은 모습을 합니다.

 

위 사진과 같은 형태의 구성에서는 클러스터의 색인량이 많아져서 저장해야 할 데이터가 늘어난다거나 색인, 검색 성능을 더 높이기 위해 노드의 증설이 필요할 경우 데이터 노드만 증설해 주면 된다는 장점이 있습니다.

 

 

 

 

 

 

참고자료

 

Configuring Elasticsearch | Elasticsearch Guide [8.9] | Elastic

We no longer recommend using transient cluster settings. Use persistent cluster settings instead. If a cluster becomes unstable, transient settings can clear unexpectedly, resulting in a potentially undesired cluster configuration. See the Transient settin

www.elastic.co

 

 

이 글은 '기초부터 다지는 ElasticSearch 운영 노하우 - 박상헌, 강진우'를 기반으로 작성하였습니다.

 

 

 

댓글