Elastisearch 개념 및 장단점 / 엘라스틱서치 기초 공부

엘라스틱서치란?

엘라스틱에서 java로 개발한 오픈소스 Restful 검색엔진입니다.
대량의 데이터를 빠르게 수집, 분석, 시각화, 분산 검색, 집계할 수 있습니다.

Elastisearch 활용 범위

  • 역 인덱스 구현으로 전체 텍스트를 색인해서 특정 단어가 포함된 문서의 위치를 빠르게 검색
  • 로그 등 다양한 데이터 수집 및 통계 분석

역 인덱스 (=역 색인)
문서 위치에 대한 인덱스를 만드는 DB 색인과 달리, 문서 내 단어들의 매핑 정보를 색인하여 저장합니다.
역 인덱스를 사용하면 특정 단어가 포함된 문서를 효율적으로 찾을 수 있습니다.

Elastisearch 장점

  • 위치정보, 정형, 비정형 등 모든 유형의 텍스트 데이터 수집이 가능합니다.
  • 모든 필드에 색인(indexing) 처리를 해서 검색 시간이 짧습니다.
  • 검색어와 필드의 형태소를 분리해서 검색어가 포함된 도큐먼트를 유사도 높은 순으로 검색할 수 있습니다.
  • HTTP 프로토콜로 통신하는 Restful API를 지원하여 다양한 플랫폼에서 사용할 수 있습니다.
  • Elastic Cluster에 Elastic Node를 1개씩 추가하여 노드의 수평적 확장이 가능합니다.
  • 데이터를 조각(shard) 단위로 복제하고 각 노드에 분산 저장하여 특정 노드 다운에도 데이터 유실이 없습니다.
  • 여러 노드에 분산 검색하여 노드가 많을수록 검색 속도가 향상됩니다.
  • SQL의 like와 달리, 대소문자 구분 없이 검색 가능합니다.
  • Kibana에 연결해 시각화하여 실시간 로그 분석 및 모니터링이 가능합니다.
  • 관계형 데이터베이스로 처리하기 어려운 집계도 빠르게 처리 가능합니다.
  • 데이터 색인 뒤 Refresh 시점부터 거의 실시간으로 검색 결과가 반영됩니다.

Elastisearch 단점

  • 복잡한 관계형 데이터 모델링에 적합하지 않아, RDBMS를 완전히 대체할 수 없습니다.
  • NoSQL 구조이므로 Join 쿼리는 어렵고 검색 성능이 좋지 않아 역 정규화 모델링이 권장됩니다.
  • 원본 데이터를 엘라스틱서치에도 저장하여, 데이터 무결성 관리 포인트가 늘어납니다.
  • 트랜잭션, 롤백은 지원하지 않아 불가합니다.
  • 인덱싱 부하로 인해 완전 실시간 처리는 불가할 수 있습니다.

Elastic Stack 구성

Elastic Stack은 과거 ELK Stack에 Beats가 추가된 것입니다.

Beats

장비와 시스템에서 수집한 데이터를 Logstash 또는 Elasticsearch에 전송합니다.
고 언어(golang)로 작성되었고, 데이터 변환 기능이 없어 Logstash보다 가벼운 경량 수집기입니다.
수집할 데이터 종류에 맞게 설치해야 하고, 모든 장비에 설치하지 않아도 됩니다.
Beats는 Elastic Stack 필수 요소가 아닙니다.

Beats 종류

fileBeat 파일 위주의 대용량 데이터 수집 (로그, CSV 파일 등)
MetricBeat 실행 중인 프로세스 정보, 자원 정보 등 실시간 수집
WinLogBeat 윈도우 로그 데이터 수집
HeartBeat 각 프로세스 가동 시간 수집
PacketBeat 네트워크 데이터 수집
AuditBeat 리눅스 이벤트 로그 데이터 수집 (보안 분석 활용)

커스텀 Beat도 있어서 종류가 많지만, DB 데이터를 수집하는 Beat는 없는 것 같아 사용하지 않았습니다.

Logstash

파일, DB, Beats 등에서 데이터를 수집하고 변환(전처리) 후 Elasticsearch로 전송하는 ETL 도구입니다.
데이터 소스가 있는 모든 장비들에 설치해야 합니다.

영속성 큐 사용으로 이벤트 최소 1회 전송을 보장해 주고, 부하 상황에서도 안정성을 보장해줍니다.
로그스태시 기본 포트 : 5000 / 9600

Elasticsearch

엘라스틱서치에 데이터를 색인(인덱싱) 후 저장하고, 검색 및 분석이 가능합니다.
엘라스틱서치 기본 포트 : 9200~ (외부 HTTP 통신) / 9300~ (내부 노드 간 전송 통신)

Kibana

저장된 엘라스틱서치 데이터를 시각화, 모니터링 및 관리하기 위한 웹 기반 플랫폼입니다.
키바나 기본 포트 : 5601


Elastic Stack 설치 순서

elasticsearch → kibana → logstash → beats


ELK 권장 하드웨어 사양

  • RAM : 64GB
  • CPU : 2 ~ 8 core
  • SSD : 200GB
  • RAID 0

Elasticsearch 용어 정리

Cluster (=시스템)

클러스터는 시스템의 최대 단위이며, 여러 Node의 묶음입니다.
시스템 장애를 대비하고 시스템 성능을 높이기 위해 여러 노드를 결합하여 무한 확장 가능합니다.

Node (=서버)

노드는 클러스터 내에서 실시간 추가/제거 가능한 단일 Elasticsearch 프로세스입니다.
일반적으로 하나의 컴퓨터에 하나의 노드를 구성합니다.

엘라스틱서치 설치 후 노드는 기본적으로 모든 역할을 수행합니다.
부하 분산, 검색 효율, 안정성을 위해 마스터 후보 전용 노드, 데이터 전용 노드, 코디네이터 전용 노드를 나누면 좋습니다.

마스터 노드 [ master ]
클러스터 설정 정보, 인덱스 설정/매핑 정보, 인덱스 템플릿 정보 등을 관리하는 노드입니다.
반드시 하나 존재해야 하며, 사용자가 홀수 개로 지정한 마스터 후보 노드 중 투표를 통해 선출됩니다.
마스터 후보 노드들은 마스터 노드 정보를 공유하고 있어 선출 즉시 마스터 노드의 역할을 할 수 있습니다.

투표 전용 노드 [ voting_only ]
마스터 후보 노드가 아니지만 마스터 노드 투표 권한을 가진 노드입니다.
마스터 노드에 장애 발생 시 새로운 마스터 노드 선출에 투표하여 시스템이 멈추지 않고 동작하게 해줍니다.
모든 노드가 수행할 수 있는 기본적인 역할이며, 별도의 설정이 필요하지 않습니다.

데이터 노드 [ data ]
샤드가 저장되는 노드입니다. 데이터 CRUD, 검색, 집계 작업을 하며 가장 많은 부하를 받습니다.

인제스트 노드 [ ingest ]
로그스태시 필터처럼 데이터 전처리를 수행하는 노드입니다.
간단한 데이터 가공에만 사용됩니다.

머신러닝 노드 [ ml ]
유료 라이선스의 기능입니다.

코디네이터 노드 [ coordinating_only ]
REST API 요청을 받아 데이터 노드에 로드밸런싱하고 결과를 취합하여 HTTP 응답하는 노드입니다.
모든 노드가 수행할 수 있는 기본적인 역할이며, 별도의 설정이 필요하지 않습니다.

Shard (=Partition)

샤드는 색인된 인덱스 도큐먼트 데이터 조각이며, 여러 개의 노드에 분산 저장됩니다.
다수의 샤드로 병렬 처리되어 검색 성능이 증가합니다.

인덱스 생성 시 세팅 값으로 샤드 개수를 미설정하면 프라이머리 샤드, 레플리카 샤드가 1개씩 생성됩니다.

샤드 수는 노드 수, 인덱스 크기에 따라 조정하는 것이 좋습니다. (정답이 없습니다.)
노드 수에 비해 샤드가 적으면 검색 성능에 좋지 않고, 샤드가 너무 많으면 시스템 성능에 좋지 않습니다.
샤드는 CPU, 메모리, 리소스를 개별적으로 소비하니 필요 이상의 리소스를 사용하는 오버샤딩 문제가 생길 수 있습니다.

샤드 1개 크기는 20~40GB가 권장됩니다.
너무 작은 샤드는 오버헤드를, 너무 큰 샤드는 검색 성능 문제를 발생시킬 수 있습니다.

Primary Shard
CRUD를 제공하는 샤드입니다. 프라이머리 샤드 수는 인덱스 생성 시에만 설정 가능하고 변경 불가합니다.

Replica Shard
장애 복구 및 읽기 분산을 위한 복제본 샤드입니다.

프라이머리 샤드에 장애 발생 시 프라이머리 샤드로 변경되고 다른 노드에 새 레플리카 샤드를 할당합니다.
운영 중 레플리카 샤드 수 변경이 가능하고, 장애 대응을 위해 최소 1개 이상 두는 것이 좋습니다.

단일 노드의 경우, 레플리카 샤드는 UNASSIGNED 되어있습니다.

Index (=DB=Table)

최상위 데이터 계층으로, 비슷한 특성을 가진 문서의 모음입니다. (고객/제품/주문 색인)
검색 성능 최적화를 위해 특정 시간이나 인덱스 크기를 기준으로 인덱스를 분리하여 사용합니다.

Type (=Table)

Elastic Stack 7.0 이후로 Index와 Type은 1:1이기 때문에 Type 개념이 폐지되었습니다.

Document (=Row, 행)

데이터 검색을 위한 최소 단위이며, JSON으로 저장됩니다.

Field (=Column, 열)

JSON으로 이루어진 데이터 속성입니다.

Mapping (=Schema)

문서의 Field, 필드 타입 및 색인 방법이 정의된 Document 저장 규칙입니다.
단순 문자열 저장 시 keyword 타입, 형태소 분석 검색을 원할 시 text 타입을 사용합니다.
매핑 정보는 인덱스 생성 시 자동 설정되며, 변경하려면 데이터 삭제 후 다시 색인해야 합니다.

Query DSL (=SQL)

엘라스틱서치에 질의를 요청할 수 있는 JSON 기반 쿼리입니다.


Elasticsearch API 분류

인덱스 관리 API
인덱스 생성/삭제, 인덱스 설정 업데이트를 할 수 있습니다.

문서 관리 API
Document를 조회/수정/삭제/색인 합니다.

검색 API
URL을 사용하는 RESTful Request 방식보다, Query DSL 방식이 더 복잡한 검색 쿼리를 작성할 수 있습니다.

집계 API
다양한 집계 유형을 결합/중첩/조합할 수 있습니다.


Elasticsearch HTTP 메소드 종류

GET 문서 검색
POST 문서 생성 (수정 시 에러)
PUT 문서 생성 또는 수정
DELETE 문서 삭제

HTTP 기반의 엘라스틱서치 API에 JSON으로 요청하고, 결과에 대한 응답을 JSON으로 받을 수 있습니다.

Leave a comment