ElasticSearch 이라는 기술 (이하 엘라스틱서치)에 대해 간단히 알아볼거예요. 사실 이 기술은 저에게는 말로만 들어보고, 한 번도 이용해보지 않은 기술이었어요. 단지 대용량 데이터의 검색엔진에 쓰이는 효과적인 기술이라고만 생각했죠. 써 볼 기회도 없었고요. SPRYFIT에서의 업무를 종료하고 한국으로 돌아와 새로운 직장을 찾던 중, 정말 저에게 맞는 회사를 찾게 되었어요. 얘기를 해보던 중 그 회사의 CTO분께서 엘라스틱서치에 대해 찾아보라는 말씀을 해주셨기도 하고, 평소에 관심을 가지고 있던 기술이라서 제 나름대로 엘라스틱서치에 대해 알아보려고 해요.

ElasticSearch란?

엘라스틱서치에 대한 설명은 공식 홈페이지에 아래와 같이 작성되어 있었어요.

Elasticsearch는 점점 많은 문제를 해결하는 분산형 RESTful 검색 및 분석 엔진입니다. Elastic Stack의 핵심으로, 데이터를 중심부에 저장하여 예상되는 항목을 검색하고 예상치 못한 항목을 밝혀낼 수 있습니다.

위 설명글을 간단히 요약하면, ElasticSearch는 분산형 RESTful 검색 및 분석 엔진 이라고 말할 수 있겠네요. 한번 더 알기쉽게 풀어본다면, 빠르고 효율적인 분산처리를 통해 얻은 검색 및 분석 결과를 RESTful API로써 제공하는 기술이라고 이해해도 좋을 것 같군요. (Elastic Stack에 대한 얘기는 밑에서 다시 하겠습니다.)

ElasticSearch의 필요성과 장점

하지만 위의 설명만 봐선 엘라스틱서치를 도대체 왜, 어디에 써야하는지 알 수 없을 것 같아요. 좀 더 구체적으로 이 기술의 필요성과 장점에 대해 알아보도록 하겠습니다.

검색 속도가 엄청 빠르다.

숫자와 위치 데이터의 처리를 위해 BKD Tree를 구현했고, 텍스트 문서에서는 Inverted Index 방법을 적용하여 데이터를 빠른 속도로 액세스 할 수 있다고 합니다. 또한 이런 데이터를 빠르게 분석하기 위해 Columnstore를 사용한다고 하네요.

Inverted Index
데이터를 빠르게 검색하기에 아주 효율적인 색인 방법 입니다. “Inverted Index” 즉, 역 색인 입니다. 아래 그림과 함께 역 색인이 어떤식으로 동작하는지 알아보도록 할게요.

예를들어 위와 같이 텍스트 문서들이 여러 개 있다고 한다면, 이 텍스트를 단어로 쪼개는 거예요. 이걸 Tokenize 한다고 하는데, 이렇게 단어별로 쪼개고 난 뒤에 이 단어가 얼마나 쓰였고 어디에 쓰였는지를 미리 저장해 두는거죠. 이로 인해 단어로 텍스트 문서를 검색한다고 했을 때, 빠르게 해당 문서에 접근이 가능한거에요. (DynamicProgramming과 비슷한 맥락이라고 생각해요.)

Tokenize 방법은 제가 예로 설명해서 단어로만 말씀드렸지만, 각 언어별로 개발된 자연어 처리 라이브러리를 통해 명사, 형용사 등으로 구분해서 적용시킬 수 있겠죠.

사실 이 역 색인 기술을 핵심적으로 활용해서 나온 “Lucene” 이라는 Java로 작성된 검색 라이브러리가 있었어요. 하지만 라이브러리 특성상 확장성이 부족하기 때문에 이 라이브러리를 기반으로 개발된 것이 엘라스틱서치라고 해요.

Columnstore
컬럼스토어라고 불리는 이 기술은 행 기반(Row-Based)이 아닌 열 기반 (Column-Based) 으로 쿼리를 처리해서 기존보다 10배 가량 더 빠르게 쿼리를 처리할 수 있는 기술이라고 합니다.

이러한 기술들을 사용함에 따라 엘라스틱서치를 통해 어떠한 데이터 타입에도 실시간 검색 및 분석을 빠르게 할 수 있다는 것을 알 수 있습니다.

Note
위와 같은 핵심 기술에 관해 더 찾아봐야 할 필요성이 있어보이네요. 관련 문서를 하이퍼 링크로 달아두었으니 참고하시면 될 것 같아요. ( 또한 잘 아시는 분은 댓글로 남겨주시면 감사하겠습니다. )

데이터가 크건 작건, 어느 곳에서 돌아간다.

데이터의 크기에 따라 자유자재로 처리 노드를 조절하면서 Cluster를 구성해 인덱스 관리와 쿼리처리를 계속 자동적으로 관리한다고 합니다. 따라서 더욱 다이나믹하게 확장을 할 수 있다는 말이 되겠네요.

ElasticSearch 설치하기

이렇게 좋은 기술을 설명만 듣고 도저히 안써볼수가 없겠어요. 빨리 ElasticSearch를 설치하고 직접 사용해보면서 경험해보기로 해요.

먼저 설치하기 전에 버전과 필요한 환경에 대해 간략히 설명해 드릴게요.

  • 이 설치 가이드는 Ubuntu 16.04, 글 작성 날짜 기준으로 ElasticSearch의 최신버전인 6.2.3을 기준으로 작성되었어요.
  • Java JRE 가 설치되어 있어야 해요. (ElasticSearch는 Java로 작성된 오픈소스 검색엔진이에요. 따라서 ElasticSearch를 구동하기 위해서는 JRE가 필요한 것이죠)
  • 따라서 JRE이 설치되어있는 환경이라면 Windows, Linux, Mac OS 등 운영체제의 제약을 받지 않고 사용하실 수 있어요.

패키지 설치하기

일단 elastic.co를 통해 최신버전의 패키지를 다운받아 아래와 같이 bash명령어를 통해 엘라스틱서치를 설치해주세요.

1
2
3
4
// elastic.co 를 통해 DEB 패키지 다운로드
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.deb
// DEB 패키지 설치
$ sudo dpkg -i elasticsearch-6.2.3.deb

이렇게 설치가 끝났으면, /bin/elasticsearch 와 같이 Executable 한 프로그램이 생겼을거예요. 그걸 그냥 실행해 주시면 되겠습니다.

1
$ java /bin/elasticsearch

실행을 시키면 기본 포트인 9700 포트에 RESTful API 형태로 배포가 완료됩니다. 한번 확인해볼까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ curl -X http://localhost:9700 
{
"name" : "fRC1P2d",
"cluster_name" : "elasticsearch_endlessdev",
"cluster_uuid" : "SMiQLHCbTcOcCfTWOkzxvg",
"version" : {
"number" : "6.2.3",
"build_hash" : "c59ff00",
"build_date" : "2018-03-13T10:06:29.741383Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}

👏 짝짝짝! 이제 우리는 엘라스틱서치를 경험해볼 모든 준비가 끝났어요!👏
다음 글은 엘라스틱서치를 직접 사용해보는 것을 바탕으로 작성해보겠습니다.