웹개발 및 최신 테크 소식을 전하는 블로그, 웹이즈프리

HOME > db

엘라스틱서치 알아보기

Last Modified : 2019-08-06 / Created : 2017-05-24
4,489
View Count


엘라스틱서치(Elastic Search)
에 대하여 알아보고자 합니다. 최근 수 많은 데이터의 검색을 어떻게하면 가장 효과적으로 수행할까의 고민이 있었고 엘라스틱의 성능 개선의 이야기를 들은 후 적용하기 이전에  그 기능 및 특징에 대하여 무엇인지 알아보았습니다.




# 엘라스틱서치란? Elasticsearch

Elasticsearch 엘라스틱서치는 아파치의 루씬 라이브러리를 기반으로 만들어진 검색 엔진 어플리케이션으로 동일한 물리적 환경에서 검색을 수행할 경우 엄청나게 빠른 속도로 검색 결과를 도출할 수 있습니다. 즉 성능에 큰 장점을 지니며 다양한 기능을 제공합니다. 또한 엘라스틱서치는 오픈소스이면서 설치 방법과 사용도 간단합니다. 설치시 서버에 직접 설치하여 사용하기도 하고 AWS 등의 대형 클라우드 서비스 역시 별도의 엘라스틱서치 서비스를 제공하기도 합니다. 아래는 엘라스틱 서치의 특징으로 대표적인 기능들니다.

  • 자바로의 루씬을 기반으로 만들어짐
  • 분산시스템으로 각 노드에 분산하여 데이터를 저장함
  • JSON 문서형식으로 저장 사용됨
  • 데이터를 원본과 복사본으로 구분하여 분산 저장함
  • REST API를 지원하며 이를 사용한 데이터 처리

웹개발 커뮤니티로 유명한 Stackoverflow위키피디아, Github 역시 엘라스틱서치를 사용합니다. 이처럼 대형 웹서비스에서 사용되고 있으며 RDBMS, 관계형 데이터베이스와 다른 데이터 구조로 NoSQL 구조를 가지고 있습니다.

특히 json 방식의 사용과 rest api를 지원하기 때문에 배우기 쉽고 사용이 간편하다는 장점이 있습니다. 비슷한 방식의 엔진으로 솔라가 비교됩니다. 솔라의 경우 Join이 지원되지 않으나 엘라스틱서치는 조인을 Parent_type과 Child_type을 이용하여 지원합니다.



# 엘라스틱서치의 활용

엘라스틱서치는 어떻게 사용될까요? 웹서비스에서 크게 아래의 세 가지로 많이 사용됩니다.

  • 빠른 검색과 원하는 결과를 얻어야할 때(검색 서비스)
  • 로그를 저장하며 검색의 필요가 있을때
  • 데이터를 저장하면서 분석할 경우(ELK)

엘라스틱서치의 강점은 역시 검색입니다. 검색에 필요한 다앙한 쿼리 api를 제공하며 일반적인 db검색와 비교시 매우 큰 검색 성능을 보여줍니다.

엘라스틱서치의 커맨더는 쉽게 필터와, 쿼리로 구분할 수 있습니다. 필터와 쿼리 각각 비슷한 검색 기능을 수반하는데 둘 다 차이점이 있습니다. 간단하게 비교하면 필터는 빠르고 예/아니오로 동작하는 반면 쿼리의 경우 루씬의 연관성 점수를 활용하여 느리지만 정확한(?) 좀 더 가공된 데이터를 얻어올 수 있습니다.


! 알아두면 좋은 내용

엘라스틱서치는 ELK 형태로 많이 사용되는데 ELK는 elasticsearch, logstash, kibana를 의미합니다. 각각 검색, 수집, 시각화를 통하여 데이터의 흐름과 분석 과정의 하나의 서비스를 제공하는데 매우 많이 쓰이고 있습니다.


! ElasticsSearch 메모리 사용

Elasticsearch를 사용하면서 현재 사용중이고 남아있는 메모리를 자주 확인 하게됩니다. 그 이유는 엘라스틱서치가 차지하는 메모리 비중이 높기 때문입니다. 현재까지 다양한 클라우드 환경의 적은 리소스를 가진 Computing Machine을 사용해왔습니다. 메모리의 경우 1G, 2G를 사용하다가 메모리 부족으로 가끔씩 서버가 다운되는 문제가 발생했습니다. 엘라스틱서치에서 저장하는 데이터의 양에 따라 큰 차이가 있겠지만 jvm.options의 메모리 값의 설정을 바꾸어도 좀처럼 해결되기 어렵더군요.

현재 4G의 메모리를 사용중으로 서버 이슈로부터 좀 더 자유로워졌습니다. 저장소 목적의 Machine을 별도로 가지거나 메모리가 높지 않은 경우 메모리 최적화 및 관리에 좀 더 신경을 쓸 필요가 있으니 참고하시기 바랍니다.

Previous

NoSQL 데이터베이스 Redis와 MongoDB 비교

Previous

시간이 오래 걸리는 느린 쿼리문을 영어로 표현하면?