시작하며
Elasticsearch를 제대로 운영하기 위해서는 클러스터와 노드의 역할을 명확히 이해해야 한다. 이 글에서는 Elasticsearch의 클러스터 구성 방식, 노드 유형별 역할, 샤드 관리, 핫/웜 노드 구성, 스냅샷 운영까지 전반적인 내용을 정리한다.
클러스터와 노드 구성
클러스터 개요
Elasticsearch 클러스터는 여러 대의 컴퓨터를 병렬로 연결해 하나의 시스템을 구성하는 것으로, 여러 노드의 집합을 의미한다.
노드의 통신 모듈은 두 가지다.
- transport(전송) 모듈: 클러스터 내부에서 노드와 노드 간 통신에 사용
- http(외부통신) 모듈: 노드와 외부 클라이언트 간 통신에 사용
물리 서버 하나에 노드 하나를 구성하는 방식을 권장한다.
노드 유형
마스터 노드
- 인덱스의 설정, 매핑 정보와 물리적인 위치, 클러스터의 설정 정보나 인덱스 템플릿 정보 등 클러스터의 모든 상태 정보를 관리한다.
- 후보 선출 과정: 사용자 지정 방식이 아니라 투표에 의해 결정되며, 과반수가 넘는 경우 마스터 노드로 선출된다.
- 마스터 노드가 나갔다 들어오면 그 사이에 선출된 마스터가 그대로 마스터를 유지한다.
- 스플릿 브레인: 네트워크 장애로 클러스터가 분리되는 경우 각각의 클러스터에서 마스터 노드를 선출하는 문제가 발생한다.
- 투표 전용 노드를 활용하면 마스터 후보 노드들이 대량으로 장애가 발생하는 경우에도 시스템이 멈추지 않고 동작할 수 있다.
데이터 노드
- 인덱싱한 도큐먼트를 샤드 형태로 저장하여 데이터의 CRUD 작업과 검색, 집계 작업을 한다.
- 마스터 노드와 데이터 노드의 역할을 분리하는 것이 좋다.
- 항상 모니터링하면서 부하를 체크하고, 샤드를 재분배해 주어야 한다.
인제스트 노드
- 도큐먼트의 가공과 정제를 위한 노드다. 복잡한 가공이 아니라면 Logstash 설치 없이도 처리가 가능하다는 장점이 있다.
- 데이터 가공을 많이 하는 시스템이라면 별도의 인제스트 노드를 구성하는 것이 좋다.
- 파이프라인: 도큐먼트를 변형할 수 있는 모듈로, 프로세서의 집합이다.
- 프로세서: 도큐먼트를 원하는 형태로 변경할 수 있는 작은 컴포넌트들이다. (date, drop, grok, set, split 등)
머신러닝 노드
- 유료 기능으로 이상 탐지 기능을 제공한다.
코디네이터 노드
- 모든 노드가 코디네이터 노드 역할을 수행할 수 있으며, REST API 요청을 처리하는 역할을 한다.
- 규모가 크고 복잡한 검색에서는 각 데이터 노드가 계산된 결과에 집중할 수 있도록 로드 밸런싱 및 요청 라우팅, 캐싱에 유리한 코디네이터 노드를 두는 것이 좋다.
전용 노드 최적화 구성
노드 역할에 따라 전용 노드를 구성하면 최적화가 가능하기 때문에, 대규모 시스템의 경우 전용 노드를 활용해 시스템을 구성하는 것이 좋다. 각 노드에 따른 하드웨어도 다른 방식으로 구현할 수 있다.
규모에 따른 전용 노드 구성 방법
- 소규모 클러스터(3~5대 노드): 총 5개의 데이터 노드. 그 중 3개는 마스터 후보 노드이면서 데이터 노드 역할을 겸한다.
- 대규모 클러스터: 정답은 없지만, 노드를 효율적으로 관리하기 위해서는 전용 노드를 최대한 잘 활용하는 것이 중요하다.
핫/웜 노드 구성
핫(hot), 웜(warm), 콜드(cold) 노드로 구성하는 방식이다.
- 샤드 할당 필터링(shard allocation filtering): 속성(태그)를 달아 저장하는 방법으로, ILM(Index Lifecycle Management)에서 관리한다.
- 데이터 티어(data tier): 데이터 접근 빈도에 따라 노드를 계층화하여 관리하는 방식이다.
스냅샷
안정적인 시스템 구성을 위해 Elasticsearch는 데이터 백업을 위한 스냅샷을 지원한다.
- 레포지토리는 파일 시스템, 하둡, S3 등 여러 가지를 지원한다.
- 스냅샷 운영 주기는 SLM(Snapshot Lifecycle Management)이 관리한다.
샤드 관리
- 프라이머리 샤드: 원본 데이터를 저장하는 샤드
- 레플리카 샤드: 프라이머리 샤드의 복제본
- 노드 추가와 삭제 시 샤드가 자동으로 재분배된다.
- 적절한 샤드 개수와 크기 결정 방법, rollover API, shrink API를 활용한 관리가 중요하다.
- 참고: https://www.elastic.co/kr/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster
정리하며
Elasticsearch의 클러스터는 마스터 노드, 데이터 노드, 인제스트 노드, 코디네이터 노드 등 다양한 역할의 노드로 구성된다. 운영 규모에 따라 전용 노드를 적절히 배치하고, 핫/웜/콜드 데이터 티어를 활용하면 비용 효율적인 클러스터 운영이 가능하다. 스냅샷을 통한 정기적인 백업과 샤드 관리를 통해 안정적인 운영을 유지하는 것이 핵심이다.