소개
단일 개발자 머신에서 부터 대형 클러스터 까지 설치 과정과 구성을 설명하며 성능 향상 방법과 잘못된 구성 설정을 해결할 힌트를 제공한다. ES 설치와 개발 및 프로덕션 작업 환경 설정에는 여러 옵션이 있다. 테스트 용도로 구성할 때는 이러한 사항이 불필요하나 프로덕션으로 옮길 때 데이터, 사용사례, 제품 아키텍처에 따라 클러스터를 구성하는 것이 매우 중요하다. 잘못된 설정은 잘못된 결과와 낮은 성능을 초래하고 서버가 중단될 수도 있으므로 이 설정 단계가 중요하다. 또한 ES 플러그인 관리도 다룬다.
ES 다운로드 및 설치
ES는 매우 활동적인 커뮤니티를 보유하고 있어서 릴리즈 주기가 매우 빠르다. ES는 매우 일반적인 자바 라이브러리(Lucene, Guice, Jackson등)에 의존하기 때문에 ES 커뮤니티는 이러한 라이브러리 업데이트를 유지하고 라이브러리와 ES 코어에서 찾은 버그를 수정한다. 대규모 사용자 기반은 사용 사례를 개선하기 위한 원천이다. 이와 같은 이유로 가능하다면 최신 릴리즈를 사용하는것이 가장 좋다. 일반적으로 가장 안정적이고 버그가 적다.
분석
ES 서버를 다운로드 설치하기 위해 다음 절차를 수행한다. 웹에서 ES를 다운로드 한다. ES는 일반적으로 세 개의 폴더를 가지고 있다.
bin ES를 시작하고 관리하는 스크립트가 있다. 가장 중요한 것은 다음과 같다.
elasticsearch(.bat) ES를 시작하는 주요 스크립트
plugin(.bat) 플러그인을 관리하는 스크립트
config ES 설정을 포함한다. 가장 중요한 것은 다음과 같다.
elasticsearch.yml ES 주요 설정 파일
log4j2.properties 로깅 설정 파일
lib ES 실행하는 데 필수적인 라이브러리가 있다.
modules 일래스틱 서치 기본 모듈 확장이 있다.
plugins 설치한 플러그인이 있다.
설계
ES를 시작하는 동안 다양한 이벤트가 발생한다.
노드 이름을 elasticsearch.yml에 지정하지 않으면 자동으로 이름이 지정된다. 자동으로 지정되는 노드 이름은 코드에 포함된 src/main/resources/config/names.txt에서 가져온다.
해당 노드에 대해 노드 이름 해시를 생성한다.
모듈을 로드할 때 기본 설치 모듈은 다음과 같다.
aggs-matrix-stats aggregation matrix stats을 제공하는 역할
ingest-common 일반적인 수집 기능을 포함
lang-expression 표현식 언어를 제공하는 역할
lang-groovy Groovy 언어를 제공하는 역할
lang-mustache Mustache 언어를 제공하는 역할
lang-painless Painless 언어를 제공하는 역할
percolator 퍼콜레이터 기능을 제공하는 역할
reindex 재색인 행위를 제공하는 역할
플러그인이 있으면 로드한다.
ES는 가용한 모든 네트워크 주소를 설정할 수 있는데 설정하지 않았다면 자동으로 다음 두개의 포트를 사용한다.
내부 통신을 목적으로 9300 포트를 사용한다.
HTTP REST API룰 위해 9200 포트를 사용한다.
시작한 후 색인을 사용할 수 있다면 복구하고 사용하도록 준비한다.
포트 번호가 이미 사용중이라면 ES는 자동으로 포트 번호를 사용가능한 포트를 찾을 때까지 증가시킨다. 이 기능은 주로 테스트나 개발할때 가틍ㄴ 머신에 여러 노드를 실행하려는 경우 유용하다.
네트워킹 설정
클러스터와 노드에 있어서 네트워킹 설정을 올바르게 이해하는 것이 중요하다. 첫 단계는 노드 탐색을 정확하게 설정하는 것이다.
분석
네트워킹을 구성하기 위해 다음 절차를 진행한다.
ES 구성 파일을 선호하는 텍스트 편집기로 연다.
config/elasticsearch.yml 파일을 이용하면 노드가 여러분 머신의 모든 인터페이스와 바인드하게 구성되고, discovery.zen.ping.unicast.hosts에 나열한 노드로 탐색을 진행한다. 이는 유니캐스트 목록에 있는 머신에 신호를 전송하고 응답을 기다리며 노드가 응답하는 경우 클러스터에 참여 할 수 있다.
같은 LAN에 있는 다른 노드를 사용할 수 있다면 클러스터에 참여한다.
설계
네트워킹 관리에 있어 가장 중요한 구성은 다음과 같다.
cluster.name은 클러스터 이름을 설정한다. 같은 클러스터 이름을 가진 노드만이 클러스터를 구성할 수 있다.
node.name은 지정하지 않는다면 자동으로 명명된다.
노드를 위한 이름을 정의할 수 있다. 서로 다른 머신에 많은 노드가 있다면 쉽게 찾을 수 있도록 의미있는 이름을 부여하는 것이 좋다. 서버를 모니터링 해야 한다면 반드시 node.name을 지정하자. 일반적으로 노드 이름은 관리 편의성을 위해 호스트 서버 이름으로 한다. 노드 바인드에 사용할 머신의 IP를 network.host에 지정한다. 서버가 다른 LAN에 있거나 오직 특정 LAN과 바인드하게 제한하려면 지정된 서버 IP를 나열해야 한다. 클러스터에 결합하기 위해 다른 노드를 탐색하는 데 사용할 호스트 목록은 discovery.zen.ping.unicast.hosts에 지정할 수 있다. 이 설정으로 브로드캐스팅이 허용되지 않거나 자동 탐색이 불가능한 즉 라우터에서 특정 패킷을 필터링하는 경우에도 LAN에 있는 노드를 가용할 수 있다. 참조 포트는 전송 포트이며 보통 9300번을 사용한다. 호스트 목록은 다음 내용을 혼합하여 사용한다.
호스트 이름 myhost1
IP 주소 192.168.1.2
IP 주소 혹은 호스트 이름과 포트 myhost1:9300, 192.168.1.2:9300
IP 주소 혹은 호스트 이름과 포트 범위 myhost1:[9300-9400], 192.168.1.2:[9300-9400]
ES 5.x 이전에는 클러스터 구성이 브로드케스팅으로 구성하는 것을 기본으로 하였으나 이는 많은 네트워크 이슈를 만들었다. 프로덕션 구성에서는 유니케스팅은 기본으로 한다.
노드 설정
ES 설치에서 여러 파라미터를 사용자 정의 할 수 있다. 데이터를 저장할 위치를 지정하고 전반적인 성능을 향상하는 데 가장 많이 사용하는 파라미터를 알아 보자
분석
단순 노드 설정은 다음과 같은 사항을 주로 다룬다.
config/elasticsearch.yml 을 수정한다.
서버 데이터를 저장할 디렉토리를 설정한다.
리눅스, OSX path.conf: /opt/data/es/conf path.data: /opt/data/es/data1, /opt2/data/data2 path.work: /opt/data/work path.logs: /opt/data/logs path.plugins: /opt/data/plugins
윈도우 path.conf: c:\Elasticsearch\conf path.data: c:\Elasticsearch\data path.work: c:\Elasticsearch\work path.logs: c:\Elasticsearch\logs path.plugins: c:\Elasticsearch\plugins
표준 색인 생성을 관리할 파라미터를 다음과 같이 설정한다. index.number_of_shards:5 index.number_of_replicas:1
설계
구성 파일이 있는 폴더를 path.conf에 지정한다. ㅣ주로 elasticsearch.yml과 logging.yml등이 이 경로에 있다. 기본 값은 설치 경로를 가리키는 ES_HOME 환경 변수가 포함된 $ES_HOME/config 이다. 가장 주요한 설정 중 하나는 색인 데이터를 저장할 곳으로 하나 이상의 폴더를 지정하는 path.data이다. 한 개 이상의 폴더를 지정하면 서로 다른 디스크에 쓰기를 가능하도록 지정 할 수 있다. 임시 파일은 ES가 path.work에 저장한다. 로그 파일은 path.log이며 제어하는 방법은 logging.yml을 따른다. 플러그인 경로 재정의는 path.plugins에 지정한다. 시스템 공통으로 사용할 플러그인 위치를 지정하는 데 유용하다. 색인과 샤드를 제어하는 데 사용하는 주요 파라미터는 새로운 색인을 만들 때 샤드의 표준 새수를 제어하는 데 필요한 index.number_of_shards와 레플리카 초기 개수를 지정하는 index.number_of_replicas다.
리눅스 시스템을 위한 설정
리눅스 시스템을 사용한다면 성능 향상이나 다수의 색인으로 인한 프로덕션 문제를 해결하기 위해 추가적인 설정을 해야 한다.
색인과 데이터 손상 가능성이 있는 'Too many open files' 에러
가비지 컬렉터로 인한 검색과 색인 작업의 느린 성능
분석
ES 서버의 사용자 제한을 변경해야한다. 사용자명이 elasticsearch로 가정한다.
ES가 많은 수의 파일을 다룰 수 있도록 디스크립터 개수를 증가시켜야 한다. /etc/security/limits.conf를 편집하여 다음을 추가하여야 한다.
elasticsearch - nofile 65536
elasticsearch - memlock unlimited
재부팅한다.
우분투 16.04 이후 버전의 경우 init.d에서 limits.conf를 건너 뛸수 있으므로 /etc/pam.d/su를 편집하여 다음 사항을 주석 처리한다.
메모리 스왑을 제어하기 위하여 elasticsearch.yml에 다음 파라미터를 설정한다.
ES 서버의 메모리 사용을 고정하려면 $ES_HOME/bin/elasticsearch.in.sh에 있는 ES_MIN_MEM과 ES_MAX_MEM 값을 지정해야 한다. 그 외 최소 및 최댓값을 자동으로 동일하게 초기화하도록 ES_HEAP_SIZE 를 설정 할 수도 있다.
설계
파일 디스크립터 표준 값은 1024이다. 여러 색인에 많은 레코드를 저장한다면 파일 디스크립터가 매우 빠른 속도로 소진된다. ES 서버는 응답할 수 없게 되고, 색인은 손상되며 데이터를 잃게 될 것이다. 최대 파일 열기 개수를 초과하지 않도록 매우 높은 숫자로 변경하자. 메모리 설정은 ES의 스왑 메모리 사용르 방지하고 프로덕션 환경에서 최고 성능을 제공할 것이다. ES가 색인하거나 검색하는 동안 많은 메모리 가용량이 요구된다. 많은 생성/제거 작업은 메모리를 단편화 시키며 성능을 저하시킨다. 메모리가 가득 차게 되면 시스템은 더 많은 메모리를 할당하기 위해 압축된 메모리를 찾는 오버헤드가 발생한다. bootstarp.memroy_lock을 true로 설정하면 ES는 스스로 시스템을 멈추고 디스크 전체 프로세스 메모리를 덤프하여 단편화 된 메모리를 제거한 후 메모리에 다시 시스템을 올린다. 이 설정으로 전체 메모리의 단편화를 제거하면 성능이 크게 향상 된다.
노드 타입
ES는 기본적으로 클라우드 용으로 설계 됐기 때문에 클러스터에 많은 노드를 추가해야 한다. ES의 균형을 조정하고 전반적인 성능을 개선하기 위해 다양한 타입의 노드를 정의할 수 있다.
분석
클러스터를 설정한다. 다양한 노드 타입을 정의하기 위한 파라미터가 있다.
마스터 노드
데이터 노드
설계
클라우드에서 마스터가 될 수 있는 노드를 정의하는 파라미터는 node.master
이다. 이 값은 기본 값으로 true를 가진다. 마스터 노드는 샤드의 관리리하는 결정권자로서 클러스터 상태를 유지하며 모든 색인 작업을 제어한다. 마스터 노드에 부하가 발생하면 클러스터 전체 성능이 저한된다. 마스터 노드의 최적 값은 다음 공식으로 계산한다.
노드에 데이터를 저장하려면 node.data가 true이어야 한다. 이 값은 true의 기본값을 가진다. 노드는 데이터를 색인하고 검색하는 워커가 된다.
위 소개한 두가지 파라미터를 조합하면 다양한 노드 타입을 정의 할 수 있다.
클라이언트 노드
마스터 노드는 클러스터 안정에 가장 중요하다. 클러스터에서 쿼리와 집계가 불안정해지는 것을 방지하기 위해 클라이언트 노드는 클러스터에 안전한 통신을 제공 한다.
분석
node.master:false
node.data:false
설계
클라이언트 노드는 클러스터를 위해 프록시로 동작하거나 그저 통과하게 만드는 특수한 노드이다.
마스터가 아니라서 클러스터에 영향을 주지 않고 종료 할수 있다. 클러스터 기능에 참여하지 않고 데이터도 없기 때문에 실패하더라도 클러스터에 아무런 영향을 미치지 않는다.
개발자나 사용자가 잘못된 쿼리를 사용하여 발생하는 문제를 방지한다. 사용자가 너무 큰 집계(연간 범위에서 10초 간격의 날짜 히스토그램)를 실해앟여 ES 노드가 중단될 수 있는데 클라이언트 노드는 단독으로 동작하므로 클러스터 안정화에 기여한다.
클러스터 노드를 어플리케이션에 내장하면 데이터의 라운드 트립을 줄이고 어플리케이션 속도가 빨라진다.
클러스터에 변경을 만들거나 데이터 재배치 없이 검색과 집계 처리량에 균형을 맞추도록 클라이언트 노드를 추가 할 수 있다.
수집 노드
ES의 주요 목적은 색인, 검색 그리고 분석이다. 그러나 가끔 ES가 저장을 하기 전 도큐먼트를 변경할 필요가 생긴다.
로그 문자열을 전처리해 의미 있는 데이터를 추출한다.
자연어 처리 도구로 일부 텍스트 필드의 내용을 풍부하게 만든다.
지리 위치에서 IP 변환 수집하는 등 일부 변활을 추가하거나 수집 시간에 사용자 정의 필드를 추가한다.
분석
수집 노드를 정의하려면 다음과 같은 옵션을 추가한다.
설계
수집 노드는 13장에서 다시 언급된다. 클라이언트 노드 처럼 수집 노드를 사용하면 클러스터에 안정성을 유지하며 추가적인 기능을 제공한다. NLP, 첨부 파일 추출, 로그 인제스트를 사용한다면 수집 기능이 활성화된 클라이언트 노드를 구성하는 것이 좋다. 마스터 노드를 ingest 노드로 사용하는 것은 다음과 같은 문제를 야기한다.
NLP 알고리즘을 위한 높은 CPU 사용으로 데이터 노드의 전체 CPU를 사용해서 색인과 검색 성능을 떨어뜨린다.
첨부 파일의 잘못된 형식이나 Tika 버그로 인한 불안정성 클러스터에 최고의 안정성과 인제스트 파이프라인을 제공하기 위해 인제스트를 활성화한 클라이언트 노드 풀을 구성해서 사용하는 것이 좋다.
ES에 플러그인 설치
ES의 주요 기능 중 하나는 플러그인으로 확장 할 수 있다는 것이다. 플러그인은 ES 기능을 여러 가지 방법으로 확장한다. ES 6.4에서 플러그인은 애플리케이션 코드를 포함하는 JAR 파일인 네이티브 플러그인이고 다음에서 사용한다.
스크팁트 엔진
사용자 정의 분석기, 트큰나이저, 스코어링
REST 엔트리 포인트
인제스트 파이프라인 단계
새로운 저장소 지원(하둡)
분석
ES는 bin 폴더는 플러그인을 자동으로 다운로드하여 설치하는 elasticsearch-plugin 이라는 스크립트를 제공한다.
플러그인 이름을 참조해 plugin과 install ES 명령을 호출한다.
ES의 관리 인터페이스를 설치하기 위해 다음과 같은 명령을 실행한다.
플러그인이 정상적으로 로드 되는지 노드 시작을 확인한다.
설계
플러그인을 설치하는 데 다음과 같은 방법이 있다.
플러그인 URL을 지정
플러그인의 github 저장소를 install 파라미터로 전달
반드시 지정해야 하는 install 파라미터 형식은 다음과 같다.
사용자명/저장소(/버전)
설치 과정동안 ES 플러그인 관리자는 다음과 같은 일을 한다.
플러그인 다운로드
ES_HOME에 plugin 폴더 생성
플러그인 폴더에 플러그인 압축 해제
임시파일 제거 위 과정은 자동으로 진행되므로 편리하게 설치 할 수 있다.
ES 에서 플러그인을 설치하는 경우 해당 플러그인이 가용한 노드에서만 시작하도록 설정 할 수 있다.
어떤 노드 환경에서 일부 플러그인을 업데이트하면 서로 다른 노드에 있는 서로 다른 플러그인 버전 때문에 오작동 할 수 있다. 대형 클러스터에서 문제를 방지하기 위해 별도의 환경에서 플러그인 업데이트를 테스트 해야 한다. ES 서버 버전을 업데이트 하면 내부 API 변경으로 인해 플러그인이 손상 될 수 있다. 플러그인은 매니페스트에 있는 같은 버전의 ES 서버가 필요하다.
ES 서버를 업데이트 한다는 것은 곧 설치된 모든 플러그인을 업그레이드 한다는 의미이다.
로깅 설정 변경
표준 로깅 설정은 일반적인 경우에 잘 동작한다. 하지만 플러그인 등에 의해 오류가 발생하게 되면 로그 수준의 변경하여 확인할 필요가 있다. ES를 디버깅 하는 경우 log4j2.properties 파라미터를 변경 하면 된다.
분석
ES 설치 폴더내 config 폴더에서 동작 설정을 제어하는 log4j2.properties 파일이 있다. 로깅 설정을 변경하기 위해 필요한 절차는 다음과 같다.
ES에 있는 모든 종류의 로깅을 출력하려면 다음과 같이 현재의 루트 수준 로깅을 변경할 필요가 있다.
Last updated