AWS EC2에 엘라스틱서치 클러스터 세팅하기

가자고 개발팀은 판매 데이터 분석에 엘라스틱서치 ElasticSearch 사용을 검토하고 있다. 현재는 테스트 목적으로 AWS 서울 리전(region)에 운영되고 있는 두개 EC2 인스턴스에 각각 엘라스틱서치 노드 1개씩 세팅하고 이들(2개 노드)을 클러스터로 묶어서 운영하고 있다.

AWS EC2에 엘라스틱 서치 클러스터 세팅하기

엘라스틱 서치(이하 ES)는 브로드캐스트 방식(같은 대역의 네트워크 주소를 가진 호스트들에게 패킷을 전송하는 방식)을 이용해서 같은 대역의 네트워크에 내에 있는 다른 ES 노드들을 찾아낸다. 브로드캐스트 기능을 이용하면 같은 클러스터 이름을 가지고 있는 ES 노드들이 저절로 클러스터로 묶여 데이터를 분산 처리할 수 있다.

그러나 EC2 인스턴스에서 브로드캐스트가 막혀있기 때문에 클러스터링을 하기 위해선 직접 모든 인스턴스들을 지정해주거나(유니캐스트 unicast 라고 부른다.) 아니면 AWS Cloud 플러그인을 이용해야한다.

이 포스팅에서는 AWS 플러그인을 이용해서 클러스터링 하는 법에 대해 다룰 것이다.

구동 환경 및 버전 정보

  • AWS EC2 인스턴스
    • 1 vCPUs, 2.5 GHz, Intel Xeon Family, 1 GiB memory (t2.micro)
    • Amazon Linux OS
  • ElasticSearch
    • Version 2.3.5

EC2 인스턴스 설정

EC2 인스턴스에 엘라스틱 서치 클러스터를 설정할 때는 다음의 사항이 반드시 지켜져야 한다.

참고: 인스턴스를 하나에 먼저 ES를 세팅해놓고 이미지를 만든 후에 인스턴스를 복제하는 방식으로 다수의 AWS 인스턴스를 쉽게 만들 수 있다.

ES 설치하기

많은 리눅스 패키지가 그렇듯이 ES도 두가지 방식으로 배포가 된다. 한가지는 yum 이나 apt-get 등의 패키지 매니지먼트 시스템을 이용한 방식이고 한가지는 엘라스틱 서치 웹페이지을 통한 압축파일 배포 방식이다.
장단이 있지만, 고급 사용자가 아니라면 패키지 매니지먼트 시스템을 이용한 설치를 권장하며, 이하에서는 ?? 인스턴스 기준으로, yum 으로 설치한 상황을 가정할 것이다. apt-get(우분투)을 사용하는 경우도 크게 다르지 않다.

yum 을 이용해서 설치하기 위해선 ES 리포지토리 등록이 필요하다. 자세한 방법은 Elasticsearch Reference » Setup » Repositories의 YUM 항목을 참조하면 된다.

설치 후에 중요한 파일들의 경로들은 다음과 같다.

참고로 패키지 매니지먼트 시스템을 이용한 설치를 권장하는 이유는 다음과 같다.

  • 패키지 관리의 용이함 : 설치, 업데이트, 삭제 등이 쉬움.
  • 운영의 용이함 : 환경 변수, service 등의 등록을 별도로 하지 않아도 됨.
  • 실행파일, 설정 파일, 로그 파일 등의 표준 경로로 설정됨.

시작 프로세스 등록 (optional)

ES를 AWS 인스턴스가 새로 부팅되었을 때마다 자동으로 시작되게 할 수 있다. 참고로 yum이나 apt-get 으로 설치를 한 경우에는 /etc/init.d/ 에 elasticsearch 라는 이름의 스크립트가 생성되므로

명령만 실행하면 바로 시작 프로세스로 등록이 완료된다.

압축파일을 다운받아서 설치하는 경우에는 /etc/init.d 경로에 elasticsearch 스크립트를 직접 만들어주어야 한다. 이에 대한 내용은 참조.

플러그인 설치하기

ES 플러그인 설치는 plugin install 명령어를 통해 이뤄진다. ES 플러그인 설치시 실행하는 bin 파일은 yum 으로 설치한 경우 /usr/share/elasticsearch/bin 에 위치하고 있다.

일례로 elasticsearch-head, elasticsearch-HQ, cloud-aws 플러그인을 설치하는 경우엔 /usr/share/elasticsearch/bin 디렉토리 내에서 다음과 같이 명령한다.

참고로 위의 플러그인들 중에 cloud-aws 는 EC2 클러스터링을 위해서 반드시 설치해야 한다.

ES 설정하기

AWS ES 클러스터링의 핵심은 설정파일(elasticsearch.yml)에 있다. 클러스터링을 하기 위해서는 설정파일에서 다음의 조건들이 지켜져야 한다.

  • 같은 클러스터로 묶이는 인스턴스들은 cluster.name 이 모두 같은 이름으로 설정되어야 한다.
  • node.name 은 각 인스턴스를 구분할 수 있도록 지어준다.
  • network.host 는 각 ES 인스턴스가 구동되고 있는 AWS EC2 인스턴스의 private IP 를 적어준다.
  • cloud.aws.region 은 ES 인스턴스의 region
  • discovery 속성은 클러스터링을 위해 같은 클러스터 이름 cluster.name 을 가진 ES 인스턴스들을 검색하기 위한 정보들을 설정해준다. 이 때 검색의 범위는 같은 EC2 region 에 속한 EC2 인스턴스로 제한된다.
    • discovery.typeec2로 입력한다.
    • 만약 현재 해당 AWS region에 구동되고 있는 EC2 인스턴스의 개수가 많다면 discovery.ec2 속성에 다음과 같이 입력해주는 것이 좋다. 이는 클러스터링을 위한 노드 검색의 범위를 같은 security group 을 가진 EC2 인스턴스로 제한한다.
    • discovery.ec2.any_group: false
    • discovery.ec2.groups는 해당 EC2 인스턴스의 security group.

즉 예시로, 가자고 ES 인스턴스의 설정파일은 다음과 같이 작성되어 있다. (private IP와 security group ID는 보안상 주석으로 대신했다.

실행 테스트

yum install 을 했다면 /etc/init.d 에 별도의 스크립트를 등록하지 않아도 service 를 이용해서 ES를 시작할 수 있다.

실행이 정상적으로 됐다면 브라우저에서 EC2 public ip 9200 포트로 접속해보자. 즉 http://<YOUR EC2 PUBLIC IP>:9200로 접속해보자.

위와 같이 뜬다면 정상이다. (<…> 에는 해당 ES 노드의 정보가 뜰 것이다.)

클러스터링이 제대로 됐는지 확인하기 위해서 http://<YOUR EC2 PUBLIC IP>:9200/_cat/nodes?v 로 접속해보자. 아래와 같이 클러스터로 묶인 노드들의 정보가 정상적으로 나오는지 확인해보자.

by EastskyKang