
사용자가 필요로 하는 정보를 방대한 DB에서 빠르고 정확하게 찾아내어 제공하는 기술 및 서비스입니다.
크롤링 및 색인
웹크롤러는 인터넷상을 돌아다니면서 데이터를 수집합니다. 즉, 데이터를 수집하고 색인 작업을 실시합니다. 색인은 데이터의 키워드와 메타데이터등을 분석하고 DB에 저장하는 작업입니다. 색인 작업이 끝난뒤에는 검색에 필요한 형태로 재구성 됩니다.
데이터 유형
비정형 데이터 형태로도 검색이 가능해야 합니다.
검색 쿼리
키워드, 질의, 조건을 기반으로 정확도가 높은 결과를 반환해야합니다.
다음과 같은 요구사항을 지녔습니다.
기존의 SQL은 어떤 한계가 있었고, 어떠한 이유로 ElasticSearch 가 각광받을 수 있었을까요?
성능 이슈
기존의 like 질의는 유연성과 정확성이 떨어집니다. 예를 들어 "흰색 신발" 을 검색한다고 하였을때 누군가는 "하얀색 신발" 또 누군가는 "흰 신발" 혹은 "흰 운동화" 이런식으로 검색을 할 경우 기존의 like 질의는 문제가 됩니다.
실시간 반영
데이터가 실시간으로 반영이 되어야 하는데 기존의 SQL은 실시간 반영에서 성능적인 이슈가 발생합니다.
정밀도와 재현율은 보통 TRADE OFF 관계입니다. 따라서 적절한 균형을 잡아야 합니다.
정밀도
검색 결과가 실제 원하는 문서를 잘 찾았는지의 비율입니다.
재현율
관련 문서를 얼마나 잘 찾았는지의 비율입니다.
사실 Elastic Search 만이 답은 아닙니다. splunk는 로그데이터 검색 및 분석, 실시간 빅데이터에 유리합니다. 또한 OpenSearch 는 오픈소스로 맞춤형 검색이 가능합니다. Elastic Search 의 장점에 대해 파악해봅시다.
강력한 검색엔진
루씬 기반의 검색엔진으로 복잡한 데이터 셋에서 정보를 신속하고 정확하게 검색이 가능합니다. 또한 실시간 처리에 용이합니다.
유연한 색인화 및 API 지원
RESTful api를 통한 쿼리를 수행할 수 있으며 동기적 비동기적 실행을 통해 대용량 데이터 처리에 적합합니다. 또한 JSON 형식 색인화, 개발자를 위한 다양한 언어 SDK를 제공합니다.
다양한 데이터 관리 지원
강력한 모니터링 툴인 Kibana를 통해 시각화와 모니터링이 가능하고 APM, 로그, 인프라 메트릭 데이터 분석이 가능합니다.
분산시스템 및 효율적 데이터 관리
샤드 개념을 통하여 빠른 복구가 가능하고 데이터 롤업 및 인덱스 수명주기를 관리할 수 있습니다.
Elastic 에코시스템 = Elasticsearch + Logstash + Beats + Kibana
자동완성, 필터, 랭킹 기능을 통한 검색결과 제공
검색엔진을 활용하여 사용자에게 적합한 검색 결과를 제공하여 사용자 경험을 최적화 합니다.
강력한 보안 기능
인증로그, 감사로그를 활용하여 보안 위협에 대응합니다.
APM 도구
미들웨어와 애플리케이션 로그 수집 및 관찰을 통한 알람을 활용할 수 있고 성능 모니터링이 가능합니다.
매트릭스 시각화
데이터를 매트릭스로 시각화하고 분석할 수 있습니다.
서비스 모니터링 기능
서비스에 영향을 미치기 전 자원 모니터링 체크를 할 수 있습니다.
경량 데이터 수집기로 다양한 모듈로 구성되어 특정 데이터 소스에 따라 데이터를 수지하는 역할을 합니다.
데이터 시각화 툴로 데이터를 통한 그래프, 차트, 지도 등 대시보드를 구성합니다. 또한 검색 쿼리를 작성하고 검색해 볼수 있는 화면을 제공합니다.
애플리케이션 성능 모니터링 도구로 내부의 성능 수집 및 모니터링(트랜잭션, 지연분석)
다양한 애플리케이션 프레임워크와 언어를 지원합니다.
| 관계형 DB | Elasticsearch |
|---|---|
| 테이블 | 인덱스 |
| SQL | QueryDSL |
| 행 | document |
| 컬럼 | field |
| 물리파티션 | shards |
| 스키마 | mapping |
data_content
지속적으로 유지되어야 하는 데이터를 저장합니다. 주로 읽기 작업이 많은 검색 혹은 집계 쿼리에 사용됩니다.
data_hot
최신 시계열 데이터를 바르게 읽고 쓰는데 필요합니다. 고성능 SSD와 같은 저장 장치를 사용하여 최근 데이터를 엑세스 합니다.
data_warm
쿼리 빈도가 낮을 데이터를 보관하며, 효율적인 HDD를 활용하여 몇 주 전 데이터를 저장합니다.
data_cold
빠르게 검색할 필요가 없는 오래된 데이터를 보관하며 data_warm 에서 온 데이터들이다. 필요에 따라 구성하지 않는 경우도 존재
data_frozen
거의 사용되지 않거나 아카이브 목적의 데이터 저장 목적이며, s3 등 보관한다.
elasticsearch.yml 설정을 통해 역할을 할당합니다.
코디네이팅 노드
클러스터의 요청을 라우팅하고 상태를 관리하는 역할로 대규모 클러스에서는 별도로 분리 운영합니다. 소규모의 경우는 데이터와 마스터 노드가 이 역할을 수행합니다.
머신러닝 노드
머신러닝 기능을 제공하며, 데이터학습, 이상탐지, 예측 등 작업을 처리합니다.
리모트 클러스터 클라이언트
다른 클러스터와 연결을 관리하고 여러 클러스터 간의 데이터 검색이 가능하도록 담당합니다.
Transform 노드
인덱스 간 데이터를 자동으로 복사, 변환하는 역할을 수행합니다.
| 저장소 | 메모리 | CPU | |
|---|---|---|---|
| 데이터노드 | Extreme | High | High |
| 마스터노드 | Low | Low | Low |
| 인제스트노드 | Low | Medium | High |
| 코디네이팅노드 | Low | Medium | Medium |
데이터 노드의 경우 충분한 메모리가 필요로 하는데 16GB 이상의 메모리가 권장됩니다.
마스터 노드의 경우 관리의 경량적인 작업을 맡습니다. 따라서 낮은 CPU, 2GB 이상의 메모리가 권장됩니다.
하나 이상의 노드로 구성하여 노드들이 협력하여 데이터 저장, 검색 및 분석 작업을 수행합니다. 각 노드는 고유한 이름, IP 를 통해 식별되며 클러스터에 가입하여 클러스터 전반적인 상태를 관리합니다. 데이터 관련 작업을 처리합니다. 다양한 룰을 통해 각 노드에 특정 기능과 권한을 할당하며 데이터의 안정성과 가용성을 보장하기 위해 가용영역에 걸쳐 노드를 분산 배치합니다. 대용량 데이터를 효율적으로 처리할 수 있으며 필요에 따라 확장이 용이합니다.
샤드는 데이터를 효율적으로 분산 저장하고 관리하는 핵심 역할을 합니다.
노드 간의 샤드 배치는 클러스터 성능에 굉장히 중요합니다. 노드에 샤드가 고르게 분포될 경우 검색 시간을 단축시킬 수 있고 시스템의 처리량을 증가시킵니다.
레플리카 샤드는 클러스터 내의 데이터 무결성과 가용성을 높이는데 주요 역할을 맡습니다. 오류가 생겼을때 레플리카 샤드는 프라이머리 샤드로 자동 승격되어 클러스터의 연속성을 보장합니다.
scale-up, scale-out 은 확장 전략입니다.