Environment Variables
- EL은 자바의 환경변수 JAVA_OPTS에 따른다.
- 가장 중요한 환경 설정값은 -Xmx (최대 메모리), -Xms (최소메모리) 의 설정이다.
- 대부분 JAVA_OPTS는 그대로 두고, ES_JAVA_OPTS를 설정하여 JVM의 환경변수를 변경한다.
- ES_HEAP_SIZE 환경 변수는 힙 메모리를 설정하는 값이다.
- 이 설정값을 설정하면 ES_MIN_MEM(기본 256m), ES_MAX_MEM(기본 1g)을 같은 값으로 설정한다.
# 추천 :
- 값은 min과 max를 동일하게 하는것
- mlockall enable로 설정하기.
System Configuration
File Descriptors
- 머신에서 설정된 open file의 수를 다음으로 증가 시킨다. 32k --> 64k (추천)
- 얼마나 많은 수의 파일이 오픈 될 수 있는지 설정을 한다.
-Des.max-open-files=true
- 이렇게 설정하면 엘라스틱 서치가 올라올때 최대 오픈할 수 있는 파일 수를 프린트한다.
- 다른 방법으로는 엘라서틱 질의를 통해서 max_file_descriptors를 확인할 수 있다.
curl localhost:9200/_nodes/process?pretty
Virtual memory
Elasticsearch는 인덱스 저장을 위해서 hybrid mmaps / niofs 디렉토리를 기본으로 사용한다.
* niofs : 파일시스템에 샤드 인덱스를 NIO를 이용하여 저장한다. 멀티 쓰레드가 동시에 동일한 파일을 읽을 수 있도록 지원한다. Windows에서는 사용하지 않도록 권고한다. Java 구현체에 버그가 있다.
* mmaps : 파일스스템에 샤드 인덱스를 memory에 파일을 매핑하는 방식으로 저장한다. 메모리 매핑은 파일 크기와 동일한 가상메모리 공간을 이용한다.
기본 OS의 제약은 mmap에 그대로 적용되며, 너무 아래로 떨어지게 되면 out of memory 예외가 발생한다. Linux에서는 다음 명령어를 통해서 제한 값을 올릴 수 있다.
sysctl -w vm.max_map_count=262144
이 값을 영구적으로 설정하기 위해서는 vm.max.map_count 설정을 /etc/sysctl.conf 에 지정하자.
root계정으로만 가능하다.
* 만약 .deb, .rpm으로 Elasticsearch를 설치한경우라면 이 값은 자동으로 설정된다.
Memory Settings
대부분의 운영 체제는 시스템 캐시를 위해 가능한 많은 메모리를 사용하고자 한다. 그리고 어플리케이션에서 사용하지 않는 메모리는 swap out 하고자 시도한다. 엘라스틱 서치의 프로세스도 swap이 될 수 있다.
Swapping은 노드의 안정성을 유지하기 위해서 성능을 심각하게 떨어뜨리게 된다. 이러한 swap를 피하는 것이 좋다.
Disable swap
가장 단순한 옵션으로 swap를 완젼히 정지 시킨다. 일반적으로 EL은 box에서 서비스를 수행하고, ES_HEAP_SIZE에 의해서 컨트롤 된다. swap를 enable로 설정할 필요가 없다.
리눅스 시스템에서 다음 명령어를 통해서 swap를 임시로 끌 수 있다.
sudo swapoff -a
영구적으로 끄기 위해서는 /etc/fstab를 수정하고, swap로 된 모든 라인을 커멘트 처리 하면 된다.
Windows에서는 다음 경로에서 disable할 수 있다.
System Properties -> Advanced -> Performance -> Advanced -> Virtual memory
Configure swappiness
두번째 옵션은 sysctl 값인 vm.swappiness를 0으로 설정하는 방법이다.
이것은 커널이 swap 하고자 하는 경향을 줄여주고, 일반적인 환경에서는 swap를 수행하지 않도록 해준다. 긴급 상황에서만 swap를 수행한다.
# 참고 : 커널버젼 3.5-rc1 이상 버젼에서는 swappiness의 값을 0으로 설정하면 OOM killer 가 나타나면 swapping을 수행하는 대신에 해당 프로세스를 kill한다. swappiness 를 1로 설정하면 swapping을 수행한다.
mlockall
이 옵션은 mlockall을 이용하며 Linux / Unix시스템의 기능을 이용한다. 혹은 윈도우에서는 VirtualLock 기능을 이용한다.
이것은 RAM의 공간에 lock을 거는 방법으로 Elasticsearch 메모리가 swapped out되는 것을 막아준다. 이것은 config/elasticsearch.yml 파일에 다음과 같이 정의하는 것으로 설정이 가능하다.
bootstrap.mlockall: true
Elasticsearch가 실행된후 해당 옵션이 성공적으로 적용되었는지 확인은 다음과 같이 수행할 수 있다.
curl http://localhost:9200/_nodes/process?pretty
만약 mlockall이 false로 설정 되어 있다면 mlockall요청이 실패 했음을 의미한다. 이 이유는 Linux/Unix시스템에서 EL이 메모리 lock권한을 가지고 있지 않은 경우 발생한다.
이것은 ulimit -l unlimited 값을 root권한으로 지정하면 가능하다.
mlockall이 실패할 수 있는 또 다른 이유는 /tmp 디렉토리가 noexec옵션으로 마운트 된 경우에 가능성이 있다. 이것은 Elasticsearch를 실행할때 옵션을 선택하여 temp 위치를 변경하는 것으로 해결이 가능하다.
./bin/elasticsearch -Djna.tmpdir=/path/to/new/dir
# mlockall은 JVM이나 shell session을 종료시킬 수 있는데 이것은 가용한 용량보다 더 많은 메모리를 할당하고자 하는 경우 발생될 수 있다.
Elasticsearch Settings
elasticsearch설정 파일은 ES_HOME/config 폴더 아래에 있다. 폴더는 2개의 파일이 있으며, elasticsearch.yml로 Elasticsearch 설정을 하기 위한 파일과, logging.yml로 로기을 설정하기 위함이다.
설정 포맷은 YAML로 되어 있다.
다음은 모든 Base module들의 네트워크를 변경하는 것으로 바인드 시키고 publish를 해준다.
network :
host : 10.0.0.4
Paths
사용 환경에서 데이터의 위치와 로그 파일의 위치를 지정하고자 하는 니즈가 있을 것이다.
path :
logs: /var/log/elasticsearch
data: /var/data/elasticsearch
Cluster name
실제 환경에서는 절대로 클러스터 이름을 지정하는 것을 빼먹지 말자. 이것은 discover과 auto-join을 위해서 꼭 필요하다.
cluster:
name: <NAME OF YOUR CLUSTER>
서로다른 환경에서 동일 클러스터 이름을 사용하지 않도록 주의하자. 그렇지 않으면 잘못된 클러스터에 노드가 조인된다. 예를 들면 logging-dev, logging-stage, logging-prod와 같이 클러스터를 나누자.
Node name
기본 노드 이름을 변경하고자 할수도 있다. 각 노드는 노출되는 호스트의 이름이 된다. 기본적으로 Elasticsearch는 랜덤하게 지정된다.
node:
name: <NAME OF YOUT NODE>
머신의 호스트 이름은 환경 변수 HOSTNAME에 지정된 내역을 따른다. 만약 머신에 하나의 엘라스틱 서치 노드를 수행시킨다면 ${...}을 이용하여 호스트 이름을 지정할 수 있다.
node:
name: ${HOSTNAME}
내부적으로 모든 설정은 namespaced 구조로 설정된다.
예를 들어 이전에 설명한 node.name으로 지정하여 설정할 수 있다. 이 의미는 설정을 JSON형식으로 쉽게 지정할 수 있다. 만약 JSON형식으로 처리하고자 한다면 elasticsearch.yml을 elasticsearch.json으로 변경하면 된다.
Configuration styles
{
"network" : {
"host" : "10.0.0.4"
}
}
이것은 외부 설정인 ES_JAVA_OPTS를 이용하여 설정할 수 있다.
elasticsearch -Des.network.host=10.0.0.4
다른 옵션은 es.default 이다. prefix가 es.이며 이는 기본 설정을 의미한다. 이값은 명시적으로 설정파일에 지정하지 않으면 기본값으로 설정된다는 의미이다.
다른 옵션은 ${...}을 이용하는 것으로 이것은 환경 변수로 설정된 값을 이용한다.
{
"network" : {
"host" : "${ES_NET_HOST}"
}
}
추가적으로 설정파일에 내역을 저장하지 않고자 한다면 ${prompt.text}혹은 ${prompt.secret} 을 이용할 수 있다. 이는 foreground로 설정값을 입력하라고 묻게 된다.
${prompt.secret} 는 터미널로 입력 하도록 물어본다.
node:
name: ${prompt.text}
elasticsearch 커맨드를 실행하면 다음과 같은 프롬프트 화면을 보게 된다.
Enter value for [node.name]
# Elasticsearch는 ${prompt.text}혹은 ${prompt.secret}을 설정했을때 백그라운드로 실행하면 elasticsearch는 정상적으로 시작되지 않는다.
Index Settings
인덱스들이 생성되면 각 자신들의 설정을 제공할 수 있다. 예를 들어 다음은 인덱스를 메모리 기반의 저장소로 생성한다. 파일시스템을 생성하지 않고 말이다. 포맷은 YAML이나 JSON으로 지정이 가능하다.
$ curl -XPUT http://localhost:9200/kimchy/ -d \
'
index:
refresh_interval: 5s
'
인덱스 레벨 설정은 node레벨과 같이 설정이 가능하다. 예를 들어 elasticsearch.yml파일에서 다음과 같이 지정할 수 있다.
index :
refresh_interval: 5s
이것이 의미하는 바는 각 인덱스는 실행된 특정 노드에서 생성된 것을 획득하며, 이것은 시작시 특별히 지정하지 않으면 설정에 따라 메모리에 인덱스를 저장하게 될 것이다. 즉, 인덱스 레벨의 설정은 노드 설정에 지정된 값을 오버라이딩 한다. 물론 상단 예는 설정의 일부분이다.
$ elasticsearch -Des.index.refresh_interval=5s
모든 인덱스 레벨의 설정값은 각 인덱스 모듈에서 찾을 수 있다.
Loggin
Elasticsearch는 내부 로깅을 위한 추상화를 제공한다. log4j를 이용한다. 이것은 log4j 설정을 통해서 가능하며 YAML을 이용하여 설정한다. 그리고 로깅 설정 파일은 config/logging.yml 에 지정이 가능하다.
JSON과 properties 포맷도 지정이 가능하다. 로깅 설정 파일은 여러개를 로드 할 수 있다. 이들은 시작시에 하나로 머지된다.
logger 섹션은 자바 패키지를 포함하고 있다. 그리고 각 해당하는 로그 레벨을 지정을 할 수 있다. 이것은 org.elasticsearch 프리픽스를 사용하지 않아도 되도록 한다.
appender 섹션은 로그들의 목적지를 포함한다.
Deprecation logging
추가적으로 elasticsearch는 deprecated된 액션의 로깅을 가능하게 한다. 예를 들어 앞으로 특정 기능을 이관할 필요가 있을때 미리 결정할 수 있도록 해준다. 기본적으로 deprecation로깅은 disabled되어 있다. config/logging.yml파일 에서 DEBUG로 로그 레벨을 설정할 수 있다.
deprecation: DEBUG, deprecation_log_file
이것은 일별 롤링 로그 파일을 로그 디렉토리에 생성한다.
from : https://www.elastic.co/guide/en/elasticsearch/reference/2.1/setup-configuration.html