Install ElasticSearch in AWS EC2 Redhat

lightcat·2022년 9월 9일
0

AWS EC2 인스턴스에 ElasticSearch를 설치해보겠습니다.

설치할 ElasticSearch 버전은 8.4.1 입니다.

JDK 설치

일반사용자인 ec2-user 로는 yum 명령어는 먹히지 않으므로, sudo를 사용해야 합니다.

$ yum install -y java-1.8.0-openjdk-devel.x86_64
root가 아닙니다. 서브스크립션 관리 레포지터리가 업데이트되지 않습니다

이 시스템은 Red Hat 관리서버에 등록되어 있지 않습니다. subscription-manager를 사용하여 등록 할 수 있습니다.

오류: 이 명령은 슈퍼유저 권한으로 실행해야합니다 (대부분의 시스템에서 root 사용자로 실행).

sudo yum 을 사용하여 JDK를 설치합니다.

$ sudo yum install -y java-1.8.0-openjdk-devel.x86_64
서브스크립션 관리 레포지터리를 업데이트하고 있습니다.
소비자 ID를 읽을 수 없습니다

이 시스템은 Red Hat 관리서버에 등록되어 있지 않습니다. subscription-manager를 사용하여 등록 할 수 있습니다.

마지막 메타자료 만료확인 6:14:38 이전인: 2022년 09월 09일 () 오전 07시 2931초.
종속성이 해결되었습니다.
==================================================================================================================================================
 꾸러미                                 구조              버전                                        레포지터리                             크기
==================================================================================================================================================
설치 중:
 java-1.8.0-openjdk-devel               x86_64            1:1.8.0.342.b07-2.el8_6                     rhel-8-appstream-rhui-rpms            9.8 M
종속 꾸러미 설치 중:
 alsa-lib                               x86_64            1.2.6.1-3.el8                               rhel-8-appstream-rhui-rpms            491 k
 atk                                    x86_64            2.28.1-1.el8                                rhel-8-appstream-rhui-rpms            272 k
 avahi-libs                             x86_64            0.7-20.el8                                  rhel-8-baseos-rhui-rpms                62 k
 cairo                                  x86_64            1.15.12-6.el8                               rhel-8-appstream-rhui-rpms            719 k

Java 가 제대로 설치되었는지 확인하기 위해 Java version을 확인합니다.

$ java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)

ElasticSearch 설치

GPG-KEY 다운

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

ES Repository 설정 등록

$ cd /etc/yum.repos.d
$ sudo vi elasticsearch.repo
# 아래 내용을 elasticsearch.repo에 입력하고 저장합니다.
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

GPG-KEY를 미리 rpm으로 import 하지 않고, elasticsearch.repo만 설정하여 진행하는 블로그 포스트도 있었는데, 거기에는 enabled 값이 1로 되어 있었습니다. enabled 값이 어떤 의미인지는 조금 더 검색해보아야할 듯 합니다.


ES 설치 명령

$ sudo yum install --enablerepo=elasticsearch elasticsearch
Elasticsearch repository for 8.x packages                                                                          10 MB/s |  16 MB     00:01    
마지막 메타자료 만료확인 0:00:04 이전인: 2022년 09월 09일 () 오후 02시 09분 10초.
종속성이 해결되었습니다.
==================================================================================================================================================
 꾸러미                                구조                           버전                            레포지터리                             크기
==================================================================================================================================================
설치 중:
 elasticsearch                         x86_64                         8.4.1-1                         elasticsearch                         540 M

(생략)

--------------------------- Security autoconfiguration information ------------------------------

Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.

The generated password for the elastic built-in superuser is : xx

If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.

You can complete the following actions at any time:

Reset the password of the elastic built-in superuser with 
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.

Generate an enrollment token for Kibana instances with 
 '/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.

Generate an enrollment token for Elasticsearch nodes with 
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.

-------------------------------------------------------------------------------------------------
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service

[/usr/lib/tmpfiles.d/elasticsearch.conf:1] Line references path below legacy directory /var/run/, updating /var/run/elasticsearch → /run/elasticsearch; please update the tmpfiles.d/ drop-in file accordingly.

  확인 중           : elasticsearch-8.4.1-1.x86_64                                                                                            1/1 
설치된 제품이 최신화되었습니다.

설치되었습니다:
  elasticsearch-8.4.1-1.x86_64                                                                      
  
완료되었습니다!

설치를 하게되면 기본 사용자인 elastic 에 대해 password를 제공하며, password reset 방법 및 토큰 생성 방법 등을 알려주고, elasticsearch 서비스를 어떻게 실행해야하는지도 알려줍니다.


알려준 명령어를 따라서 서비스를 실행해봅니다. 역시 계정권한 문제로 sudo를 사용하여 실행합니다.

$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch.service
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.
$ sudo systemctl start elasticsearch.service
Job for elasticsearch.service failed because a timeout was exceeded.
See "systemctl status elasticsearch.service" and "journalctl -xe" for details.

elasticsearch 서비스 실행에 실패하였네요.
systemctl status elasticsearch.service 로 상태를 보려했으나, 자세한 에러로그는 나오지 않고 위에서 나온것과 비슷한 timeout 메세지가 뜨네요. 실제 elasticsearch 기동로그를 확인해봅니다.


우선 로그가 있는/var/log/elasticsearch 폴더를 현재 계정권한으로 들어가지 못하므로 root 권한 접속을 위해 root 비밀번호를 변경합니다.

$ sudo passwd root
root 사용자의 비밀 번호 변경 중
새  암호:
잘못된 암호: 암호는 8 개의 문자 보다 짧습니다
새  암호 재입력:
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.

su - 또는 su root 명령어를 통해 root 사용자 계정으로 접속한 다음, 에러로그를 보기 위해 로그파일을 열어 확인해봅니다.

$ vi /var/log/elasticsearch/elasticsearch.log

기동로그 확인 결과, jvm.options 메모리 설정을 하지 않고 기동을 하였는데, Heap size가 320mb를 잡고 있는것을 확인하였고 기동하다가 갑자기 stop명령이 떨어지는 부분을 확인하였습니다.

조금 더 메모리를 많이 잡아주면 기동이 될까 싶어 etc/elasticsearch/jvm.options.d/jvm.options 파일에

-Xms400m
-Xmx400m

와 같이 메모리 설정을 높게 잡고 다시 재기동을 해보았는데요.

음... 그랬더니 아예 인스턴스가 맛이 가버리네요..


t2.micro의 인스턴스가 표기상 1GB 메모리를 가지고, 실제로는 800mb 언저리를 가지고 있습니다.
500mb 여유메모리가 있던 상황이었는데, 400mb정도를 elasticsearch 기동하는데 써버리니, 인스턴스가 갑자기 멈춰 그다음에는 재부팅을 해도 접속 자체가 엄청 느리거나 접속이 안되는 수준입니다.

작업을 멈추고 좀 더 검색해본 바에 의하면 ElasticSearch를 실행시키기 위한 힙의 최소 크기가 1G라고 합니다.

t2.micro로는 아무래도 ElasticSearch와 Kibana를 동시에 실행시켜 원격으로 접속해보는 작업을 진행하는데 무리가 있을것 같습니다.

우선 여기까지 진행하는 것으로 하고, 추후 ES와 Kibana를 실행시킬 서버의 사양을 높이던지, 다른 방법을 강구해보아야겠습니다.


인스턴스 유형 변경 (t2.micro > t2.medium)

(이어 작성)

AWS EC2 인스턴스 요금에 대해 알아보니,
2vCPU, 4GiB Memory를 제공하는 t2.medium 의 경우 시간당 0.0576 달러 정도의 비용이 소모되는데, 공부용으로 부담스러운 비용은 아닐 것 같아 해당 인스턴스로 다시 올려 ES를 기동해보겠습니다.


기존 인스턴스는 인스턴스 종료 작업을 진행한 뒤에 새로운 인스턴스를 생성하면 됩니다.

인스턴스 종료 : 인스턴스를 복구하지 못하도록 완전히 소멸
인스턴스 중지 : 추후에 인스턴스를 복구할수 있도록, 잠시 중지


EBS의 경우 기존 시작 템플릿을 생성할때, 종료 시 삭제 여부를 아니요로 해놓았다면, 인스턴스를 종료하여도 EBS는 여전히 남아있게 됩니다.

프리티어에서 무료제공하는 최대 스토리지 크기는 30GB이므로, 기존 30GB 크기의 EBS를 삭제하지 않고 놔두면 새로운 EBS 생성 시에 요금이 부과되므로 주의해야 합니다.

  • 종료 시 삭제 여부를 로 설정을 했거나, 인스턴스 종료 후 EBS도 같이 삭제를 해주면 문제 없습니다.

다만, 새 인스턴스 생성 시 기존 사용하던 볼륨을 이어서 사용하고 싶다면 스냅샷 기능을 이용해야 한다고 하네요.

저는 스냅샷 기능은 활용하지 않고, 기존 EBS를 삭제해주었습니다.


시작 템플릿 수정(새 버전 생성) 에 진입하여, t2.medium 으로 인스턴스 유형을 변경하고, 해당 템플릿 버전으로 인스턴스를 다시 생성하였습니다.


ES 기동 명령

t2.medium 변경된 인스턴스에서
Java 설치 / Elastic Search 다운로드 까지 진행해줍니다.

ES 기동 전에 이전에 했던 것처럼 자바 힙 크기 설정을 진행해줍니다.

-Xms1G
-Xmx1G

위 내용을 설정해줄건데 다시 찾아보니 두가지 방법이 존재하네요.

1. jvm.options

/etc/elasticsearch/jvm.options 파일 내에 직접 설정해주어도 되고,

2. jvm.options.d/xx.options

jvm.options 파일 내에서 가이드하는 것처럼

/etc/elasticsearch/jvm.options.d 폴더 아래에 options 확장자를 가진 파일에 설정해주어도 됩니다.

jvm.options 에 가이드된 방식을 따라 jvm.optoins.d 아래에 설정하는게 더 안정적인 방법일 수 있겠네요.


기동 명령어를 수행합니다.

$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch.service
$ sudo systemctl start elasticsearch.service

에러로그가 뜨지 않고 명령이 정상적으로 끝나면, 확인을 위해 curl 요청 테스트를 해봅니다.

$ curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://localhost:9200
Enter host password for user 'elastic':

ES 설치 시에 제공되었던 password를 입력하면


{
  "name" : "ip-xxx.ap-northeast-2.compute.internal",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "aDkGBR3WRbKPcv2dwbDMbg",
  "version" : {
    "number" : "8.4.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "2bd229c8e56650b42e40992322a76e7914258f0c",
    "build_date" : "2022-08-26T12:11:43.232597118Z",
    "build_snapshot" : false,
    "lucene_version" : "9.3.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

요청 테스트가 성공하는 것을 확인 할 수 있습니다.


로그 파일 /var/log/elasticsearch/elasticsearch.logvi로 열어 확인해보면

[ip-172-31-5-178.ap-northeast-2.compute.internal] heap size [1gb], compressed ordinary object pointers [true]

자바 힙 사이즈를 1GB로 잡아 기동된 것을 볼 수 있습니다.


ES 시스템 경로

ES Document에서 제공하는 설치 경로 정보입니다.


참고
Install Elasticsearch with RPM - Elastic document
[Elastic Search] 엘라스틱서치의 힙 크기
ELASTICSEARCH RPM INSTALL
[Elasticsearch] yum으로 Elasticsearch 설치
Elasticsearch installation issue on a free tier (t2.micro) AWS EC2 instance

0개의 댓글