# 2.3.2 elasticsearch.yml

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

{% code title="config/elasticsearch.yml" %}

```yaml
path:
    data: /var/lib/elasticsearch
    logs: /var/log/elasticsearch
```

{% endcode %}

{% code title="config/elasticsearch.yml" %}

```yaml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
```

{% endcode %}

{% hint style="danger" %}
&#x20; 매 라인의 들여쓰기가 정확하지 않으면 같은 레벨에 설정되어야 할 값들이 하위 레벨 설정으로 들어가는 경우가 있습니다. 또&#xD55C;**`<key>: <value>`**&#xAC00;운데에 있는 콜&#xB860;**`:`**&#xACFC;**`<value>`**&#xAC12; 사이에는 반드시 공백이 있어야 하며 붙여쓰게 되면 오류가 발생하기 때문에 띄어쓰기에 항상 주의해야 합니다.
{% endhint %}

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

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

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

### node.name: "<노드명>"

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

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

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

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

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

### path.logs: "<경로>"

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

### bootstrap.memory\_lock: true

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

### network.host: \<ip 주소>

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

* `network.bind_host` : 내부망
* `network.publish_host` : 외부망

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

* `_local_` : 루프백 주소 127.0.0.1 과 같습니다. 디폴트로 설정되어 있습니다.
* `_site_` : 로컬 네트워크 주소로 설정됩니다. 실제로 클러스터링 구성 시 주로 설정하는 값입니다.&#x20;
* `_global_` : 네트워크 외부에서 바라보는 주소로 설정합니다.

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

### http.port: <포트 번호>

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

### transport.port: <포트 번호>

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

### discovery.seed\_hosts: \[ "<호스트-1>", "<호스트-2>", ... ]

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

{% hint style="warning" %}
**discovery.seed\_hosts** 옵션은 7.0 부터 추가된 기능입니다. 6.x 이전 버전에서는 대신에 젠 디스커버리를 사용했습니다. 사용 방법은 아래와 같습니다.

**discovery.zen.ping.unicast.hosts: \[ "<호스트-1>", "<호스트-2>", ... ]**
{% endhint %}

### cluster.initial\_master\_nodes: \[ "<노드-1>", "<노드-2>" ]

&#x20; 클러스터가 최초 실행 될 때 명시된 노드들을 대상으로 마스터 노드를 선출합니다. 마스터 노드에 대해서는 [3.3 마스터 노드와 데이터 노드](https://esbook.kimjmin.net/03-cluster/3.3-master-and-data-nodes) 장에서 자세 다루도록 하겠습니다.

{% hint style="warning" %}
**cluster.initial\_master\_nodes** 옵션 역시 7.0 부터 추가된 기능입니다. 6.x 이전 버전에서는 최소 마스터 후보 노드를 지정하기 위해 다음 옵션을 사용했습니다. 7.0 버전 부터는 최소 마스터 후보 노드의 크기가 능동적으로 변경됩니다.

**discovery.zen.minimum\_master\_nodes: 2**
{% endhint %}

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

{% code title="config/elasticsearch.yml 에서 환경변수 사용" %}

```yaml
node.name: ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}
```

{% endcode %}
