Elastic Search

[Elasticsearch] 설정 관련 정리

꾸준함. 2022. 11. 16. 20:56

개요

Elasticsearch 주요 구성 및 설정을 간단하게 정리해보겠습니다.

저도 아직 공부 중이기 때문에 부정확한 정보가 있을 경우 댓글로 알려주시면 즉시 수정하도록 하겠습니다!

 

1. 설정 우선순위

모든 설정은 Static이나 Dynamic 속성을 가지며 우선순위는 Transient > Persistent > elasticsearch.yml > Default  순

 

1.1 Transient

 

  • 1회성 설정
  • 클러스터 재시작할 경우 리셋

 

 

1.2 Persistent

 

  • 영구적인 설정
  • 클러스터 재시작하더라도 유지

 

 

1.3 elasticsearch.yml

 

  • 해당 설정은 로컬 구성으로만 사용하는 것을 권고
  • dynamic 설정을 통해 클러스터 설정을 관리
    • static 설정의 경우 elasticsearch.yml에 구성하며, 클러스터가 시작하기 전에 설정되어야 함
  • 각 노드 별로 설정이 다를 경우 문제 발생할 수 있으므로 주의

 

 

1.4 Default

 

  • 코드 상에 정의되어 있는 설정

 

 

2. 주요 설정

elasticsearch에는 워낙 다양한 설정이 있기 때문에 현실적으로 모든 설정을 커버하는 것은 어렵습니다.

따라서, 주요 설정 위주로 간단하게 정리해볼 것이며 나머지 설정의 경우 공식 사이트에서 제공하는 문서를 참고하는 것을 추천드립니다.

 

 

2.1 Path settings

 

  • path.data, path.logs 설정을 통해 인덱스 데이터와 로그 데이터에 대한 저장소 설정 진행
  • path.data는 해당 노드에서 세그먼트 파일들을 저장할 위치
  • path.log는 elasticsearch 실행 중 발생하는 로그들이 저장될 위치

 

 

2.2 Cluster name setting

 

  • cluster.name
    • 클러스터명을 설정하는 옵션
    • 같은 클러스터로 묶으려는 node들은 모두 같은 클러스터명으로 설정해줘야 함
    • 이 값을 변경하기 위해서는 클러스터 내 전체 노드들에 대해서 설정을 변경해줘야 하기 때문에 재기동이 필수

 

 

2.3 Node setting

 

  • node.name
    • 노드의 이름을 설정하는 옵션
    • 이 값은 클러스터 내에서 unique 해야 함
    • 이 값 또한 실행 중에는 변경이 불가능하며 변경을 위해서는 재기동이 필수
  • node.attr.rack
    • 노드가 속한 rack을 표시해주는 옵션 (default 값은 r1)
    • 해당 옵션을 통해 IDC 내 서로 다른 랙이나 IDC 간 HA 구성 가능
    • Elasticsearch는 해당 값을 통해 primary shard와 replica shard를 서로 다른 랙에 분배해주기 때문에 장애 대응에 용이

 

 

2.4 Network host settings

 

  • 외부 요청과 노드 간의 통신에 사용할 IP 주소를 설정하는 옵션
  • network.host 설정을 통해 local, dev 환경에서는 localhost와 같은 루프백 주소만 바인딩되지만 prod 환경에서는 일반적인 네트워크 설정으로 구성
  • 해당 설정은 외부와의 통신을 위한 network.bind_host와 클러스터 내 노드 간의 통신을 위한 network.publish_host 두 개의 옵션으로 구분 가능
    • network.bind_host: API와 같은 클라이언트 호출 등을 위한 외부 통신에 사용되는 IP
    • network.publish_host: 클러스터 내 node 간의 통신을 위한 IP
  • x.x.x.x의 IP를 쓰는 node에서 network.host 값을 해당 IP로 설정할 경우 테스트 스크립트의 경우 localhost라는 호스트를 통한 호출을 할 수가 없기 때문에  각 노드 별로 테스트 스크립트를 다르게 작성해주어야 하는 케이스 발생 가능
    • 이러한 이유로 network.host를 0.0.0.0으로 설정한다면 localhost는 사용할 수 있게 되겠지만 multi-nodes 클러스터를 구성한다면 노드 간의 통신에서 서로 0.0.0.0으로 통신하려는 상황 발생
    • 이럴 경우 network.bind_host와 network.publish_host 설정을 통해 세부적 설정을 부여하면 됨
    • network.bind_host는 0.0.0.0으로 network.publish_host는 node IP인 x.x.x.x로 설정하면 localhost도 사용할 수 있고 노드 간 통신도 가능

 

 

2.5 Discovery setting

 

  • discovery.seed_hosts, cluster_initial_master_nodes 설정은 prod 환경으로 넘어갈 때 중요한 설정
  • discovery.seed_hosts
    • elasticsearch 7.0부터 추가된 옵션 (6.X 언더에서는 discovery.zen.ping.unicast.hosts 옵션 사용)
    • master 후보 노드들의 주소 리스트
    • 전체 노드가 아닌 master eligible, 즉 마스터 후보만 등록하는 옵션
  • cluster_initial_master_nodes
    • elasticsearch 7.0부터 추가된 옵션 (6.X 언더에서는 discovingest.zen.minimum_master_nodes 옵션 사용)
    • master 후보가 될 수 있는 노드들의 리스트
  • 클러스터의 노드들을 검색할 수 있는 정보와 마스터 노드를 선택할 수 있는 정보 구성

 

 

2.6 JVM.options settings

 

  • Heap size settings
    • System 리소스의 50%로 구성
    • 31GB가 넘어가지 않도록 구성
    • 설정은 환경변수로 설정하거나 jvm.options 파일을 수정 (ES_JAVA_OPTS="-Xms2g-Xmx2g"
  • JVM heap dump path setting
    • Heap OOM 에러 발생 시 heap dump 로그를 남기기 위한 경로 설정
    • 굳이 수정하지 않고 디폴트 값을 사용하는 케이스가 대부분
  • GC logging settings
    • 기본 설정은 GC 옵션이 enable
    • 기본값을 그대로 사용하는 케이스가 대부분
  • Temporary directory settings
    • JVM에서 사용하기 위한 tmp 경로 설정
    • ES_TMPDIR 환경변수로 설정하거나 jvm.options에서 설정
    • 설정하지 않을 경우 Elasticsearch 내 TempDirectory 클래스를 통해 생성

 

 

2.7 Cluster backups

 

  • 장애 발생할 경우 데이터 유실을 예방하기 위한 설정으로 SLM(Snapshot Lifecycle Management)을 통해 백업

 

 

2.8 Memory settings

 

  • bootstrap.memory_lock
    • 메모리 swap을 끄기 위한 옵션
    • 해당 설정을 사용하기 위해서는 system에서 memlock 제한을 해제해주어야 함
    • /etc/security/limits.conf에 아래 내용 추가 필수

 

* soft memlock unlimited
* hard memlock unlimited

 

3. 기타 설정

 

 

3.1 Circuit Breaker Settings (NodeScope)

 

OOM 에러가 발생하지 않도록 안전장치를 걸어두는 설정 (MSA의 Circuit Breaker와는 다름)

기본 값으로 검증된 설정값이 적용되어 있기 때문에 Default 값을 그대로 사용해도 좋지만 문제가 발생할 경우 설정 튜닝이 필요할 수 있습니다.

 

 

3.1.1 Parent Circuit Breaker

 

전체 heap size에 대한 limit를 거는 설정

  • indices.breaker.total.use_real_memory의 디폴트 값은 true
  • indices.breaker.total.limit 값이 false일 경우 70%로 설정되고 true일 경우 95%로 설정

 

 

3.1.2 Field Data Circuit Breaker

 

Field data cache (aggregation, sorting에 활용)를 사용할 경우 과도한 heap memory 사용 방지 목적

  • indices.breaker.fielddata.limit의 값은 기본 JVM Heap size의 40%로 설정
  • indices.breaker.fielddata.overhead
    • 기본 40%로 설정하지만 실제 도달하면 heap memory가 부족할 수 있기 때문에 voerhead 설정을 통해 미리 차단 (기본 값은 1.03)
    • 즉, fielddata 크기가 1이면 1.03으로 집계

 

 

3.1.3 Request Circuit Breaker

 

Aggregation과 같은 요청에서 메모리 사용량 초과 방지 목적

  • 기존에 정리했던 내용(https://jaimemin.tistory.com/1544)이 해당 설정 때문에 발생
  • indices.breaker.request.limit는 기본 JVM Heap 크기의 60%로 설정
  • indices.breaker.total.limit 기본 값은 1

 

 

3.2 Cluster-level Shard Allocation/Routing Settings

 

  • 샤드를 노드에 어떻게 할당할 것인지에 대해 정의하는 설정
  • recovery, replica, allocation, rebalancing 등이 클러스터 내 노드가 추가/삭제될 때 발생
  • 마스터 노드는 이와 같이 클러스터를 운영/관리하기 위해 샤드들을 어떤 노드에 할당하고 이동시킬지를 결정
  • 클러스터 재기동 시 shard recovery와 rebalancing 때문에 재시작이 되지 못하고 빈번하게 죽거나 재시작되는 현상이 발생할 수 있음
    • 재기동할 때는 환경에 맞는 절차를 만들어 놓고 실행 필요

 

 

3.2.1 Cluster-level Shard Allocation Settings

 

  • cluster.routing.allocation.enable
    • 노드가 재시작될 때 local primary shard에 대한 recovery에 영향을 주지 않으며 할당되지 않은 replica shard에 대한 primary shard를 즉시 recovery 함
    • cluster-level shard allocation 옵션 중 하나로 특정 종류의 샤드에 대한 할당 활성화/비활성화
      • all: 디폴트 설정으로 모든 종류의 샤드에 샤드 할당 허용
      • primaries: primary shard에 대해서만 샤드 할당 허용
      • new_primaries: 새 인덱스의 primary 샤드에 대해서만 할당 허용
      • none: 모든 인덱스에 대해 어떤 종류의 할당도 허용 X
  • cluster.routing.allocation.node_concurrent_recoveries
    • 노드에서 동시에 수행할 recovery 크기 설정
  • cluster.routing.allocation.node_concurrent_incoming_recoveries
    • 디폴트 값 2개
  • cluster.routing.allocation.node_concurrent_outgoing_recoveries
    • 디폴트 값 2개
  • cluster.routing.allocation.node_initial_primaries_recovories
    • 각 노드당 primary shard recovery에 대한 초기 크기를 설정
    • 디폴트 값 4개
  • cluster.routing.allocation.same_shard.host
    • 하나의 장비에 여러 개의 elasticsearch 인스턴스를 구성할 때 같은 shard가 위치할 수 있도록 설정
    • 디폴트 값은 false로 같은 샤드 배치 불가능

 

 

3.2.2 Shard Rebalancing Settings

 

  • cluster.routing.rebalance.enable
    • rebalance를 적용할 대상을 지정
    • 옵션: all(default), primaries, replicas, none
  • cluster.routing.allocation.allow_rebalance
    • rebalance에 대한 동작을 허용할 대상을 지정
    • 옵션: always, indices_primaries_active, indices_all_active(default)
  • cluster.routing.allocation.cluster_concurrent_rebalance
    • 클러스터 기준으로 동시에 rebalancing 할 shard의 수를 설정 (기본 2개)

 

 

3.2.3 Disk-based Shard Allocation Settings

 

노드에 있는 disk의 용량에 따라 shard를 배치시키는 설정

Elasticsearch의 경우 가장 많이 경험하는 오류가 disk full에 따른 장애

-> elasticsearch 내 log를 모니터링해서 watermark 오류 에러나 경고 발생 시 즉시 대응하거나

-> 상시 disk usage를 모니터링하여 예방 필요

 

  • cluster.routing.allocation.disk.threshod_enabled
    • default 값이 true이며 disk allocation decider 사용
  • cluster.routing.allocation.disk.watermark.low
    • 기본 disk usage 85%로 구성
    • 85%가 되면 shard가 더 이상 할당되지 않지만 해당 설정은 새로 만들어지는 primary shard에 대해서는 적용이 되지 않고 replica shard에 대해서만 적용
    • usage가 아닌 남아있는 여유 공간 설정으로도 가능
  • cluster.routing.allocation.disk.watermark.high
    • 기본 disk usage 90%로 구성
    • 초과 시 노드에 있는 사드 재배치 시도
    • usage가 아닌 남아있는 여유 공간 설정으로도 가능
  • cluster.routing.allocation.disk.watermark.flood_stage
    • 기본 disk usage 95%로 구성
    • disk usage가 설정을 넘은 노드가 있으면 읽기 전용으로 자동 전환
    • disk usage가 떨어지게 되면 자동으로 해제
  • cluster.info.update.interval
    • 30초 간격으로 disk usage 점검

 

 

3.2.4 Shard Allocation Awareness Settings

 

Elasticsearch는 shard를 할당할 때 물리적 하드웨어 구성 적용 가능합니다.

앞서 언급한 node.attr.* 설정을 이용해 같은 rack에 구성하거나 같은 zone에 구성되도록 지정 가능합니다.

 

  • node.attr.rack_id
    • node.attr.rack_id: rack_one
    • bin/elasticsearch -Enode.attr.rack_id=rack_one
  • node.attr.attributes
    • cluster.routing.allocation.awareness.attributes: rack_id
    • master 역할을 수행하는 모든 노드의 elasticsearch.yml에 정의하거나 cluster update settings를 이용해 적용
  • node.attr.force
    • 노드가 사용 가능할 때까지 replica shard의 할당이 되지 않도록 설정 가능
    • cluster.routing.allocation.awareness.attributes: zone
    • cluster.routing.allocation.awareness.force.zone.values: zone1, zone2

 

 

3.3 Index Recovery Settings

 

해당 설정은 샤드를 재생성하거나 재할당할 경우 primary shard를 기준으로 복구하며 개별 노드로의 in/out bound 크기의 총량으로 설정

 

  • indices.recovery.max_bytes_per_sec
    • 디폴트 크기는 40 MB/s

 

 

3.4 Indexing Buffer Settings

 

해당 설정은 색인 요청 문서를 in-memory로 담아서 빠르게 처리하기 위해 사용됩니다,

memory buffer에 꽉 차면 segment 파일로 내려쓰고,

대량으로 색인 또는 빈번한 색인 요청이 많을 경우 색인 성능이 나오지 않을 때 도움 되는 설정입니다.

(대부분의 색인 성능은 Disk I/O 영향을 가장 많이 받는 것이 특징)

 

  • indices.memory.index_buffer_size
    • 디폴트 크기는 노드에 할당된 heap size의 10%이며 모든 샤드에서 buffer를 공유해서 사용

 

 

3.5 Node Query Cache Settings

 

해당 설정은 쿼리 호출 시 filter context를 이용해서 질의 결과를 cache 하도록 하는 설정입니다.

노드 당 하나씩 존재하며, LRU 정책이 적용됩니다.

Cache 설정은 세그먼트 당 10,000개의 문서 또는 heap size의 10%를 사용하며 세그먼트가 merge 될 경우 캐시 된 결과가 더 이상 유효하지 않습니다.

Elasticsearch에서는 Field data cache도 제공하는데 해당 캐시는 fielddata circuit breaker 설정에 영향을 받습니다.

디폴트 field data cache 크기 설정은 무제한입니다.

 

  • indices.queries.cache.size
    • 기본 heap size의 10%

 

 

3.6 Search Settings

 

해당 설정은 검색에 대한 전역 설정과 aggregation에 대한 제한을 구성하는 설정입니다.

 

  • indices.query.bool.max_clause_count
    • Lucene 기준의 boolean query 절에 포함될 수 있는 최대 절 수
    • default 1,024절
    • 설정이 너무 커질 경우 CPU, Memory에 대한 자원 소모가 증가하며 서능이 저하되므로 default 값을 쓰는 것을 추천
  • search.max_buckets
    • 단일 응답에 허용되는 최대 aggregation bucket의 수
    • default 65,535개
  • indices.query.bool.max_nested_depth
    • boolean query에서 사용하는 최대 nested 깊이를 정의
    • default 20개

 

 

3.7 Thread Pools Settings

 

기본 설정 수정하는 케이스는 거의 없으나 단일 instance 사양이 극도로 high spec이라 elasticsearch를 여러 개 실행시킬 경우 프로세서의 크기를 나누어서 설정하는 것을 추천드립니다.

 

4. 비고

장애 발생할 경우 문제 되는 노드에 샤드 할당되는 것을 방지하는 방법

  • 특정 노드에만 장애 발생했을 경우 해당 노드만 exclude 시켜 신규 생성 인덱스에 대한 샤드 할당 방지

 

PUT _cluster/settings
{
	"transient": {
    	"cluster.routing.allocation.exclude_ip": "장애발생노드 IP"
    }
}

 

주요 시스템 설정

 

 

1. 시스템의 자원 사용 제한 조정

  • 1회성 설정으로 cluster 재기동 시 리셋

 

 

2. Virtual Memory

  • elasticsearch에서는 mmapfs 구조를 사용하기 때문에 shard 색인 정보를 메모리에 저장해서 효과적으로 사용
  • vm.max_map_count 디폴트 값은 262,144

 

 

3. Disable Swapping

  • heap을 사용하기 때문에 swap을 사용할 필요 X

 

 

 4. Bootstrap Checks

  • Elastic 사에서 가지고 있는 경험을 기반으로 중요한 설정에 대해서 점검을 해주는 기능

 

5. 참고

패스트캠퍼스 - The RED: 검색엔진 구축을 위한 Elasticsearch 마스터 클래스 by 정호욱

 

https://velog.io/@yaincoding/elasticsearch.yml-%EC%A3%BC%EC%9A%94-%EC%84%A4%EC%A0%95%EB%93%A4

 

elasticsearch.yml 주요 설정들

elasticsearch.yml 파일은 ElasticSearch의 기본 환경 설정 파일이다.elasticsearch는 버전 업그레이드가 빠르기 때문에 이 내용이 언제까지 유효할지 알 수 없다.아래 링크는 엘라스틱서치 한글 가이드북이

velog.io

https://jx2lee.github.io/es-shard-allocation/

 

[Elasticsearch] Shard Allocation | gohard

ES 재배포 과정 중 shard allocation 과정이 있어 이에 대해 정리하고자 한다. 재배포를 하게된 배경 21년 최고 히트 log4j 취약점 발생 이를 위해 jvm 옵션을 변경하거나 log4j-core JAR 에서 JndiLookup class 를

jx2lee.github.io

https://jjeong.tistory.com/1035

 

[Elasticsearch] shard allocation 운영 테스트용 REST 코드 - 1.6.0 이상.

작성하고 보니 최신 내용을 반영할걸 이라는 후회가 밀려 오내요.이전 글 http://jjeong.tistory.com/1034 이거는 사실 deprecated 예정입니다.코드에도 명시되어 있어서.. ^^;; 아래 코드로 변경 합니다.참고

jjeong.tistory.com

https://dol9.tistory.com/276

 

Elasticsearch shard 할당 방식을 정리해보자

최근 사내에서 사용하고 있는 Elasticsearch를 별다른 설정 없이 쓰다 보니 종종 인덱스/샤드 관련 문제가 생겨서 shard allocation 관련 학습 필요성이 생겼다. Elasticsearch Shard allocation 공식 문서와 AWS의

dol9.tistory.com

 

반응형

'Elastic Search' 카테고리의 다른 글

Elasticsearch 공부 정리 - 4  (2) 2022.12.08
Elasticsearch 공부 정리 - 3  (0) 2022.12.05
[Elasticsearch] Components 정리  (5) 2022.10.12
[Elasticsearch] Lucene 간단 정리  (0) 2022.06.04
[Elasticsearch] update by query 정리  (0) 2021.07.22