Elasticsearch는 시간이 갈수록 증가하는 문제를 처리하는 분산형 RESTful 검색 및 분석 엔진입니다. Elastic Stack의 핵심 제품인 Elasticsearch는 데이터를 중앙에 저장하여 손쉽게 확장되는 광속에 가까운 빠른 검색, 정교하게 조정된 정확도, 강력한 분석을 제공합니다.
RDBMS와 Elasticsearch와의 차이
RDBMS => 데이터베이스 => 표 => 열/행
Elasticsearch => 클러스터 => 인덱스 => 샤드 => 키-값 쌍이 있는 문서
Elasticsearch 이점
신속한 가치 실현
Elasticsearch는 간단한 REST 기반 API, 간단한 HTTP 인터페이스를 제공하고 스키마 없는 JSON 문서를 사용해 다양한 사용 사례에서 쉽게 시작하고 빠르게 애플리케이션을 구축할 수 있습니다.
고성능
Elasticsearch의 분산 성질로 인해 대량 볼륨의 데이터를 병렬로 처리할 수 있어 쿼리에 최고의 일치 항목을 빠르게 찾을 수 있습니다.
무료 도구 및 플러그인
Elasticsearch는 유명 시각화 및 보고서 도구인 Kibana가 통합되어 제공됩니다. Beats 및 Logstash와의 통합도 제공하여 소스 데이터를 쉽게 전환하고 Elasticsearch 클러스터에 로드할 수 있습니다. 언어 분석기 및 제안자 등 다양한 오픈 소스 Elasticsearch 플러그인을 사용하여 애플리케이션에 풍부한 기능을 추가할 수도 있습니다.
실시간에 가까운 운영
데이터 읽기 및 쓰기와 같은 Elasticsearch 운영은 보통 1초도 안 걸려서 완료됩니다. 덕분에 애플리케이션 모니터링 및 이상 탐지와 같은 실시간에 가까운 사용 사례에 Elasticsearch를 사용할 수 잇습니다.
쉬운 애플리케이션 개발
Elasticsearch는 Java, Python, PHP, JavaScript, Node.js, Ruby 및 기타 여러 다양한 언어에 대한 지원을 제공합니다.
Elasticsearch 단점
- Elasticsearch는 다양한 설정 옵션을 제공하며, 초기 설정이나 클러스터 구성은 복잡할 수 있습니다.
- 대량의 데이터를 한 번에 색인하거나 업데이트할 때 성능이 저하될 수 있습니다.
- 클러스터를 동적으로 확장하기 어려울 수 있고, 새로운 노드를 추가하는 과정이 번거로울 수 있습니다.
- 실시간 분석에는 적합하지만, 복잡한 집계나 머신러닝 모델을 적용하기에는 한계가 있을 수 있습니다.
- Document 간 조인을 수행할 수 없다. (두번 쿼리로 해결 가능)
- 트랜잭션 및 롤백이 제공되지 않는다.
- 진정한 의미의 업데이트를 지원하지 않는다.( 삭제 후 다시 만드는 형태)
ElasticSearch의 작동 방식
JSON 문서 형식의 데이터를 Logstash 및 Amazon Kinesis Data Firehose와 같은 수집 도구나 API를 사용해 Elasticsearch로 전송할 수 있습니다. Elasticsearch는 자동으로 원래 문서를 저장하고 클러스터의 인덱스에 문서에 대한 검색 가능한 참조를 추가합니다. Elasticsearch API를 사용해 문서를 검색하고 조회할 수 있습니다. 또한 시각화 도구인 Kibana를 Elasticsearch와 함께 사용해 데이터를 시각화하고 대화식 대시보드를 구축할 수 있습니다.
document - JSON으로 표현된 ElasticSearch에서 인덱싱할 수 있는 정보의 기본 단위, 문서는 관계형 데이터베이스의 행과 같으며, 주어진 엔티티, 즉 찾고 있는 대상을 나타낸다고 생각할 수 있다.
index - 인덱스는 유사한 특성을 가진 문서의 모음입니다. 인덱스는 Elasticsearch에서 쿼리할 수 있는 가장 높은 수준의 엔터티입니다. 인덱스는 관계형 데이터베이스 스키마의 데이터베이스와 비슷하다고 생각할 수 있습니다. 인덱스의 모든 문서는 일반적으로 논리적으로 관련되어 있습니다. 예를 들어 전자 상거래 웹 사이트의 컨텍스트에서는 Customers에 대한 인덱스, Products에 대한 인덱스, Orders에 대한 인덱스 등을 가질 수 있습니다. 인덱스는 인덱스에 있는 문서에 대해 인덱싱, 검색, 업데이트 및 삭제 작업을 수행하는 동안 인덱스를 참조하는 데 사용되는 이름으로 식별됩니다.
Inverted Index - Elasticsearch의 인덱스는 실제로 모든 검색 엔진이 작동하는 메커니즘인 Inverted Index라고 하는 것입니다. 단어나 숫자와 같은 콘텐츠에서 문서 또는 문서 집합의 해당 위치로의 매핑을 저장하는 데이터 구조입니다. 기본적으로 단어에서 문서로 안내하는 해시맵과 같은 데이터 구조입니다. 반전된 인덱스는 문자열을 직접 저장하지 않고 대신 각 문서를 개별 검색어(즉, 각 단어)로 분할한 다음 각 검색어를 해당 검색어가 포함된 문서에 매핑합니다. 예를 들어, 아래 이미지에서 "best"라는 용어는 문서 2에 있으므로 해당 문서에 매핑됩니다. 이는 주어진 문서에서 검색어를 찾을 수 있는 위치를 빠르게 조회하는 역할을 합니다. Elasticsearch는 분산 반전 인덱스를 사용하여 매우 큰 데이터 세트에서도 전체 텍스트 검색에 가장 적합한 일치 항목을 빠르게 찾습니다.
Logstash
데이터를 집계 및 처리하여 Elasticsearch로 전송하는 데 사용됩니다. 여러 소스에서 동시에 데이터를 수집하고 변환한 다음 수집을 위해 보내는 오픈 소스 서버 측 데이터 처리 파이프라인입니다. 또한 명명된 필드를 식별하여 구조를 구축하고 공통 형식으로 수렴하도록 변환하여 형식에 관계없이 데이터를 변환하고 준비합니다. 예를 들어, 데이터가 다양한 형식으로 여러 시스템에 흩어져 있는 경우가 많기 때문에 Logstash를 사용하면 웹 서버, 데이터베이스, Amazon 서비스 등과 같은 다양한 시스템을 함께 연결하고 지속적인 스트리밍 방식으로 필요한 곳 어디에나 데이터를 게시할 수 있습니다.
FlashFrenzy 프로젝트에서는 Product으 값이 추가되거나 변동되지 않아서 ELK Stack 중 Kibana는 따로 적용하지 않고 프로젝트를 진행했습니다.
프로젝트에서 Data Flow
RDBMS -> Logstash -> Elasticsearch
Logstash의 db.conf
input {
jdbc {
jdbc_driver_library => "D:\ELK Stack\logstash-8.10.4\lib\mysql-connector-j-8.1.0/mysql-connector-j-8.1.0.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/study"
jdbc_user => "root"
jdbc_password => "1234"
statement => "select * from product"
jdbc_pool_timeout => 120
}
}
output {
elasticsearch {
hosts => ["ElasticSearch의 서버 주소:9200"]
index => "product"
}
stdout{
codec=>rubydebug
}
}
input
jdbc_driver_library : 타사 드라이버 라이브러리에 대한 JDBC 드라이버 라이브러리 경로입니다. 여러 라이브러리가 필요한 경우 쉼표로 구분하여 전달할 수 있습니다.
jdbc_driver_class :필수 입력값입니다. (default 없음) 드라이버명은 jdbc 버전에 따라 다릅니다.
jdbc_connection_string : JDBC connection 문자열을 넣습니다.
jdbc_user : Database 접속 사용자 ID
jdbc_password : 해당 사용자 ID의 비밀번호
tracking_column : "id" 컬럼을 사용하겠다는 뜻입니다. query condition 대상으로 사용할 컬럼명을 넣습니다
tracking_column_type : 숫자형, 날짜만 사용이 가능합니다. "numeric" 혹은 "timestamp" 를 넣어주세요.
last_run_metadata_path :
statement : 어떤 sql문을 실행해서 값을 가져올지 지정합니다.
schedule : input 쿼리가 실행될 주기를 Cron 식으로 입력합니다.
output
hosts : elasticsearch의 서버 주소
index : 데이터를 삽입할 index 명
filter 옵션을 통해 조건에 맞는 값을 삽입할 수 있습니다. 해당 프로젝트에서는 모든 product를 불러와서 elasticsearch에 넣었기 때문에 따로 추가하지 않았습니다.
참고
Elasticsearch: 공식 분산형 검색 및 분석 엔진 | Elastic
Elasticsearch란 무엇인가요? - Elasticsearch 엔진 설명 - AWS (amazon.com)
Elasticsearch: 정의, 작동 방식 및 용도 - Knowi