엘라스틱 서치 운영
2023.09.07 - [Engineering WIKI/Book] - 기초부터 다지는 엘라스틱서치 운영 (1 ~ 2장) / 훑어보기 및 기본동작
2023.09.29 - [Engineering WIKI/Book] - 기초부터 다지는 엘라스틱서치 운영 (3 ~ 4장) / 모니터링 및 기본개념
핵심 개념
elasticsearch.yml
- ElasticSearch를 구성하기 위해 기본이 되는 환경설정 파일
클러스터 영역
- 클러스터를 구성할 때는 클러스터를 구성할 노드들이 모두 동일한 클러스터의 이름을 사용해야 함.
- 클러스터의 이름을 변경하려면 클러스터 내의 모든 노드를 재시작해야 하기 때문에 신중하게 설정해야 함.
노드 영역
- 이 설정은 해당 노드에만 적용되는 설정
- node.name: ${HOSTNAME}
Path 영역
- Paths 영역은 데이터와 로그의 저장 위치와 관련된 설정
- path.data < 노드가 가지고 있을 문서들을 저장할 경로를 설정
- path.logs < ES에서 발생하는 로그를 저장할 경로
네트워크 영역
- 네트워크 영역은 ES 애플리케이션이 외부와 통신할 때 사용하게 될 IP 주소를 설정하는 항목
- 클러스터를 실제로 구축할 때는 대부분 network.host 항목을 설정하기 보다는 network.bind_host와 network.publish_host 두 개의 항목을 따로 설정 함
- 클러스터 내부에서 노드 간 통신은 자신의 IP를 사용해야 한다는 것을 알 수 있다. 따라서 클라이언트의 요청을 처리하기 위한 IP인 network.bind_host는 0.0.0.0으로, 클러스터 내부의 노드 간의 통신에 사용하기 위한 IP인 network.publish_host는 자신의 노드 IP로 설정해야 한다.
Discovery 영역
- 노드 간의 클러스터링을 위해 필요한 설정
- ES가 최초 구동될 때 애플리케이션은 elasticsearch.yml 파일 안에 있는 Discovery 영역을 읽어서 어떤 노드들과 클러스터링을 구축하게 되는지 정보를 확인 함
- discovery.zen.minumum_master_nodes라는 매우 중요한 설정이 있음. 이 값은 클러스터를 유지하기 위한 최소한의 마스터 노드 대수를 의미함. 또한, split brain 현상을 방지하는 데 반드시 필요한 설정임.
- split brain 현상이란?
- 3대의 마스터 노드와 3대의 데이터 노드로 구성된 클러스터가 있다고 가정해 보자. 이 클러스터는 minimum_master_nodes를 따로 설정하지 않고, 기본값인 1로 사용하고 있다. 이 상황에서 네트워크 장애가 발생하여 A,B 마스터노드와 C 마스터 노드 간의 통신이 끊어진다면 서로 다른 마스터 노드를 가진 두 개의 클러스터가 생겨날 수 있다. 두 클러스터 모두 클러스터를 유지하기 위한 최소한의 마스터 노드 개수가 1이기 때문이다. 이것을 split brain 현상이라고 한다.
- 위와 같은 이유 때문에 ES에서는 discovery.zen.minumum_master_nodes값을 과반수로 설정하도록 권고하고 있다.
Gateway 영역
- Gateway 설정은 클러스터 복구와 관련된 내용을 포함함.
- ES 클러스터 내의 노드를 전부 재시작할 때 최소 몇 개의 노드가 정상 상태일 때 복구를 시작할 것인지 설정
Various 영역
- action.destructive_requires_name: true
- 클러스터에 저장되어 있는 인덱스를 *_all이나 wildcard 표현식으로 삭제할 수 없도록 막는 설정
마스터 노드 설정 방법
- 마스터 노드란 실질적으로 클러스터의 관리를 담당하는 역할
- node.master: true
- node.data: false
- node.ingest: false
데이터 노드 설정 방법
- 데이터 노드란 실제 사용자가 색인 요청한 문서를 저장하고 검색 요청에 대해 결과를 응답해 주는 역할
- node.master: false
- node.data: true
- node.ingest: false
인제스트 노드 설정 방법
- 사용자의 색인 요청 문서에 대해 사전 처리만 진행하고 진행한 결과를 데이터 노드에 넘겨줌
- node.master: false
- node.data: false
- node.ingest: true
코디네이트 노드 설정 방법
- 사용자의 요청을 받아 이를 실제로 처리할 데이터 노드에 전달하고, 각 데이터 노드로부터 받은 검색 결과도 하나로 취합해서 사용자에게 돌려줌.
- 코데네이트 역할은 왜 필요할까?
- 가장 큰 이유는 사용자의 데이터 노드 중 한 대가 코디네이트 노드의 역할과 데이터 노드의 역할을 동시에 함으로써 해당 노드의 사용량이 높아지는 것을 방지하기 위함
- 코디네이트 노드 역할을 하는 노드는 검색 결과를 취합하는 역할도 해야 하기 때문에 코디네이트 큐가 추가로 필요함. 이는 힙 메모리 사용량의 증가로 이어짐
- 코디네이트 노드의 다른 말은 클라이언트 노드
- node.master: false
- node.data: false
- node.ingest: false
마스터 노드와 데이터 노드 역할을 함께 설정
- 데이터 노드 수가 마스터 노드 수만큼 필요할 때 위와 같은 설정으로 비용을 절약할 수 있음.
- node.master: true
- node.data: true
- node.ingest: true
jvm.options 설정 파일
- 힙 메모리가 운영 중 늘어나거나 줄어들면 성능에도 영향을 준다.
- 설정 파일에서는 대부분 힙 메모리와 관련된 -Xmslg, -Xmxlg 항목만 변경해 주면 된다. 힙메모리와 GC 방식에 대한 설정은 성능에 많은 영향을 주기 때문에 정확하게 이해하고 수정해야 함.
- 특히, 힙 메모리 설정과 관련해서 ES 공식문서에서는 가능한 한 32GB를 넘지 않게 설정할 것을 권고 함. (전체 메모리의 절반 정도로 설정)
- 이유는 ES에 색인된 데이터를 세그먼트라는 물리적인 파일로 저장함.
- 파일로 저장하기 때문에 I/O가 발생할 수 박에 없는 구조.
- 매번 빈번한 I/O 작업이 발생한다면 시스템 성능이 떨어짐.
- OS에서는 이런 성능 저하를 막기 위해 파일의 내용을 메모리에 저장해놓는 페이지 캐시 기법을 사용함.
- 하지만 페이지 캐시는 애플리케이션들이 사용하지 않는 미사용 메모리를 활용해서 동작하기 때문에 페이지 캐시를 최대한 활용하기 위해서는 애플리케이션이 사용하는 메모리를 줄이는 것이 좋음
- 위와 같은 이유 때문에 공식 문서에서는 물리 메모리의 절반 정도를 힙 메모리로 할당할 것을 권고 함
기타
- ES는 샤드 개수와 레플리카 개수를 설정하지 않으면 프라이머리 샤드 5, 레플리카 샤드 1을 기본값으로 설정해서 인덱스를 생성함.
- 마스터 노드는 클러스터 전체의 메타데이터를 관리하며, 클러스터를 구축하기 위해 반드시 한 대 이상으로 구성되어야 함. 하지만 클러스터의 안정성을 위해서는 minumum_master_nodes를 과반수로 설정할 수 있도록 두 대 이상의 홀수 값으로 구성하는 것이 좋음.
Reference URL
'Engineering WIKI > Book' 카테고리의 다른 글
기초부터 다지는 엘라스틱서치 운영 (9장) / 검색 엔진으로 활용하기 (67) | 2024.04.16 |
---|---|
기초부터 다지는 엘라스틱서치 운영 (8장) / 분석 엔진으로 활용하기 (70) | 2024.04.15 |
기초부터 다지는 엘라스틱서치 운영 (7장) / 클러스터 성능 모니터링과 최적화 (54) | 2024.04.14 |
기초부터 다지는 엘라스틱서치 운영 (6장) / ElasticSearch 클러스터 운영하기 (33) | 2024.04.06 |
기초부터 다지는 엘라스틱서치 운영 (3 ~ 4장) / 모니터링 및 기본개념 (112) | 2023.09.29 |
[일래스틱 스택 6 입문] 3장. 유사도 검색 (84) | 2023.09.17 |
기초부터 다지는 엘라스틱서치 운영 (1 ~ 2장) / 훑어보기 및 기본동작 (58) | 2023.09.07 |
[일래스틱 스택 6 입문] 2장. 일래스틱서치 시작하기 (2) | 2023.08.22 |