22 6월 2016 엔지니어링

AWS에서 Elasticsearch 실행하기

By Kosho OwaDara Gies

제 I부 - EC2 인스턴스 프로비저닝

AWS(Amazon Web Services)에서 Elasticsearch 클러스터를 실행하는 고객들과 만나는 경우가 많습니다. AWS는 변화하는 비즈니스 요건에 대응하여 시스템 리소스를 프로비저닝하고 확장할 수 있는 편리한 방법입니다. Elasticsearch는 용량 및 성능 요건이 변화함에 따라 EC2 인스턴스와 해당하는 Elasticsearch 노드의 추가 및 제거를 허용하는 EC2의 주문형 시스템 아키텍처를 활용합니다.

이 글에서는 Elasticsearch 2.3.3 을 Amazon EC2에 배포하는 방법을 설명합니다. 다음 예에서는 3개 노드 Elasticsearch 클러스터를 구성합니다.

1단계: AMI(Amazon Machine Image) 선택

Elasticsearch는 CentOS, Redhat, Ubuntu, Amazon Linux와 같은 다양한 운영 체제에서 실행됩니다. 최신 Amazon Linux AMI("Amazon Linux AMI 2016.03.0 (HVM), SSD Volume Type")를 사용할 것을 권장합니다.

Choose an Amazon Machine Image (AMI).png

2단계: 인스턴스 유형 선택

시작하기에 적당한 인스턴스 유형은 vCPU 8개, 30 GiB 메모리, 80 GB SSD 드라이브 2개를 제공하고 고성능 네트워크가 제공되는 m3.2xlarge입니다. 인덱싱 작업은 IO를 많이 사용하고 클러스터 성능과 안정성을 위해 고성능 네트워크가 필수적이므로 솔리드 스테이트 드라이브(SSD)를 사용하는 것이 좋습니다.

M3.2xlarge가 기본적으로 권장됩니다. 이 모델이 적합한지 판단하려면 해당 솔루션에 대한 벤치마킹을 수행하여 성능 및 확장 요건을 충족하는지 확인해야 합니다.

"Next: Configure Instance Details"(다음: 인스턴스 세부 구성) 버튼을 클릭하십시오.

Choose an Instance Type.png

3단계: 인스턴스 세부 구성

각 Elasticsearch 노드는 고유한 전용 EC2 인스턴스에서 실행되므로 인스턴스 수를 3개로 설정하십시오.

2013년 12월 4일 이후에 생성된 AWS 계정은 EC2-VPC만을 지원합니다. 따라서 이들 사용자에게는 "Launch into EC2-Classic"(EC2-Classic으로 시작) 선택을 위한 "Network"(네트워크) 옵션이 제공되지 않으며, 어쨌든 이 옵션을 활성화하지 말아야 합니다.

노드 및 관련 데이터를 실수로 삭제하는 것을 방지해주므로 "Enable termination protection"(종료 방지 활성화)을 선택하는 것이 좋습니다.

나머지 필드에 기본값을 그대로 두고 "Next: Add Storage"(다음: 저장 장치 추가)를 클릭하십시오.

Configure Instance Details.png

4단계: 저장 장치 추가

저장 장치 크기는 8 GiB 그대로 둡니다. 인덱스 저장 장치 요건을 알고 있다면 저장 장치 설정을 조정하는것도 가능합니다. 지금은 Volume Type(볼륨 형식)은 General Purpose SSD(범용 SSD)로 설정된 채로 두십시오.

"Next: Tag Instance"(다음: 인스턴스 태그 지정) 버튼을 클릭하십시오.

Add Storage.png

5단계: 인스턴스 태그 지정

"Next: Configure Security Group"(다음: 보안 그룹 구성) 버튼을 클릭하십시오.

Step 5 Tag Instance.png

6단계: 보안 그룹 구성

이 구성 패널에서는 인스턴스 액세스를 위한 방화벽 규칙 세트를 구성할 수 있습니다. 기본적으로 Elasticsearch는 REST API 액세스를 위해 TCP 포트 9200을 개방하고, 내부 클러스터 통신을 위해 TCP 포트 9300을 개방합니다. 원하는 서브넷(대개 프라이빗 서브넷)에서 TCP 포트 9200에 연결하도록 허용하고, Elasticsearch 노드가 상주하는 서브넷에서 TCP 포트 9300에 연결하도록 허용하는 규칙을 추가하는 것을 고려해 보십시오. elasticsearch.yml에서 기본 포트 설정을 변경하려는 경우, TCP 포트 9200 및 9300이 아닌 해당 포트에 대한 규칙을 구성하십시오.

또한 이후 단계에서 인스턴스에 연결할 수 있도록 포트 22를 통한 SSH 연결을 허용하는 규칙을 추가하십시오.

"Review and Launch"(검토 및 시작) 버튼을 클릭하십시오.

Configure Security Group.png

7단계: 인스턴스 시작 검토

경고가 표시된 경우 확인하고 Instance Launch(인스턴스 시작) 설정을 검토한 후 준비가 되었으면 "Launch"(시작) 버튼을 클릭하십시오.

Review Instance Launch.png

그러면 키 쌍을 입력하거나 새 키 쌍을 생성하라는 메시지가 표시됩니다.

Select Key Pair.png

이 과정은 EC2 인스턴스에 대한 SSH 액세스를 활성화하는 데 필요합니다. 키 쌍을 설정하는 데 도움이 필요한 경우, Amazon EC2 키 쌍 문서에서 새 키 쌍을 생성하는 데 관한 방법과 개요를 참조하십시오.

EC2 인스턴스를 시작하고 다음 단계에서 사용할 할당된 프라이빗 IP 주소를 기록하십시오.


제 II부 - Elasticsearch 설치

RPM

SSH를 통해 각 EC2 인스턴스에 로그인하십시오.

$ ssh -v -i /pathto/[certfilename].pem ec2-user@[ec2hostname]

그런 다음 아래 지침에 따라 Elasticsearch RPM 패키지를 각 EC2 인스턴스에 설치하십시오.

$ sudo rpm -i https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.3.3/elasticsearch-2.3.3.rpm

다른 버전의 Elasticsearch는 여기서 제공됩니다. yum으로 설치하려면 가이드 를 참조하십시오.

Elasticsearch를 시스템 서비스로 등록하십시오.

$ sudo chkconfig --add elasticsearch

플러그인 설치

라이센스 플러그인과 AWS 클라우드 플러그인을 클러스터에 있는 각 EC2 인스턴스에 설치해야 합니다.

$ cd /usr/share/elasticsearch/ 
$ sudo bin/plugin install cloud-aws

모니터링을 위한 Marvel 또는 추가 언어 지원을 위한 ICU와 같이 필요한 플러그인이 추가로 있는 경우, 지금 설치하는 것이 좋습니다.

Elasticsearch 구성

최대 JVM 힙 크기는 시스템 메모리를 기준으로 해야 합니다. 각 EC2 인스턴스에서 자주 사용하는 편집기로 "/etc/sysconfig/elasticsearch"를 열고 "ES_HEAP_SIZE" 및 "MAX_LOCKED_MEMORY" 파라미터를 설정하십시오. m3.2xlarge 인스턴스에 적합한 구성은 다음과 같습니다. "ES_HEAP_SIZE"는 메모리의 절반이 되도록 하는 것이 좋지만 32GB를 초과해서는 안 됩니다.

ES_HEAP_SIZE=15g 
MAX_LOCKED_MEMORY=unlimited

각 시스템에서 "/etc/elasticsearch/elasticsearch.yml"을 열고 다음 설정을 편집하십시오.

cluster.name:esonaws 
bootstrap.mlockall: true 
discovery.zen.ping.unicast.hosts: [_ip_address_,…] 
network.host: [_ip_address_]

"discovery.zen.ping.unicast.hosts" 항목의 값은 EC2 인스턴스의 프라이빗 IP 주소들의 목록입니다. 모든 마스터 (마스터로 선출될 수 있는) 노드가 열거되어야 합니다. 적은 규모의 클러스터에서는 모든 노드들이 마스터와 데이터 노드의 기능을 동시에 수행하도록 할 수도 있습니다. "network.host" 는 다른 노드들이 공유하고 있는 해당 EC2 인스턴스의 프라이빗 IP 주소입니다.

단일 노드 클러스터에서 IP 주소는 요구되지 않습니다. "_site_" 와 "_local_" 은 각각 프라이빗 주소와 로컬 루프백 주소인 "127.0.0.1"을 나타내며 외부로부터 접속이 가능합니다.

시작 및 확인

여러 개의 Elasticsearch 노드를 설정하는 경우, 모두 버전과 플러그인이 동일하고 구성이 동등해야 합니다. 각 EC2 인스턴스에서 Elasticsearch를 시작하십시오.

$ sudo service elasticsearch start

시작되었으면 curl을 통해 클러스터 상태를 요청하여 Elasticsearch 클러스터를 확인하십시오.

$ curl localhost:9200/_cluster/health?pretty

성공했으면 "status"가 "green"(또는 단일 노드의 경우 "yellow")입니다. "number_of_nodes"와 시작된 노드의 수가 같아야 합니다. 클러스터 "status"가 "green"으로 바뀌려면 최소 3개의 노드가 필요합니다. "status"가 "green"이 아닌 경우, Security Group(보안 그룹) 구성이나 "/var/log/elasticsearch"의 로그에서 오류 유무를 확인할 수 있습니다.

{ 
  “cluster_name” : “esonaws”, 
  “status” : “green”, 
  “timed_out” : false, 
  “number_of_nodes” : 3, 
  “number_of_data_nodes” : 3, 
  “active_primary_shards” : 8, 
  “active_shards” : 16, 
  “relocating_shards” : 0, 
  “initializing_shards” : 0, 
  “unassigned_shards” : 0, 
  “delayed_unassigned_shards” : 0, 
  “number_of_pending_tasks” : 0, 
  “number_of_in_flight_fetch” : 0, 
  “task_max_waiting_in_queue_millis” : 0, 
  “active_shards_percent_as_number” : 100.0 
}

Elasticsearch 클러스터가 준비되었습니다!

요약

Elasticsearch 클러스터를 Amazon EC2에 배포하는 것은 상대적으로 쉬운 작업이지만 여러 단계의 구성을 거쳐야 하고, SSH를 잘 알아야 하며, 키 쌍 관리가 필요하고, 또한 시스템 관리자가 수행해야 합니다.

사용이 간편한 중앙 관리 서비스를 선호하는 경우, Elastic에서 공식 호스팅하는 Elasticsearch 및 Kibana 서비스 Elastic Cloud를 AWS에서 이용하는 것이 가장 좋습니다. 몇 번의 클릭만으로 클러스터를 시작할 수 있습니다. 또한 Elastic Cloud 에는 보안, Kibana, 지원 플러그인, 주문형 클러스트 확장, 자동 버전 백업 등 기능이 제공됩니다.

elastic cloud is easy vi.gif

Elastic Cloud 평가판 은 무료 제공되므로 신용 카드가 필요 없습니다. 아래는 Elastic Cloud 를 보다 자세히 설명하는 짧은 동영상 링크입니다.