2.3.2 elasticsearch.yml

이 문서의 허가되지 않은 무단 복제나 배포 및 출판을 금지합니다. 본 문서의 내용 및 도표 등을 인용하고자 하는 경우 출처를 명시하고 김종민(kimjmin@gmail.com)에게 사용 내용을 알려주시기 바랍니다.

elasticsearch 실행 환경에 대한 실제 설정들은 대부분 elasticsearch.yml 파일에서 설정합니다. 확장자에서 보듯 YAML 문법으로 설정을 하기 때문에 옵션을 설정할 때는 들여쓰기에 유의해야 합니다. 예를 들어 아래의 두 방법들은 같은 설정을 나타냅니다.

config/elasticsearch.yml
path:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch
config/elasticsearch.yml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

매 라인의 들여쓰기가 정확하지 않으면 같은 레벨에 설정되어야 할 값들이 하위 레벨 설정으로 들어가는 경우가 있습니다. 또한<key>: <value>가운데에 있는 콜론:<value>값 사이에는 반드시 공백이 있어야 하며 붙여쓰게 되면 오류가 발생하기 때문에 띄어쓰기에 항상 주의해야 합니다.

elasticsearch.yml 에서 하는 주요 설정들은 다음과 같습니다. 각 설정 들의 실제 사용 예는 다음장에서 클러스터링을 설명하면서 더 자세히 다루도록 하겠습니다.

cluster.name: "<클러스터명>"

클러스터명을 설정할 수 있습니다. Elasticsearch의 노드들은 클러스터명이 같으면 같은 클러스터로 묶이고 클러스터명이 다르면 동일한 물리적 장비나 바인딩이 가능한 네트워크상에 있더라도 서로 다른 클러스터로 바인딩이 됩니다. 디폴트 클러스터명은 "elasticsearch" 이며 충돌을 방지하기 위해 클러스터명은 반드시 고유한 이름으로 설정하도록 합니다.

node.name: "<노드명>"

실행중인 각각의 elasticsearch 노드들을 구분할 수 있는 노드의 이름을 설정할 수 있습니다. 설정하지 않으면 노드명은 7.0 버전 부터는 호스트명, 6.x 이하 버전에서는 프로세스 UUID의 첫 7글자가 노드명으로 설정됩니다.

node.attr.<key>: "<value>"

노드별로 속성을 부여하기 위한 일종의 네임스페이스를 지정합니다. 이 설정을 이용하면 hot / warm 아키텍쳐를 구성하거나 물리 장비 구성에 따라 샤드 배치를 임의적으로 조절하는 등의 설정이 가능합니다.

path.data: [ "<경로>" ]

색인된 데이터를 저장하는 경로를 지정합니다. 디폴트는 Elastcisearch가 설치된 홈 경로 아래의 data 디렉토리 입니다. 배열 형태로 여러개의 경로값의 입력이 가능하기 때문에 한 서버에서 디스크 여러개를 사용할 수 있습니다.

path.logs: "<경로>"

Elasticsearch 실행 로그를 저장하는 경로를 지정합니다. 디폴트는 Elastcisearch가 설치된 홈 경로 아래의 logs 디렉토리 입니다. 실행중인 시스템 로그는 <클러스터명>.log 형티의 파일로 저장되며 날짜가 변경되면 이전 로그 파일은 뒤에 날짜가 붙은 파일로 변경됩니다.

bootstrap.memory_lock: true

Elasticsearch가 사용중인 힙메모리 영역을 다른 자바 프로그램이 간섭 못하도록 미리 점유하는 설정입니다 항상 true 로 놓고 사용하는것을 권장합니다.

network.host: <ip 주소>

Elasticsearch가 실행되는 서버의 ip 주소입니다. 디폴트는 루프백(127.0.0.1) 입니다. 주석 처리 되어 있거나 루프백인 경우에는 Elasticsearch 노드가 개발 모드로 실행이 됩니다. 만약에 이 설정을 실제 IP 주소로 변경하게 되면 그 때부터는 운영 모드로 실행이 되며 노드를 시작할 때 부트스트랩 체크를 하게 됩니다. network.host는 서버의 내/외부 주소를 모두 지정하는데 만약 내부망에서 사용하는 주소와 외부망에서 접근하는 주소를 다르게 설정하고자 하면 아래의 값 들을 이용해서 구분이 가능합니다.

  • network.bind_host : 내부망

  • network.publish_host : 외부망

그리고 network.host 설정에 사용되는 특별한 변수값이 있는데 다음과 같습니다.

  • _local_ : 루프백 주소 127.0.0.1 과 같습니다. 디폴트로 설정되어 있습니다.

  • _site_ : 로컬 네트워크 주소로 설정됩니다. 실제로 클러스터링 구성 시 주로 설정하는 값입니다.

  • _global_ : 네트워크 외부에서 바라보는 주소로 설정합니다.

실제로 클러스터를 구성할 때 설정을 network.host: _site_ 로 해 놓으면 서버의 네트워크 주소가 바뀌어도 설정 파일은 변경하지 않아도 되기 때문에 편리합니다.

http.port: <포트 번호>

Elasticsearch가 클라이언트와 통신하기 위한 http 포트를 설정합니다. 디폴트는 9200 이며, 포트가 이미 사용중인 경우 9200 ~ 9299 사이 값을 차례대로 사용합니다.

transport.port: <포트 번호>

Elasticsearch 노드들 끼리 서로 통신하기 위한 tcp 포트를 설정합니다. 디폴트는 9300 이며, 포트가 이미 사용중인 경우 9300 ~ 9399 사이의 값을 차례대로 사용합니다.

discovery.seed_hosts: [ "<호스트-1>", "<호스트-2>", ... ]

클러스터 구성을 위해 바인딩 할 원격 노드의 IP 또는 도메인 주소를 배열 형태로 입력합니다. 주소만 적는 경우 디폴트로 9300~9305 사이의 포트값을 검색하며, tcp 포트가 이 범위 밖에 설정 된 경우 포트번호 까지 같이 적어주어야 합니다. 이렇게 원격에 있는 노드들을 찾아 바인딩 하는 과정을 디스커버리 라고 합니다. 디스커버리에 대해서는 3.1 클러스터 구성 : 디스커버리 부분에서 설명하고 있습니다.

discovery.seed_hosts 옵션은 7.0 부터 추가된 기능입니다. 6.x 이전 버전에서는 대신에 젠 디스커버리를 사용했습니다. 사용 방법은 아래와 같습니다.

discovery.zen.ping.unicast.hosts: [ "<호스트-1>", "<호스트-2>", ... ]

cluster.initial_master_nodes: [ "<노드-1>", "<노드-2>" ]

클러스터가 최초 실행 될 때 명시된 노드들을 대상으로 마스터 노드를 선출합니다. 마스터 노드에 대해서는 3.3 마스터 노드와 데이터 노드 장에서 자세 다루도록 하겠습니다.

cluster.initial_master_nodes 옵션 역시 7.0 부터 추가된 기능입니다. 6.x 이전 버전에서는 최소 마스터 후보 노드를 지정하기 위해 다음 옵션을 사용했습니다. 7.0 버전 부터는 최소 마스터 후보 노드의 크기가 능동적으로 변경됩니다.

discovery.zen.minimum_master_nodes: 2

노드 실행시 지정된 환경변수를 elasticsearch.yml 에서 ${환경변수명} 형식으로 사용이 가능합니다.

config/elasticsearch.yml 에서 환경변수 사용
node.name: ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}