수평적 확장: 클러스터에 노드 추가 (스케일 아웃)
수직적 확장: 노드에 자원 추가(CPU,메모리 등)
ElasticSearch에 의해 사용하는 메모리는 힙이라고 부른다
기본설정: 256MB 할당해서 1GB까지 확장, 실 서비스에서는 전체 RAM의 절반을 할당
기본값 변경
유닉스: export ES_HEAP_SIZE=500m; bin/elasticsearch
윈도우: SET ES_HEAP_SIZE=500m & bin/elasticsearch.bat
영구적으로 변경
유닉스: bin/elasticsearch.in.sh 파일에서 #!/bin/sh 이후에 ES_HEAP_SIZE 추가
윈도우: bin/elasticsearch.bat 파일에서 #!/bin/sh 이후에 ES_HEAP_SIZE 추가
### elasticsearch.yml 프로퍼티
node.master: true #마스터 노드로 동작
node.data: true #자료를 담는 노드로 동작
discovery.zen.minimum_master_nodes #서로 연결되어야 하는 마스터로 승격이 가능한 노드의 최소 수 정의
cluster.name #기본 이름 elasticsearch
### 멀티캐스트 활성화 여부
discovery.zen.ping.multicast.enabled
discovery.zen.ping.multicast.group #멀티캐스트 요청을 위해 사용할 그룹 주소, 기본값 224.2.2.4
discovery.zen.ping.multicast.port #멀티캐스트 요청을 위해 사용될 포트, 기본값 54328
discovery.zen.ping.multicast.ttl #멀티캐스트 요청이 유효한 시간, 기본값 3초
discovery.zen.ping.multicast.address #엘라스틱서치가 바인드할 주소, 기본값 null
indices.memory.index_buffer_size #기본값 100%, 특정 노트에 존재하는 모든 색인의 샤드 사이에서 나눠 사용할 수 있는 전체 메모리 양 제어
indices.memory.min_shard_index_buffer_size #기본값 4mb, 샤드별 최소 색인 버퍼값 설정
index.refresh_interval #기본값 1s(1초), 색인 검색기 객체는 얼마나 자주 새로 고쳐야 하는지명세
threadpool.index.type: cache #들어오는 요청에 대해 스레드를 생성하는 한계가 없는 스레드 풀
threadpool.index.type: fixed #크기가 고정된 스레드 풀
threadpool.index #색인과 삭제 연산에 쓰인다. 기본값의 타입은 fixed, 크기는 가용 프로세서 수, 큐 크기는 300
threadpool.search #검색과 수를 세기 위한 요청에 쓰인다. 기본값의 타입은 fixed, 크기는 가용 프로세서 수*3, 큐 크기는 1000
threadpool.suggest #제안 요청을 위한 스레드, 기본값의 타입은 fixed, 크기는 가용 프로세서 수, 큐 크기는 1000
threadpool.get #실시간 get 요청에 쓰인다. 기본값의 타입은 fixed, 크기는 가용 프로세서 수, 큐 크기는 1000
threadpool.bulk #대량 연산을 위한 스레드 풀, 기본값의 타입은 fixed, 크기는 가용 프로세서 수, 큐 크기는 50
threadpool.percolate #예상 검색 요청을 위한 스레드 풀, 기본값 타입은 fixed, 크기는 가용 프로세서 수, 큐 크기는 1000
### 유니캐스트를 사용하기 위해 클러스터를 형성하는 모든 호스트 명세
discovery.zen.ping.unicast.hosts
discovery.zen.ping.unicast.hosts: 192.168.2.1:[9300-9399], 192.168.2.2:[9300-9399]
cluster.routing.allocation.allow_rebalance: indices_all_active
#indices_all_active: 기본값, 모든 샤드와 레플리카가 초기화되고 나서 균형잡기 시작
#always: 필요한 즉시 균형잡기 바로 시작
#indices_primaries_active: 모든 주 샤드가 초기화되고 균형잡기 시작
cluster.routing.allocation.cluster_concurrent_rebalance #전체 클러스터를 대상으로 한 번에 노드 사이에서 옮길 수 있는 샤드 수 지정
cluster.routing.allocation.node_concurrent_recoveries #단일 노드에서 동시에 초기화하는 샤드 수 설정
cluster.routing.allocation.node_initial_primaries_recoveries #노드에서 동시에 초기화하는 주 샤드 수 제어
cluster.routing.allocation.enable: all
#all: 기본값, 모든 샤드 유형을 할당할 수 있다
#primaries: 주 샤드만 할당할 수 있다
#new_primaries: 새롭게 생성된 주 샤드만 할당할 수 있다
#none: 샤드 할당을 비활성화
indices.recovery.concurrent_streams #샤드 집합에서 샤드를 복구하기 위해 한번에 노드에서 열릴 수 있는 스트림 수 제어
node.zone
index.routing.allocation.include.zone
index.routing.allocation.exclude.zone #할당에서녿 배체
index.routing.allocation.require.size #노드 할당 규칙
index.routing.allocation.require.zone #노드 할당 규칙
index.routing.allocation.include._ip #IP 기반 샤드 할당 활성화
cluster.routing.allocation.disk.threshold_enabled #디스크 기반 샤드 할당 활성화
cluster.info.update.interval #디스크 기반 샤드 할당 구성 방법1
cluster.routing.allocation.disk.watermark.low #디스크 기반 샤드 할당 구성 방법2
cluster.routing.allocation.disk.watermark.high #디스크 기반 샤드 할당 구성 방법3
cluster.routing.allocation.include._ip #클러스터 IP기반 색인 배치
index.routing.allocation.total_shards_per_node #단일 노드에 위치 가능한 샤드의 최대 수 지정
discovery.zen.fd.ping_interval #노드가 동작하고 응답하는지 점검하기 위해 전송되는 시그널(핑ping) 주기, 기본값 1s(1초)
discovery.zen.fd.ping_timeout #기본값 30s(30초), 핑 응답을 기다릴 시간
discovery.zen.fd.ping_retries #기본값 3, 재시도 수
### 색인과 메타데이터를 지역 파일시스템에 저장
gateway.type: local #fs, hdfs, s3 옵션이 있다
# 모든 샤드와 레플리카를 초기화하는 과정, 트랜잭션 로그에서 모든 자료를 읽어 샤드에 적용
# 엘라스틱서치는 클러스터에 속한 노드 수가 10이 되면 즉시 복구 프로세스 시작
gateway.expected_nodes: 10
# 프로퍼티에 설정된 값과 클러스테에 합류한 노드 수가 8이 된 직후 복구 시작
gateway.recover_after_nodes: 8
# 클러스터가 형성된 다음 10분 후 게이트웨이 복구
gateway.recover_after_time: 10m
# 마스터로 승격이 가능한 자격을 갖춘 노드가 얼마나 많이 존재해야 복구 가능한지 명세
gateway.recover_after_master_nodes
# 클러스터 자료 노드가 얼마나 많이 존재해야 복구 가능한지 명세
gateway.recover_after_data_nodes
# 마스터로 승격이 가능한 자격을 갖춘 노드가 얼마나 많이 존재해야 복구 가능한지 명세
gateway.expected_master_nodes
# 클러스터에 자료 노드가 얼마나 많이 존재해야 하는지 명세
gateway.expected_data_nodes
### 벌크 스레드 풀 설정
threadpool.bulk.type: fixed
cache threadpool.bulk.size: 40
threadpool.bulk.queue_size: 200
### 서킷 브레이커, 메모리 부족 에러 방지를 위해 인위적인 임계치
indices.breaker.total.limit: 기본값은 힙의 70%
indices.breaker.fielddata.limit: 기본값은 힙의 60%
indices.breaker.request.limit: 기본값은 힙의 40%
### 분석 필드
index_options:positions 기본값, 위치 저장
index_options:freqs 위치 색인 비활성화
index_options:docs 빈도 색인 X
### 동적 매핑 비활성화
index.mapper.dynamic:false
### 스왑 방지
bootstrap.mlockall:true
### 개별 노드의 설정을 사용하여 특정 태그값을 가진 노드에만 위치할 색인을 생성하여 더 많은 힙 이외의 메모리를 가진 노드에 위치, 색인에 대한 응답시간 향상
index.routing.allocation.include.tag: 태그명1,태그명2...
### 데이터 새로고침 주기
index.refresh_interval:1s
### 트랜잭션 로깅 traslog
# 샤드별 구조체로 로그 선행 기입 목적으로 사용된다 (최대 5,000개 연산을 200mb 크기까지 보존)
index.translog.flush_threshold_ops: 트랜잭션 로그에 저장될 최대 연산 수
index.translog.flush_threshold_size: 트랜잭션 로그의 최대 크기
### 할당 인식 Allocation Awareness
# 데이터의 복제본이 어디에 위치할지에 대한 인지 상태, 클러스터의 위상 topology 설계.
# 샤드 기반 할당: 메타데이터 키가 할당 인식 파라미터
cluster.routing.allocation.awareness.attributes:rack
node.rack:1
# 강제 할당 인식
cluster.routing.allocation.awareness.attributes:zone
cluster.routing.allocation.force.zone.values:us-east,us-west
부트스트랩 체크 과정
힙 크기 체크 Heap size check
jvm 옵션 -Xms, -Xmx 설정 Memory Lock과 관련 있음
파일 디스크립터 체크 File descriptor check
메모리 락 체크 Memory lock check
최대 스레드 수 체크 Maximum number of threads check
최대 가상 메모리 크기 체크 Maximum size virtual memory check
가상 메모리 크기를 무제한(unlimit)으로 설정
최대 파일 크기 체크 Max file size check
mmap 카운트 체크 Maximum map count check
클라이언트 JVM 체크 Client JVM check
Serial Collector 사용 여부 체크
Serial CG를 사용하지 않도록 검사
시스템 콜 필터 체크 System call filter check
OnError, OnOutOfMemoryError 체크
OnError, OnOutOfMemoryError 옵션이 설정되어 있으면 안된다
Early-access 체크
G1GC 체크
G1GC를 사용할 경우 JVM이 JDK 8u40 이후 버전인지 체크
All Permission 체크
* 주의사항
- JVM(Java Virtual Machine) 힙 메모리 제약 ES_HEAP_SIZE 값을 1024보다 크게 설정, 전체 시스템 메모리의 50%가 넘지 않아야 한다.
- 샤드 크기가 10GB 이상은 되지 않아야 한다
- 노드의 최적 수치: 노드의 개수/2 + 1
(node.master = false, node.data = false 의 경우 검색 로드 밸런스(노드에서 데이터를 읽어오고 결과를 집계하는 등등)처럼 역할)
- 일반적으로 엘라스틱서치 운영 중인 jvm 프로세스에 전체 가용 메모리의 50~60 퍼센트를 넘어가는 메모리 할당 금지
- jvm 힙 크기 재조정을 피하기 위해 Xmx, Xms 인수를 동일 값으로 설정하는 것이 바람직
- 일반적으로 64비트 운영체제를 사용한다면 mmafs 선택, 유닉스 기반 시스템에서는 niofs를 윈도 기반 시스템에서는 simplefs 선택
- 색인 새로고침 주기는 되도록 길게 설정
- 스레드 풀 조율
- 병합 과정 조율, 질의를 빠르게 하려면 색인에 대한 세그먼트 수를 줄여야 한다, 색인이 빨라지려면 색인에 대한 세그먼트 수를 늘려야 한다 양쪽의 절충 지점을 찾아 내는것이 중요
- 필드 자료 캐시에 한계가 없어 메모리 부족 오류 문제 방지를 위해 필드 자료 캐시 크기를 제한하거나 회로 차단기를 사용해 예외를 던지도록 처리
- 색인을 위한 RAM 버퍼는 10 퍼센트 정도를 기본으로 설정한다
- 트랜잭션 로깅 조율, 트랜잭션 로그에 쌓인 정보를 처리하여 샤드 초기화가 느려지는 현상 개선
노드 해제
노드를 먼저 해체하여 해당 노드에 있는 모든 샤드를 클러스터의 다른 노드로 옮긴다
curl -XPUT localhost:9200/_cluster/settings -d '{
"transient": {
"cluster.routing.allocation.exclude._ip": "ip주소.."
}
}'
주와 레플리카 존재하는 세그먼트 파일을 동일한 것으로 만들기 위한 방법
주와 레플리카 샤드 몯에서 하나의 큰 세그먼트 파일을 만들어내기 위한 optimize API 사용
레플리카 수를 0으로 변경했다가 다시 큰 수로 변경
노드의 종류
Single Node 모드
검색 클러스터 규모가 작을 때 모든 노드가 동일하게 동작하는 것이 유리, 3대 이하의 소규모 클러스터 구축시 모든 노드를 Single Node 모드로 동작하는 것이 유리
Master Node 모드
인덱스 생성, 변경, 삭제 담당. 노드의 상태를 주기적으로 점검해서 장애에 대비
클러스터의 상태(현재 설정값, 샤드, 색인, 노드들의 상태)를 관리하는 역할
Data Node 모드
데이터를 보관하고 데이터의 CURD, 검색, 집계 등 담당. 대용양 저장소(Storage) 필요, 고성능의 CPU, 메모리 갖춘 서버 사용하는 것이 좋음
Ingest Node 모드
다양한 형태의 데이터 색인 시 데이터 전처리 담당, Single Node의 경우에도 기본 옵션으로 Ingest 기능 사용 가능
Coordination Node 모드
사용자의 요청을 받아 처리하는 코디네이터 모드, 노드 관련 속성을 모두 false로 설정
연산에 대한 통제가 불가능한 상황이라면 시스템 전체의 장애를 방지하기 위해 Coordination 노드 별도 구축 대량의 데이터를 처리해야 하는 집계 연산이 많은 경우에는 반드시 전용 Coordination 노드로만 요청 받기
'ElasticSearch' 카테고리의 다른 글
ES Rolling Restart (0) | 2022.09.12 |
---|---|
ES 질의 (0) | 2022.08.30 |
ES 플러그인 (0) | 2022.08.30 |
ES 하이라이팅 (0) | 2022.08.30 |
ES 클러스터 (0) | 2022.08.30 |