Elasticsearch 설치

dhjung 기술 블로그·2021년 4월 5일
1

Elasticsearch

목록 보기
4/5

1. Elasticsearch 구성환경

이제 엘라스틱서치를 설치하겠습니다.
저는 엘라스틱서치를 총 3개의 노드로 설치할 예정입니다.
Master Node 1개, Data Node 2개를 설치하겠습니다.
설치하는 방법은 동일하며 노드 역할에 따라 환경설정부분이 다릅니다.
설치과정까지는 동일하게 진행하겠습니다.
서버환경은 Centos7, memory 32GB입니다.

정상적으로 설치가 완료되면 아래 그림과 같이 노드들이 연결됩니다.

2. Elasticsearch 설치

엘라스틱서치 설치를 진행 하겠습니다.
예전 엘라스틱서치에서는 설치하는 로컬서버에 jdk가 설치되어 있어야 실행 가능했습니다.
하지만 최신버전(언제부터 도입되었는지는 모르겠습니다..)에서는 openjdk가 내장되어 있기 때문에 설치를 할 필요는 없습니다.

저는 rpm으로 elasticsearch를 설치하는 과정을 보여드리겠습니다.
도커 또는 tar 파일로 설치하거나 다른 OS의 경우 Elasticsearch 공식 홈페이지 가이드를 따라주세요.

Elasticsearch 공식 가이드
https://www.elastic.co/guide/en/elasticsearch/reference/7.12/install-elasticsearch.html

1) GPG Key import

설치하기 전 샤이닝키를 다운받고 설치합니다.

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

2) repo 파일 생성

이제 /etc/yum.repos.d 경로에 elasticsearch.repo 파일을 생성합니다.
elasticsearch.repo 파일에 다음과 같이 복붙을 합니다.

[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

이후 yum으로 엘라스틱서치를 설치합니다.

sudo yum install --enablerepo=elasticsearch elasticsearch

다음과 같이 설치하게 되면 현시점으로 가장 최신버전인 7.12 버전이 설치됩니다.
그 이전의 버전이나 특정 버전을 설치하고 싶으시다면 elasticsearch.repo파일에서 7.x 부분을 특정 버전으로 변경해주세요.

설치가 완료되면 별도의 설정없이 바로 엘라스틱서치를 실행하여 제대로 설치되었는지 확인합니다.

[root@esmaster yum.repos.d]# service elasticsearch start
Starting elasticsearch (via systemctl):                    [  OK  ]

정상적으로 서비스가 실행된 것을 확인하였다면 서비스를 중단합니다.

[root@esmaster yum.repos.d]# service elasticsearch stop
Stopping elasticsearch (via systemctl):                    [  OK  ]

Elasticsearch 설치 ISSUE
CentOS6 또는 낮은 버전의 OS에서 엘라스틱서치 7.9 이상을 설치 후 실행시 에러가 발생할 수 있습니다.
7.9 버전은 JDK15가 내장되어 있는데 JDK15는 glibc 2.14버전이 필요합니다.
하지만 CentOS6의 glibc 버전은 2.12이므로 충돌이 발생하게 됩니다.
이럴경우 glibc버전을 업그레이드를 하거나 Elasticsearch에서 사용하는 jdk를 로컬 jdk로 설정합니다.
자세한 내용은 Elastic 공식홈페이지를 참고하세요.
https://www.elastic.co/kr/blog/elastic-stack-7-9-2-released
아래 사이트는 Elasticsearch 버전별 지원가능한 jdk 버전 테이블표입니다.
https://www.elastic.co/kr/support/matrix#matrix_jvm

3. Elasticsearch 설정

RPM 버전의 기본적인 설치 경로입니다.

  • 기본 프로그램($ES_HOME) : /usr/share/elasticsearch
    • 실행 파일 : bin/elasticsearch
    • jdk : jdk/bin/java
    • 플러그인 : plugins
  • 설정 : /etc/elasticsearch
    • elasticsearch.yml
    • jvm.options
    • log4j2.properties
  • 데이터 : /var/lib/elasticsearch
  • 로그 : /var/log/elasticsearch

1) 공통 설정

Master Node, Data Node 공통 설정 부분입니다.

먼저 Java Heap 메모리를 설정합니다.
/etc/elasticsearch/jvm.options 파일을 편집합니다.

엘라스틱서치 샤드는 내부에 루씬을 가지고 있으며 루씬은 세그먼트 생성 및 관리를 위해 커널 시스템 캐시를 최대한 활용합니다. 시스템 캐시는 운영체제가 가지고 있는 메모리 공간으로 커널 내부에 존재합니다.
그러므로 물리적인 메모리 공간의 50%정도는 운영체제가 자유롭게 사용하도록 할당하고 나머지 50%정도를 엘라스틱서치 힙으로 할당하는 것이 좋습니다.
따라서 제가 설치할 서버의 메모리는 32GB이기 때문에 저는 16GB로 힙메모리를 설정하였습니다.

################################################################
## IMPORTANT: JVM heap size
################################################################
##
## The heap size is automatically configured by Elasticsearch
## based on the available memory in your system and the roles
## each node is configured to fulfill. If specifying heap is
## required, it should be done through a file in jvm.options.d,
## and the min and max should be set to the same value. For
## example, to set the heap to 4 GB, create a new file in the
## jvm.options.d directory containing these lines:
##
-Xms16g
-Xmx16g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################

Elasticsearch HeapMemory 관련 참고사이트
https://icarus8050.tistory.com/53

2) Master Node

마스터노드 서버에서
/etc/elasticsearch/elasticsearch.yml을 편집합니다.

cluster name을 지정합니다.

# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: estest
#

저는 test 서버로 만드는 중이기에 estest로 지칭하였습니다.
여기서 클러스터 네임은 연결한 노드들과 같은 명칭을 사용하여야 합니다.
다른 명칭을 사용할 경우 독립적인 클러스터로 인식하게 됩니다.

다음으로 Node를 설정합니다.

# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: ${HOSTNAME}
node.roles: [ master ]
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#

node.name은 실행하는 노드의 이름을 지정합니다. 주로 서버의 hostname을 사용합니다.
node.roles는 node의 역할을 부여합니다. master 권한을 부여합니다.

최근 엘라스틱서치의 datanode가 다양화되면서 노드 설정방법이 바뀌었습니다.
예전 설정으로는
node.master: true/false
node.data: true/false
가 존재하였지만 현재 node.roles로 지정하도록 바뀌었습니다.
(최근 버전에서 node.master, node.data 설정이 되는지는 잘 모르겠습니다.)

다음은 Network를 설정합니다.

# ---------------------------------- Network -----------------------------------
#
# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
network.host: _site_
#
# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:
#
#http.port: 9200
#
# For more information, consult the network module documentation.
#

network.host는 엘라스틱서치에 접근할 네트워크 광역대를 설정하는 부분입니다.
특정 아이피를 입력할 수 있지만 흔히 3가지 방법으로 설정합니다.

  • _local_ : 127.0.0.1를 의미합니다.
  • _site_ : 192.168.0.1를 의미합니다.
  • _global_ : 8.8.8.8를 의미합니다.

마지막으로 Discovery를 설정합니다.

# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.seed_hosts: ["192.168.16.152", "192.168.16.153", "192.168.16.154"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["esmaster"]
#
# For more information, consult the discovery and cluster formation module documentation.

discovery.sedd.hosts에는 클러스터 구성을 위해 바인딩할 원격 노드의 IP 또는 도메인 주소를 배열 형태로 입력합니다. 주소만 적는 경우 포트는 디폴트로 9300 ~ 9305를 검색합니다. 이외의 포트를 설정할 경우에는 포트도 같이 명시해줍니다.
노드끼리 통신하기 위해 각 서버마다 9300 포트를 열어주어야 합니다.

iptables -I INPUT 1 -p tcp --dport 9300 -j ACCEPT

cluster.initial_master_nodes는 클러스터가 최초로 실행될 때 명시된 노드들을 대상으로 마스터 노드를 선출합니다.

3) Data Node

마스터노드 서버에서
/etc/elasticsearch/elasticsearch.yml을 편집합니다.

cluster name을 지정합니다.

# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: estest
#

마스터노드에서 설정한 cluster.name과 동일해야합니다.

다음으로 Node를 설정합니다.

# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: ${HOSTNAME}
node.roles: [ data ]
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#

node.name은 실행하는 노드의 이름을 지정합니다. 주로 서버의 hostname을 사용합니다.
node.roles는 node의 역할을 부여합니다. data 권한을 부여합니다.

Network와 Discovery는 Master 노드와 동일하게 설정합니다.

# ---------------------------------- Network -----------------------------------
#
# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
network.host: _site_
#
# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:
#
#http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.seed_hosts: ["192.168.16.152", "192.168.16.153", "192.168.16.154"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["esmaster"]
#
# For more information, consult the discovery and cluster formation module documentation.

3. Elasticsearch 실행

이제 각 노드들의 elasticsearch를 실행하고 노드들이 연결되었는지 확인합니다.

엘라스틱서치를 실행하는 명령어는 다음과 같습니다.

Centos 7 이전 버전 : service elasticsearch start
Centos 7 이후 버전 : systemctl start elasitcsearch

각 노드들의 elasitcsearch가 정상적으로 실행이 되었다면 이제 노드들이 연결되었는지 확인합니다.

[root@esmaster ~]# curl esmaster:9200/_cat/nodes
192.168.16.108 1 54  1 0.00 0.05 0.09 m           * esmaster
192.168.16.110 4 56  2 0.04 0.29 0.21 cdfhilmrstw - esdata2
192.168.16.109 3 56 56 1.83 0.99 0.61 d           - esdata1

curl로 elasticsearch서버 ip/hostname:port/_cat/nodes를 실행하면 연결된 노드들을 확인할 수 있습니다.

profile
빅데이터, 데이터 엔지니어

0개의 댓글