67

시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

  • View
    276

  • Download
    13

Embed Size (px)

DESCRIPTION

김종민 지음 | 오픈소스 & 웹 시리즈_068 | ISBN: 9788998139797 | 30,000원 | 2015년 02월 16일 발행 | 408쪽

Citation preview

Page 1: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진
Page 2: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치:루씬 기반의 실시간 오픈소스 검색엔진

Page 3: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

지은이 김종민

펴낸이 박찬규 엮은이 윤가희 디자인 북누리 표지디자인 아로와 & 아로와나

펴낸곳 위키북스 전화 031-955-3658, 3659 팩스 031-955-3660

주소 경기도 파주시 문발로 115 세종출판벤처타운 #311

가격 30,000 페이지 408 책규격 188 x 240mm

초판 발행 2015년 02월 16일

ISBN 978-89-98139-79-7 (93000)

등록번호 제406-2006-000036호 등록일자 2006년 05월 19일

홈페이지 wikibook.co.kr 전자우편 [email protected]

First Edition published by WIKIBOOKS. Printed in Korea.

Copyright © 2015 by 김종민 & 위키북스

All rights reserved.

Elasticsearch is a trademark of Elasticsearch BV, registered in the U.S. and in other countries.

이 책의 한국어판 저작권은 저작권자와의 독점 계약으로 위키북스가 소유합니다.

신 저작권법에 의해 한국 내에서 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다.

이 책의 내용에 대한 추가 지원과 문의는 위키북스 출판사 홈페이지 wikibook.co.kr이나

이메일 [email protected]을 이용해 주세요.

이 도서의 국립중앙도서관 출판예정도서목록(CIP)은

서지정보유통지원시스템 홈페이지(http://seoji.nl.go.kr)와

국가자료공동목록시스템(http://www.nl.go.kr/kolisnet)에서 이용하실 수 있습니다.

(CIP제어번호: CIP2015003583)

시작하세요! 엘라스틱서치:루씬 기반의 실시간 오픈소스 검색엔진

Page 4: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진
Page 5: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

오늘날에는 SNS, 블로그, 언론사 등으로부터 어마어마한 용량의 데이터들이 매일

쏟아져 나오고 있으며 이렇게 범람하는 정보 사이의 패턴과 연결점을 찾아 가치

있는 정보를 찾아내고 가공하는 기술이 빅데이터라는 이름의 트렌드로 자리 잡았

습니다. 수많은 기업과 단체들이 빅데이터 연구에 힘을 쏟고 있으며 최근 자신들

의 노하우를 가지고 데이터 엔지니어링을 전문으로 하는 스타트업들도 많이 생기

고 있습니다.

필자 역시 데이터를 다루는 스타트업을 시작하면서 여러 가지 관련 기술을 찾고

배우던 중 엘라스틱서치를 만났습니다. 빅데이터 시스템 구축을 위해 여러 시행

착오를 거쳐 가며 복잡한 기술들을 배워 나가던 필자에게 엘라스틱서치는 충격 그

자체였습니다. 프로세스를 실행한 것만으로 노드들이 자동 연결되어 분산 시스템

이 바로 완성되며, 생성된 노드들로 데이터를 옮겨가며 스스로 데이터 무결성을

유지하는 모습은 이전에 어떤 시스템에서도 보지 못했던 유연함이었습니다.

엘라스틱서치의 매력에 푹 빠져 사용하면서 국내에 엘라스틱서치를 더 알리고 정

보를 교환하고 싶은 생각이 들어 커뮤니티 활동을 시작하였습니다. 엘라스틱서치

본사 매니저인 Leslie Hawthorn과 연락이 되어 국내 커뮤니티 활동이 엘라스틱서

머리말

IV

Page 6: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

치 본사 블로그에도 업데이트되고, 페이스북 그룹 링크도 게시되는 등 많은 일이

있었습니다. 특히 나날이 늘어가는 커뮤니티 멤버와 국내에도 엘라스틱서치를 도

입하는 기업들이 점점 늘어가는 걸 보면서 앞으로 엘라스틱서치의 전망이 밝다는

것을 실감할 수 있었습니다.

아직은 생소할 수 있는 검색엔진이라는 분야와 엘라스틱서치를 이 책을 통해 소개

할 수 있게 되어 기쁘게 생각합니다. 이 책이 세상에 나올 수 있도록 기회를 주시

고 감수와 편집 작업에 애써 주신 위키북스에 감사를 드리며 많이 부족하지만 이

책을 읽는 분들이 엘라스틱서치를 사용하는 데에 조금이나마 도움이 될 수 있기를

희망합니다.

마지막으로 저를 믿고 응원해 주시는 부모님과 동생, 사랑하는 아내 정아름, 큰아

들 래원이 그리고 앞으로 만날 둘째 햇살이에게 사랑과 감사를 전하며 제 삶을 인

도 해 주시는 하나님께 영광을 돌립니다.

머리말

V

Page 7: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

01엘라스틱서치

1.1 엘라스틱서치 사용 사례....................................................................................................................... 17

1.2 엘라스틱서치 특징................................................................................................................................... 19

1.3 데이터 색인.................................................................................................................................................. 21

1.4 JSON 문서와 Rest API........................................................................................................................ 22

1.4.1 JSON 문서............................................................................................................................................. 24

1.4.2 REST API.............................................................................................................................................. 25

1.5 솔라, 몽고디비와 엘라스틱서치 비교............................................................................................ 26

1.5.1 솔라와 엘라스틱서치......................................................................................................................... 26

1.5.2 몽고DB와 엘라스틱서치.................................................................................................................. 28

1.6 정리.................................................................................................................................................................... 29

02엘라스틱서치 설치와 실행

2.1 엘라스틱서치 설치................................................................................................................................... 30

2.1.1 엘라스틱서치 설치 파일 비교......................................................................................................... 30

2.1.2 유닉스 운영체제에서 설치와 실행............................................................................................... 32

2.1.3 유닉스 서비스로 설치 및 실행...................................................................................................... 38

2.1.4 윈도 운영체제에서 설치 및 실행.................................................................................................. 39

2.1.5 윈도 서비스로 설치 및 실행........................................................................................................... 42

목 차

VI

Page 8: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

2.2 엘라스틱서치 프로그램 구조............................................................................................................. 43

2.3 환경 설정....................................................................................................................................................... 48

2.3.1 bin/elasticsearch.in.sh................................................................................................................... 49

2.3.2 config/elasticsearch.yml............................................................................................................... 52

2.3.3 config/logging.yml........................................................................................................................... 61

2.4 플러그인 설치............................................................................................................................................. 62

2.5 정리................................................................................................................................................................... 66

03데이터 처리

3.1 엘라스틱서치의 데이터 구조............................................................................................................. 67

3.2 엘라스틱서치 데이터 처리.................................................................................................................. 69

3.2.1 데이터 입력.......................................................................................................................................... 69

3.2.2 데이터 삭제.......................................................................................................................................... 73

3.2.3 데이터 업데이트(_update) API.................................................................................................... 75

3.2.4 파일을 이용한 데이터 처리............................................................................................................ 82

3.2.5 벌크(_bulk) API를 이용한 배치 작업......................................................................................... 84

3.2.6 벌크 UDP API..................................................................................................................................... 89

3.3 포스트맨을 이용한 윈도에서 엘라스틱서치 사용................................................................. 92

3.4 정리................................................................................................................................................................... 94

목 차

VII

Page 9: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

04시스템 구조

4.1 클러스터와 노드........................................................................................................................................ 95

4.1.1 노드 바인딩........................................................................................................................................... 96

4.1.2 마스터 노드와 데이터 노드..........................................................................................................103

4.2 샤드와 복사본...........................................................................................................................................107

4.3 네트워크 바인딩과 디스커버리......................................................................................................110

4.3.1 젠 디스커버리....................................................................................................................................111

4.3.2 아마존 EC2 디스커버리................................................................................................................117

4.4 정리.................................................................................................................................................................121

05검색

5.1 검색(_search) API................................................................................................................................123

5.2 URI 검색.......................................................................................................................................................128

5.2.1 q(query)...............................................................................................................................................128

5.2.2 df(default field).................................................................................................................................130

5.2.3 default_operator.............................................................................................................................131

5.2.4 explain.................................................................................................................................................132

5.2.5 _source...............................................................................................................................................133

목 차

VIII

Page 10: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

5.2.6 fields.....................................................................................................................................................134

5.2.7 sort........................................................................................................................................................135

5.2.8 timeout................................................................................................................................................140

5.2.9 from......................................................................................................................................................141

5.2.10 size.....................................................................................................................................................142

5.2.11 search_type.....................................................................................................................................142

5.3 리퀘스트 바디 검색...............................................................................................................................146

5.3.1 size, from, fields..............................................................................................................................147

5.3.2 sort........................................................................................................................................................149

5.3.3 _source..............................................................................................................................................154

5.3.4 partial_fields, fielddata_fields....................................................................................................157

5.3.5 highlight..............................................................................................................................................160

5.4 정리.................................................................................................................................................................162

06페이셋과 어그리게이션

6.1 페이셋............................................................................................................................................................163

6.1.1 텀 페이셋.............................................................................................................................................166

6.1.2 범위 페이셋........................................................................................................................................170

6.1.3 히스토그램 페이셋...........................................................................................................................173

6.1.4 날짜 히스토그램 페이셋................................................................................................................176

6.1.5 필터와 질의 페이셋.........................................................................................................................177

6.1.6 통계 페이셋........................................................................................................................................179

6.1.7 위치 거리 페이셋..............................................................................................................................181

목 차

IX

Page 11: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

6.2 어그리게이션.............................................................................................................................................186

6.2.1 최소, 최대, 합, 평균, 개수 어그리게이션................................................................................187

6.2.2 상태, 확장 상태 어그리게이션....................................................................................................189

6.2.3 글로벌 어그리게이션......................................................................................................................191

6.2.4 필터, 누락 어그리게이션..............................................................................................................193

6.2.5 텀 어그리게이션...............................................................................................................................195

6.2.6 범위, 날짜 범위 어그리게이션....................................................................................................198

6.2.7 히스토그램, 날짜 히스토그램 어그리게이션.........................................................................202

6.2.8 위치 거리, 위치 해시 그리드 어그리게이션..........................................................................207

6.3 정리.................................................................................................................................................................212

07질의(QueryDSL)

7.1 쿼리.................................................................................................................................................................214

7.1.1 텀, 텀즈 쿼리......................................................................................................................................214

7.1.2 매치, 다중 매치(multi match) 쿼리............................................................................................218

7.1.3 불 쿼리.................................................................................................................................................223

7.1.4 문자열 쿼리.........................................................................................................................................224

7.1.5 접두어 쿼리.........................................................................................................................................226

7.1.6 범위 쿼리.............................................................................................................................................227

7.1.7 전체 매치 쿼리...................................................................................................................................229

7.1.8 퍼지 쿼리.............................................................................................................................................230

목 차

X

Page 12: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

7.2 필터.................................................................................................................................................................232

7.2.1 텀, 텀즈 필터......................................................................................................................................232

7.2.2 범위 필터............................................................................................................................................235

7.2.3 and, or, not 필터.............................................................................................................................236

7.2.4 불 필터.................................................................................................................................................238

7.2.5 위치 필터............................................................................................................................................240

7.3 정리.................................................................................................................................................................244

08매핑

8.1 매핑(_mapping) API...........................................................................................................................245

8.2 내장필드.......................................................................................................................................................249

8.2.1 _id..........................................................................................................................................................250

8.2.2 _source...............................................................................................................................................252

8.2.3 _all........................................................................................................................................................256

8.2.4 _analyzer...........................................................................................................................................257

8.2.5 _timestamp........................................................................................................................................258

8.2.6 _ttl(time to live)................................................................................................................................260

8.3 데이터 타입................................................................................................................................................260

8.3.1 문자열...................................................................................................................................................261

8.3.2 숫자.......................................................................................................................................................265

8.3.3 날짜......................................................................................................................................................268

목 차

XI

Page 13: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

XII..

8.3.4 불린......................................................................................................................................................269

8.3.5 바이너리..............................................................................................................................................269

8.3.6 객체......................................................................................................................................................269

8.3.7 중첩.......................................................................................................................................................274

8.3.8 좌표......................................................................................................................................................280

8.3.9 위치 모형............................................................................................................................................289

8.4 다중필드.......................................................................................................................................................293

8.4.1 다중필드..............................................................................................................................................293

8.4.2 토큰 수................................................................................................................................................295

8.4 필드 복사.....................................................................................................................................................297

8.5 정리.................................................................................................................................................................301

09분석

9.1 분석.................................................................................................................................................................302

9.1.1 분석 과정.............................................................................................................................................302

9.1.2 _analyze API.....................................................................................................................................304

9.1.3 사용자 정의 분석기.........................................................................................................................307

9.2 분석기............................................................................................................................................................310

9.2.1 standard 분석기...............................................................................................................................311

9.2.2 simple 분석기...................................................................................................................................312

목 차

Page 14: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

XIII

9.2.3 whitespace 분석기.........................................................................................................................312

9.2.4 stop 분석기........................................................................................................................................313

9.2.5 keyword 분석기..............................................................................................................................314

9.2.6 pattern 분석기..................................................................................................................................315

9.2.7 다국어 분석기...................................................................................................................................319

9.2.8 snowball 분석기..............................................................................................................................322

9.3 토크나이저..................................................................................................................................................324

9.3.1 standard 토크나이저......................................................................................................................325

9.3.2 nGram 토크나이저.........................................................................................................................325

9.3.3 edgeNGram 토크나이저..............................................................................................................328

9.3.4 keyword 토크나이저.....................................................................................................................330

9.3.5 letter 토크나이저.............................................................................................................................330

9.3.6 lowercase 토크나이저..................................................................................................................330

9.3.7 whitespace 토크나이저................................................................................................................331

9.3.8 pattern 토크나이저.........................................................................................................................331

9.3.9 uax_url_email 토크나이저...........................................................................................................332

9.3.10 path_hierarchy 토크나이저......................................................................................................332

9.3.11 classic 토크나이저........................................................................................................................334

9.4 토큰필터.......................................................................................................................................................334

9.4.1 standard 토큰필터..........................................................................................................................336

9.4.2 asciifolding 토큰필터.....................................................................................................................336

9.4.3 length 토큰필터...............................................................................................................................336

9.4.4 lowercase 토큰필터......................................................................................................................338

9.4.5 uppercase 토큰필터.....................................................................................................................338

9.4.6 nGram 토큰필터..............................................................................................................................338

9.4.7 edgeNGram 토큰필터...................................................................................................................339

9.4.8 porter_stem 토큰필터...................................................................................................................339

목 차

Page 15: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

9.4.9 shingle 토큰필터.............................................................................................................................339

9.4.10 stop 토큰필터.................................................................................................................................343

9.4.11 word_delimiter 토큰필터............................................................................................................344

9.4.12 stemmer 토큰필터........................................................................................................................346

9.4.13 keyword_marker 토큰필터.......................................................................................................348

9.4.14 keyword_repeat 토큰필터........................................................................................................350

9.4.15 unique 토큰필터............................................................................................................................351

9.4.16 snowball 토큰필터........................................................................................................................353

9.4.17 synonym 토큰필터.......................................................................................................................353

9.4.18 합성어 토큰필터.............................................................................................................................357

9.4.19 reverse 토큰필터..........................................................................................................................359

9.4.20 truncate 토큰필터........................................................................................................................361

9.4.21 trim 토큰필터...................................................................................................................................362

9.4.22 limit 토큰필터..................................................................................................................................362

9.4.23 hunspell 토큰필터........................................................................................................................363

9.4.24 cjk_bigram 토큰필터..................................................................................................................364

9.4.25 킵워드 토큰필터............................................................................................................................366

9.5 한글 형태소 분석기...............................................................................................................................367

9.6 정리.................................................................................................................................................................371

목 차

XIV

Page 16: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

10ELK 스택

10.1 로그스태시..............................................................................................................................................372

10.1.1 입력, 출력, 필터...........................................................................................................................373

10.1.2 입력 및 출력 설정.......................................................................................................................375

10.1.3 필터 설정.......................................................................................................................................379

10.1.4 엘라스틱서치 설정......................................................................................................................382

10.2 키바나........................................................................................................................................................386

10.2.1 대시보드 설정...............................................................................................................................387

10.2.2 행과 패널.......................................................................................................................................390

10.2.3 hits 패널........................................................................................................................................392

10.2.4 terms 패널....................................................................................................................................393

10.2.5 Histogram 패널..........................................................................................................................395

10.2.6 Table 패널....................................................................................................................................397

10.2.7 질의와 필터..................................................................................................................................399

10.2.8 검색어 쿼리..................................................................................................................................402

10.3 정리.............................................................................................................................................................403

목 차

XV

Page 17: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진16

우리는 지금 정보의 홍수 속에 살고 있다. 매일 매초 인터넷에 연결된 수없이 많은 시스템으로부터

헤아릴 수 없을 만큼 많은 데이터가 쏟아져 나오고 있으며, 이 데이터로부터 의미 있고 가치 있는 정

보를 뽑아내기 위한 시스템 또한 수도 없이 개발되고 있다. 특히 SNS와 각종 포털 사이트에서 사용

자의 활동 정보 등에 대한 대용량 데이터의 실시간 분석 기술은 “빅데이터”라는 이름의 트렌드로 자

리 잡으며 수많은 업체와 정부 기관에 데이터 활용의 새 지평을 열었다.

이와 같은 정보의 홍수 속에서 필요로 하는 정확한 데이터를 검색하여 찾는 기술은 무엇보다 중요해

졌다. 데이터를 검색하는 데 있어 전 세계적으로 가장 널리 사용되고 있는 기술 중 하나가 바로 아파

치 루씬(Apache Lucene)이다. 자바로 개발된 루씬은 오픈소스로 현재 아파치 Top 레벨 프로젝트

로 등록돼 있다. 루씬은 강력한 검색 기능이 있지만, 완전한 솔루션이 아닌 라이브러리로 제공되기

때문에 개인이나 기업에서 실제로 사용하려면 루씬 라이브러리를 이용해 검색 솔루션을 스스로 개

발해야 한다.

아파치 루씬 라이브러리를 실무에서 사용하기 위해 티카(Tica), 솔라(Solr) 등의 솔루션이 개발되고

있는데 가장 최근에 개발돼 선풍적인 인기를 끌고 있는 솔루션이 바로 엘라스틱서치다. 엘라스틱서

치는 세이 베논(Shay Banon)이 개발했으며 현재 오픈소스 프로젝트로 진행되고 있다. 분산 환경

에서의 병렬 처리와 실시간 검색을 지원하고, 확장성이 뛰어나 대규모 시스템을 쉽게 구축할 수

있다.

01엘라스틱서치

Page 18: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

01. 엘라스틱서치 17

이 책에서는 엘라스틱서치를 이용한 데이터 검색 시스템을 쉽고 빠르게 구축하는 방법을 소개하고

자 한다. 이 책은 검색 엔진을 처음 다루는 입문자에 초점을 맞추고 있지만, 엘라스틱서치를 이용한

고급 검색 기술을 익히고자 하는 사람도 유용한 정보를 얻을 수 있을 것이다. 이 책의 내용을 이해하

려면 유닉스 시스템 명령어와 자바 프로그래밍 언어에 대한 기초적인 지식이 필요하다.

.≆ .1장에서는.엘라스틱서치의.특징을.소개한다..엘라스틱서치를.구성하고.있는.아파치.루씬.엔진과.엘라스틱서치의.여러.가지.

특징,.엘라스틱서치를.사용.중인.기업의.사례.등을.소개하고.엘라스틱서치를.사용하기.위해.알아야.할.중요한.기술인.JSON

과.Rest.API에.관해.설명한다.

.≆ .2장에서는.엘라스틱서치의.설치와.설정을.다룬다..유닉스.운영체제와.윈도.운영체제.환경에서.엘라스틱서치를.설치하고.실

행하는.방법과.환경.설정에.관해.설명한다.

.≆ .3장에서는.엘라스틱서치의.데이터.구조에.대한.설명과.데이터를.입력,.출력,.삭제하는.방법,.그리고.기본적인.검색.명령.구

조를.살펴본다.

.≆ .4장에서는.엘라스틱서치를.이루는.시스템.구조인.클러스터와.노드,.샤드에.대해서.설명하고.다양한.형태의.분산.시스템을.

구성해본다.

.≆ 5장에서는.엘라스틱서치에서.검색을.수행하는.방법과.기본적인.옵션을.살펴본다.

.≆ 6장에서는.데이터의.통계를.위해.사용할.수.있는.페이셋과.어그리게이션을.살펴본다.

.≆ 7장에서는.다양한.검색.결과를.위해.엘라스틱서치에서.사용하는.질의(QueryDSL).문법을.살펴본다.

.≆ 8장에서는.엘라스틱서치의.스키마에.해당하는.매핑을.설정하는.방법과.다양한.데이터.타입을.살펴본다.

.≆ 9장에서는.엘라스틱서치에.데이터가.실제로.어떤.구조로.분석되고.해석돼.저장되는지.살펴보고.다양한.분석기를.알아본다.

.≆ .10장에서는.엘라스틱서치,.로그스태시,.키바나의.조합인.ELK.스택(ELK.Stack)을.이용해.실제로.엘라스틱서치의.데이터를.

활용하는.완성된.형태의.대시보드.시스템을.만들어.본다.

1.1 엘라스틱서치 사용 사례

현재 다음과 같은 기업과 단체에서 엘라스틱서치를 도입해 활용 중이다.

.≆ .위키피디아(Wikipedia)는.엘라스틱서치를.이용해.전문검색(Full.Text.Search)을.수행하고.실시간.타이핑.검색,.추천.검색어.

기능.등에.활용.중이다.

.≆ .더.가디안(The.Guardian).지는.방문객의.로그.분석을.통한.소셜.데이터를.생성해.실시간.응대와.기사에.대한.반응.분석.등

에.엘라스틱서치를.사용하고.있다.

Page 19: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진18

.≆ .스택오버플로우(StackOverflow)에서는.검색.내용과.결과를.통합해.유사한.질문과.해답을.연결하는.데.엘라스틱서치를.활

용하고.있다.

.≆ .깃허브(Github)에서는.1,300억.줄이.넘는.소스.코드를.검색하는.데.엘라스틱서치를.사용.중이다.

.≆ .골드만.삭스(Goldman.Sachs)에서는.매일.5TB가.넘는.데이터를.저장하고.있으며,.엘라스틱서치를.이용해.이.데이터를.주

식.시장의.변동을.분석하는.데.사용한다.

이처럼 엘라스틱서치는 이미 영향력 있는 기업에서 그 성능을 인정받아 활용되고 있으며 계속해서

사용처를 넓혀가는 중이다.

엘라스틱서치 공식 홈페이지의 사용 사례 페이지(http://www.elasticsearch.org/case-studies)

에 엘라스틱서치를 사용 중인 기업과 단체의 목록이 있으며 계속해서 증가하고 있으므로 한번 방문

해서 확인해보기 바란다. 각 기업에 대한 사용 사례가 기업마다 별도 페이지로 자세하게 설명돼 있

으므로 사용 사례에 관한 유용한 정보를 얻을 수 있다.

그림 1.1 깃허브(Github)의 엘라스틱서치 사용 사례

Page 20: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

01. 엘라스틱서치 19

1.2 엘라스틱서치 특징

엘라스틱서치는 뛰어난 검색 기능과 대규모 분산 시스템을 구축할 수 있도록 수많은 기능을 지원한

다. 강력한 검색 기능을 제공하지만, 설치 과정과 사용 방법은 매우 쉽고 편리하다. 엘라스틱서치는

기업에서뿐만 아니라 개인을 위한 검색 엔진 프로젝트에도 널리 활용할 수 있다. 기존의 데이터베이

스 시스템에서는 다루기 어려운 전문검색(Full Text Search)과 문서의 점수화를 이용한 정렬, 데이

터 증가량에 구애받지 않는 실시간 검색 등을 엘라스틱서치를 이용해 구현할 수 있다. 또한, 엘라스

틱서치는 다양한 플러그인을 손쉽게 설치해서 기능을 확장할 수도 있고 아마존 웹 서비스(AWS), 마

이크로소프트 애저(Azure)와 같은 클라우드 서비스나 하둡(Hadoop)과 같은 빅데이터 플랫폼과의

연동도 지원한다.

엘라스틱서치의 주요 특징을 살펴보면 다음과 같다.

아파치 루씬 기반

아파치 루씬은 자바 언어로 개발된 검색 라이브러리다. 창시자인 더그 커팅(Doug Cutting)이 2000

년 3월 Sourceforge에 최초 버전을 공개했으며, 현재는 엘라스틱서치를 비롯한 솔라(Solr), 티카

(Tica)와 같은 프로젝트를 통해 널리 사용되고 있다. 아파치 루씬은 매우 강력한 기능이 있는 검색

엔진으로 사용자 위치 정보(geolocation)를 이용할 수 있고, 다국어 검색, 철자 수정 기능(Did you

mean suggestion), 자동완성, 미리 보기 등의 다양한 기능을 지원한다.

엘라스틱서치는 아파치 루씬을 기반으로 만들어졌기 때문에 루씬의 기능을 대부분 지원하며, 마찬

가지로 자바 언어로 개발됐다. 엘라스틱서치를 실행하려면 1.1.x 이하는 자바 6 이상의 버전이 설치

돼 있어야 하고, 1.2.x부터는 자바 7 이상의 버전이 설치돼 있어야 한다.

실시간 분석

엘라스틱서치에 저장된 데이터는 검색에 사용되기 위해 별도의 재시작이나 상태의 갱신이 필요하지

않다. 데이터는 색인 작업이 완료됨과 동시에 바로 검색할 수 있다. 이러한 특징을 엘라스틱서치에

서는 실시간(Real Time) 분석이라 부른다.

분산 시스템

엘라스틱서치는 여러 개의 노드로 구성되는 분산 시스템(Distributed)이다. 노드는 데이터를 색인

하고 검색 기능을 수행하는 엘라스틱서치의 단위 프로세스다. 소규모의 시스템에서 적은 수의 노드

Page 21: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진20

로 시스템을 구성한 후에 시스템의 규모가 늘어나면 기존 노드에 새 노드를 실행해 연결하는 것으로

쉽게 시스템을 확장할 수 있다. 또한, 데이터는 각 노드에 분산 저장되고 복사본을 유지해 각종 충돌

로부터 노드 데이터의 유실(Fail)을 방지한다.

높은 가용성

엘라스틱서치는 하나 이상의 노드로 구성돼 있으며, 각 노드는 1개 이상의 데이터 원본과 복사본을

가지고 있어 서로 다른 위치에 나누어 저장한다. 노드가 종료되거나 실행에 실패(Fail)하는 경우 엘

라스틱서치는 노드들의 상태를 감지하고 종료된 노드가 가지고 있던 데이터를 다른 노드로 옮기는

작업을 수행한다. 이러한 과정으로 엘라스틱서치는 항상 일정한 데이터 복사본의 개수를 유지하고

높은 가용성(High Availability)과 안전성을 보장한다.

멀티 테넌시

엘라스틱서치의 데이터는 여러 개로 분리된 인덱스들(Indices)에 그룹으로 저장된다. 인덱스는 관

계형 DB 모델에서의 데이터베이스로 대응되는데, 관계형 DB에서 다른 데이터베이스의 데이터를

검색하려면 별도의 컨넥션을 생성해야 하는 것과 달리 엘라스틱서치에서는 데이터를 검색할 때 서

로 다른 인덱스의 데이터를 바로 하나의 질의로 묶어서 검색하고 여러 검색 결과를 하나의 출력으로

도출할 수 있다. 이러한 특징을 엘라스틱서치에서는 멀티 테넌시(Multi Tenancy)라고 한다.

전문검색

엘라스틱서치는 데이터 색인(Indexing)을 이용한 전문검색(Full Text Search)을 지원한다. 데이터

의 전체 문장에서 검색어를 추출해 저장하고 이를 바탕으로 검색하는 전문검색을 지원한다. 데이터

색인 과정에 대해서는 1.3절에서 조금 더 자세하게 설명하겠다.

JSON 문서 기반

엘라스틱서치의 모든 데이터는 기본적으로 문서의 모든 필드가 색인돼 JSON 구조로 저장된다. 그

러므로 모든 레벨의 필드에 접근이 쉽고, 매우 빠른 속도로 검색된다. 또한, NoSQL과 같이 스키마

프리(Schema Free)를 지원하므로 별도의 사전 매핑 없이도 JSON 문서 형식으로 데이터를 입력하

면 바로 검색 가능한 형태로 색인 작업이 수행된다.

Page 22: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

01. 엘라스틱서치 21

RESTFul API

Restful API를 지원하므로 URI를 사용한 동작이 가능하다. 또한, HTTP 프로토콜로 JSON 문서의

입출력과 다양한 제어를 할 수 있다. JSON과 Restful API에 대해서는 1.4절에서 조금 더 자세하게

설명하겠다.

1.3 데이터 색인

검색을 다루다 보면 검색과 색인이라는 단어를 자주 만나게 된다. 단어가 여러 뜻으로 혼용되어 쉽

게 헷갈릴 수 있으므로 혼란을 방지하기 위해 아파치 루씬과 엘라스틱서치에서 사용되는 몇 가지 중

요한 개념의 용어를 우선 정리하고 가자.

.≆ .[동사].색인(indexing):.검색할.데이터를.검색할.수.있는.구조로.변경하기.위해.원본.문서를.변환하여.저장하는.일련의.과정..

이.책에서는.색인.또는.색인.과정이라.명명한다.

.≆ .[명사].색인(index):.색인.과정을.거친.결과물.또는.색인된.데이터가.저장되는.데이터.공간..이.책에서는.색인.또는.색인.공

간이라.명명한다.

.≆ .검색(searching):.색인에.들어있는.토큰을.기준으로.해당하는.토큰이.포함되는.문서를.찾는.과정.

.≆ 질의(query):.사용자가.원하는.결과를.출력하기.위해.검색.시.입력하는.검색어.또는.검색.조건..

색인 과정

(indexing)

텍스트 분석

색인에 추가

검색

(searching)

질의 생성

결과 출력

원본

텍스트

색인 공간

(index)

그림 1.2 검색 애플리케이션에서의 색인과 검색 구조

관계형 DB에서는 데이터를 테이블 구조로 저장한다. 하지만 아파치 루씬에서는 데이터를 검색할

수 있는 구조로 저장하기 위해 색인(indexing) 절차를 거쳐 입력된 텍스트를 토큰으로 변환해 역파

일 색인(inverted index)이라는 구조로 저장한다.

일반적으로 관계형 DB 테이블에서는 데이터를 다음과 같이 전체 텍스트를 하나의 칼럼으로 저장

한다.

Page 23: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진22

표 1.1 관계형 DB 테이블에서 텍스트 저장

문서 문서 내용

Doc 1 blue sky green land red sun

Doc 2 blue ocean green land

Doc 3 red flower blue sky

아파치 루씬과 엘라스틱서치에서는 이러한 원본 문서에 대한 색인 과정을 진행해 해당 문서들의 텍

스트를 추출한 뒤 색인 공간에 저장한다. 여기는 역으로 각 텍스트의 토큰들이 해당 텍스트를 포함

하는 문서를 가리키는 구조로 저장된다. 관계형 DB는 책의 맨 앞에 주제 순서대로 나온 목차와 같

고, 역파일 색인은 책의 맨 뒤에 있는 찾아보기 페이지를 생각하면 이해하기 쉽다. 보통 책의 맨 뒤

에는 중요한 키워드가 알파벳 순서대로 나열돼 있고 해당 키워드에 대한 내용이 몇 페이지에 있는지

가리키고 있다. 역파일 색인도 이와 같은 방식으로 데이터를 저장한다.

표 1.2 색인 공간에 저장된 역파일 색인 데이터 구조

검색어 검색어가 가리키는 문서

blue Doc 1, Doc 2, Doc 3

sky Doc 1, Doc 3

green Doc 1, Doc 2

land Doc 1, Doc 2

검색어 검색어가 가리키는 문서

red Doc 1, Doc 3

ocean Doc 2

flower Doc 3

sun Doc 1

검색 과정은 이렇게 색인된 텍스트를 검색해 해당 텍스트가 포함된 문서를 결과로 출력하는 과정으

로 이뤄진다. 관계형 DB에서는 sky라는 단어를 검색하면 Doc 1, Doc 2, Doc 3 문서를 차례로 읽

어내려 가며 찾아가지만, 엘라스틱서치에서는 문서를 미리 색인해서 색인 공간에 표 1.2와 같은 역

파일 색인 데이터 구조를 만들어 놓고, sky라는 단어를 검색했을 때 색인 공간에서 sky 단어가 가리

키는 Doc 1, Doc 3 문서를 출력한다.

1.4 JSON 문서와 Rest API

엘라스틱서치를 사용하려면 기본적인 데이터 구조를 이루고 있는 JSON 형식의 데이터와 동작 구현

방식인 REST API에 관한 이해가 필요하다. 이 REST API 방식이 엘라스틱서치로 하여금 누구에게

나 쉬운 접근성을 제공하는 근거가 된다.

Page 24: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

01. 엘라스틱서치 23

REST API는 슬래시(/)로 구분된 네트워크 주소와 메서드만으로 네트워크에 있는 정보 자원을 가져

오는 방식으로 현재 포털 사이트나 소셜 네트워크 서비스 등에서 공개 API 서비스에 널리 사용하고

있다. 예를 들어 다음 URL은 트위터의 REST API로, “twitterapi”라는 사용자의 트위터 타임라인

데이터를 가져올 수 있다.

트위터의 REST API

https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=twitterapi&count=2

이렇게 가져온 정보는 주로 XML 또는 JSON 형식으로 전달되는데, XML은 < > 태그 형식으로 표현

된 마크업 문서이고, 엘라스틱서치에서 사용되는 JSON은 name : value와 같은 형식으로 표현된

훨씬 더 경량화된 데이터 형식이다.

JSON 형식으로 가져온 트위터 데이터

[

{

"coordinates": null,

"favorited": false,

"truncated": false,

… 중략 ...

"show_all_inline_media": false,

"screen_name": "twitterapi"

},

"in_reply_to_screen_name": null,

"source": "<a href=\"http://sites.google.com/site/yor/\" rel=\"nofollow\"> Yor</a>",

"in_reply_to_status_id": null

}

]

엘라스틱서치를 본격적으로 활용하기 전에 JSON 문서와 REST API에 대해 조금 더 살펴보겠다.

Page 25: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진24

1.4.1 JSON 문서

JSON(Javascript Object Notation)은 웹에서 자료를 주고받을 때 사용하는 경량 데이터 형식이다.

태그 기반의 데이터 형식인 XML과 비교하여 데이터 용량이 획기적으로 줄어들었고 전송 및 처리

속도 역시 그만큼 빨라졌다. 사람이 읽고 쓰기에도 쉬우며, 기계가 분석하고 처리하기에도 쉬운 형

식으로 되어 있다. 자바스크립트의 구문 형식을 따르지만 다른 프로그래밍 언어나 플랫폼에서도 널

리 사용되고 있다. 표현할 수 있는 기본 자료형으로는 수, 문자열, 참/거짓이 있고, 집합 자료형으로

는 객체와 배열이 있다.

.≆ 수는.기본적으로.정수와.실수로.표현하며,.기호로.묶지.않는다.

.≆ 문자열은.항상.큰따옴표(")로.묶어야.한다..문자열.안에서의.역슬래시(\)는.제어.문자로.사용된다.

.≆ 참/거짓은.true/false로.표현하며,.기호로.묶지.않는다.

.≆ .객체는.name.:.value의.쌍으로.된.비.순서화된.SET이다..객체는.왼쪽.중괄호({)로.시작하며.오른쪽.중괄호(})로.끝난다..각.

name의.뒤에는.콜론(:)을.붙이고.쉼표(,)로.name.:.value.쌍을.구분.짓는다..name은.문자열이므로.따옴표(")로.묶어.사용한

다..value에는.기본.자료형과.객체,.배열.자료형의.요소,.그리고.null이.올.수.있다.

.≆ .배열은.순서화된.SET이며.왼쪽.대괄호([)로.시작하여.오른쪽.대괄호(])로.끝난다..각.배열.요소에는.기본.자료형과.객체,.배열

의.집합.자료형이.올.수.있다.

다음은 JSON 문서의 예제다.

{

"이름" : "홍길동",

"나이" : 20,

"성별" : "남",

"기혼" : false,

"특기" : [ "도술", "학문" ],

"가족" : {

"아버지" : { "이름" : "홍상직", "직급" : "판서" },

"어머니" : { "이름" : "춘섬", "직급" : "기생" },

"형제" : [ { "이름" : "귀동", "구분" : "장남" }, { "이름" : "일동", "구분" : "차남" } ]

}

}

엘라스틱서치에서는 기본적으로 모든 데이터가 위와 같은 JSON 문서 형식으로 저장된다. 저장된

자료뿐만 아니라 엘라스틱서치 환경 변수나 검색을 위한 명령 구문까지도 모두 JSON 형식으로 처

리되므로 JSON 문서 형식을 파악하고 다루는 것에 익숙해야 한다.

Page 26: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

01. 엘라스틱서치 25

1.4.2 REST API

REST API는 2000년 로이 필딩(Roy Fielding)이 논문에서 REST(Representational State

Transfer)를 소프트웨어 아키텍처 스타일로 제안했고, 이후에 OPEN API를 개발하는 기본 구조로

확산됐다.

REST는 자원지향구조(ROA: Resource Oriented Architecture)로 웹의 콘텐츠(텍스트, 이미지,

동영상)를 하나의 자원으로 파악하여 각 자원의 고유한 URI(Uniform Resource Identifier)를 부

여하고 해당 자원에 대한 CRUD(Create, Read, Update, Delete) 작업을 HTTP의 기본 메서드인

POST, GET, PUT, DELETE를 이용해 처리하는 방식이다.

HTTP 메서드와 CRUD, SQL을 비교하면 다음과 같다.

표 1.3 HTTP 메서드, CRUD, SQL 비교

HTTP 메서드 CRUD SQL

GET Read Select

PUT Update Update

POST Create Insert

DELETE Delete Delete

엘라스틱서치에서의 REST 자원은 색인된 데이터 및 질의, 검색되어 JSON 형식으로 출력된 문서

들이다. 다시 말해 엘라스틱서치의 JSON 문서를 URI로 명시하고 이 문서를 처리하기 위해 POST,

GET, PUT, DELETE 메서드를 이용한다고 볼 수 있다.

REST URI의 형태는 슬래시(/)로 구분된다. 엘라스틱서치에서 다음과 같은 URI 들로 REST API를

이용한다.

엘라스틱서치 노드들의 상태 값을 표시하는 URI

http://localhost:9200/_cluster/state/nodes

JSON 형식으로 표현된 위 명령의 결과

{

"cluster_name" : "elasticseaerch",

"nodes" : {

"-HNbPOuMQWabav6tilHulw" : {

"name" : "node1",

Page 27: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진26

"transport_address" : "inet[/192.168.1.11:9300]",

"attributes" : { }

}

}

}

1.5 솔라, 몽고디비와 엘라스틱서치 비교

1.5.1 솔라와 엘라스틱서치

아파치 루씬은 완전한 애플리케이션이 아닌 검색 기능을 제공하는 자바 라이브러리이므로 검색 애

플리케이션을 구현하려면 루씬을 사용해 직접 프로그램을 작성하거나 다른 프로그램을 이용해야 한

다. 엘라스틱서치 외에 아파치 루씬을 활용해 만든 또 다른 대표적인 검색 애플리케이션으로는 솔라

(Solr)가 있다. 솔라 역시 다양한 기능을 지원하고 있어 엘라스틱서치와 많은 부분에서 서로 비교되

고 있다.

그림 1.3 아파치 솔라 - https://lucene.apache.org/solr/

Page 28: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

01. 엘라스틱서치 27

엘라스틱서치와 솔라는 다음과 같은 차이점이 있다.

표 1.4 솔라와 엘라스틱서치의 비교

솔라 4.7.0 엘라스틱서치 1.0

문서 형식 XML, CSV, JSON JSON

REST API 지원 지원

라이브러리 PHP, 루비, 펄, 스칼라, 파이썬, .NET, 자바스크

립트

PHP, 루비, 펄, 스칼라, 파이썬, .NET, 자바스크립트,

Erlang, Clojure

검색 기능을 사용

중인 서드파티 업체

Drupal, Magento, Django, ColdFusion,

Wordpress, OpenCMS, Plone, Typo3, ez

Publish, Symfony2, Riak(via Yokozuna)

Drupa l , D jango, Symfony2 , Wordpress ,

CouchBase

데이터 불러오기

(Data import) 지원

JDBC, CSV, XML, Tika, URL, Flat File Rivers modules - ActiveMQ, Amazon SQS,

CouchDB, Dropbox, DynamoDB, FileSystem,

Git, GitHub, Hazelcast, JDBC, JMS, Kafka, LDAP,

MongoDB, neo4j, OAI, RabbitMQ, Redis, RSS,

Sofa, Solr, St9, Subversion, Twitter, Wikipedia

다중 스키마 문서 지원하지 않음 지원

조인 지원하지 않음 parent_type/child_type을 이용해서 구현 가능

분산시스템의 노드

연결

주키퍼 젠 디스커버리, 주키퍼

솔라는 엘라스틱서치에서 지원하는 JSON 외에도 XML, CSV 형식의 데이터 구조를 지원한다. 또

한, 더 오랜 기간 동안 개발돼 왔기 때문에 엘라스틱서치보다 더 많은 업체에서 솔라를 채택하고 있

다. 반면 데이터 불러오기 기능에 있어서 엘라스틱서치는 River라는 플러그인 형식의 모듈을 사

용하고 있어 솔라에 비해 더욱 다양한 시스템 형식의 데이터를 불러올 수 있다. 대부분 NoSQL

데이터 시스템에서 지원하지 않는 조인 기능도 엘라스틱서치에서는 parent/child 타입을 이용

해 어느 정도 구현할 수 있다. 또한, 분산 시스템을 구축할 때 솔라는 분산시스템 관리자인 주키퍼

(ZooKeeper)를 사용하지만 엘라스틱서치는 젠 디스커버리(Zen Discovery)를 비롯한 다양한 디

스커버리를 내장하고 있기 때문에 별도의 분산 시스템 관리자가 필요하지 않아 더욱 손쉽게 분산 환

경을 구축할 수 있다.

Page 29: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진28

1.5.2 몽고DB와 엘라스틱서치

현재 MEAN Stack 플랫폼의 하나로 떠오르고 있는 몽고DB 또한 엘라스틱서치와 비슷한 점이 많아

자주 비교된다. 몽고DB는 새로운 형태의 데이터 저장소로 개발됐고, 엘라스틱서치는 검색 엔진으

로서 태생은 다르지만 JSON 문서를 이용해 저장한다는 점에서 둘은 매우 닮았다.

그림 1.4 몽고DB - http://www.mongodb.org/

엘라스틱서치와 몽고DB는 다음과 같은 차이점이 있다.

표 1.5 몽고DB와 엘라스틱서치의 비교

몽고DB(4.7.0) 엘라스틱서치 1.0

구분 데이터 저장소 아파치 루씬 검색 엔진 애플리케이션

개발언어 C++ 자바

운영체제 리눅스, 맥 OS X, 솔라리스, 윈도 자바 가상 머신이 설치된 모든 OS

접속방식 자체 프로토콜 RESTFul/HTTP API

문서 구조 JSON JSON

엘라스틱서치와 몽고DB는 모두 JSON 문서를 사용하므로 사용 방법이 매우 유사하지만 서로 다른

목적으로 만들어졌기 때문에 보통 데이터 저장이 중요한 시스템에는 몽고DB를, 검색이 중요한 시

스템에는 엘라스틱서치를 사용하도록 권장하고 있다.

Page 30: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

01. 엘라스틱서치 29

1.6 정리

지금까지 엘라스틱서치의 특징과 데이터의 색인, JSON과 REST API를 살펴봤다. 엘라스틱서치는

뛰어난 가용성과 간편한 사용법으로 현재 빠르게 사용자를 늘려가는 중이다. 이번 장에서 설명한 개

념 중 JSON과 REST API는 앞으로도 계속해서 사용할 개념이므로 익숙해지는 것이 중요하며, 색인

과 검색에 대한 개념도 엘라스틱서치를 계속 다루기 위해 반드시 이해해야 한다. 엘라스틱서치와 비

교하여 솔라와 몽고DB도 살펴봤지만, 엘라스틱서치를 포함한 이 모든 애플리케이션도 계속해서 새

로운 기능이 추가되며 개선되고 있기 때문에 앞서 현재 지원하지 않는 기능도 언젠가는 지원될 가능

성 또한 크다.

Page 31: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진30

이번 장에서는 본격적으로 엘라스틱서치를 설치하고 실행해보겠다. 엘라스틱서치는 유닉스 운영체

제를 기준으로 개발됐다. HTTP 프로토콜 기능을 수행하는 유닉스의 curl 명령을 주로 사용하므로

이 책에서도 유닉스 환경을 기준으로 설명을 진행한다. 맥 OS 또는 리눅스와 같은 유닉스 계열 운

영체제의 사용자는 앞으로 설명할 내용을 따라서 실습하면 된다. 또한, 접속할 수 있는 유닉스 서버

가 있다면 텔넷 접속을 이용해 실습할 수 있다. 실습을 위한 유닉스 환경을 준비하기 어려운 윈도 운

영체제 사용자는 3장에서 윈도에서 실습할 수 있는 포스트맨(Postman)을 소개할 예정이니 포스트

맨을 설치해서 실습을 진행해보자.

엘라스틱서치는 자바 환경에서 실행된다. 이 책에서 사용할 버전은 1.1.1 버전으로 자바 6 이상이 설

치된 환경이라면 운영체제에 관계없이 엘라스틱서치를 바로 실행할 수 있다. 자바가 설치돼 있지 않

다면 먼저 자바를 설치하고 난 후에 계속 진행하길 바란다.

2.1 엘라스틱서치 설치

2.1.1 엘라스틱서치 설치 파일 비교

엘라스틱서치 공식 홈페이지(http://www.elasticsearch.com)에서 오른쪽 위에 있는 Download

버튼을 클릭해 내려받기 페이지로 이동해보자. 다음과 같이 ZIP, TAR, DEB, RPM 형식의 파일을

내려받아 설치할 수 있다.

02엘라스틱서치 설치와 실행

Page 32: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 31

그림 2.1 엘라스틱서치 내려받기 페이지

이 파일들을 내려받고 압축을 풀어보면 배포 파일별로 차이가 있다.

유닉스 환경에서 사용하는 TAR 파일은 압축을 풀고 bin/ 디렉터리에 들어보면 다음과 같은 실행 파

일이 있다. elasticsearch 파일이 실제 실행 파일이고 elasticsearch.in.sh 파일은 실행 환경을 설정

하는 파일이다. 그리고 plugin 파일은 플러그인 설치를 위한 실행 파일이다.

그림 2.2 elasticsearch-*.tar.gz 배포 파일의 bin/ 디렉터리

ZIP 파일의 압축을 풀어보면 elasticsearch.bat, plugin.bat 등의 배치 파일과 elasticsearch-

service-mgr.exe와 같은 윈도 운영체제의 실행 파일을 추가로 볼 수 있다. ZIP 파일에 포함된

elasticsearch 파일 역시 유닉스에서도 실행할 수 있다.

Page 33: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진32

그림 2.3 elasticsearch-*.zip 배포 파일의 bin/ 디렉터리

DEB 파일과 RPM 파일은 유닉스 환경에서 엘라스틱서치를 서비스로 설치하기 위한 파일로 DEB

는 데비안 계열, RPM은 레드햇 계열 유닉스에서 사용하는 설치 파일이다. 그 외 계열의 유닉스와

맥OS에서는 서비스 설치 파일을 지원하지 않기 때문에 TAR 파일을 내려받아 압축을 풀고 프로그

램을 직접 실행해야 한다. 서비스로 설치하는 방법은 2.1.3절에서 설명하겠다.

2.1.2 유닉스 운영체제에서 설치와 실행

이제 엘라스틱서치의 압축을 풀고 설치된 디렉터리로 이동해서 bin/elasticsearch를 실행해보자.

프롬프트에서 다음과 같은 실행 결과를 볼 수 있다.

$ bin/elasticsearch

[21:20:43,388][INFO][node ] [Ahura] version[1.1.1], pid[23802], build[f1585f0/2014-04-

16T14:27:12Z]

[21:20:43,389][INFO][node ] [Ahura] initializing ...

[21:20:43,407][INFO][plugins ] [Ahura] loaded [], sites []

[21:20:45,351][INFO][node ] [Ahura] initialized

[21:20:45,351][INFO][node ] [Ahura] starting ...

[21:20:45,432][INFO][transport ] [Ahura] bound_address {inet[/0:0:0:0:0:0:0:0:9300]},

publish_address {inet[/192.168.0.40:9300]}

[21:20:48,458][INFO][cluster.service ] [Ahura] new_master [Ahura][0TBhlEU0TmKgunX9lnXPNw]

[.local][inet[/192.168.0.40:9300]], reason: zen-disco-join (elected_as_master)

[21:20:48,480][INFO][discovery ] [Ahura] elasticsearch/0TBhlEU0TmKgunX9lnXPNw

노드명

Page 34: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 33

[21:20:48,493][INFO][http ] [Ahura] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_

address {inet[/192.168.0.40:9200]}

[21:20:48,504][INFO][gateway ] [Ahura] recovered [0] indices into cluster_state

[21:20:48,504][INFO][node ] [Ahura] started

예제 2.1 bin/elasticsearch 실행

엘라스틱서치의 설치가 끝났다(정말이다). 예제 2.1에서는 [Ahura]라는 노드명으로 엘라스틱서치가

실행됐다. 노드의 이름은 별도로 설정하지 않으면 엘라스틱서치를 실행할 때마다 임의로 생성된다.

아마도 여러분이 실행한 화면은 [Ahura]가 아닌 다른 이름으로 생성됐을 수도 있다. 노드에 대해서

는 4장에서 다시 자세히 설명하겠다.

엘라스틱서치를 실행할 때 bin/elasticsearch 뒤에 추가로 -d, -p 옵션을 사용할 수 있다.

.≆ -d.:.엘라스틱서치를.백그라운드로.실행

.≆ -p.<파일명>.:.엘라스틱서치의.프로세스.id를.<파일명>으로.지정된.파일에.저장

0.90.* 이전 버전에서는 bin/elasticsearch 명령이 기본적으로 백그라운드로 실행되며, -f 옵션을 사용해야 포그라운드로 실

행할 수 있다.

-d 옵션을 추가해서 엘라스틱서치를 백그라운드로 실행해보자. 백그라운드로 실행하면 화면에 아

무런 반응 없이 명령 수행이 끝난다. 실행 중인 엘라스틱서치의 로그는 logs/elasticsearch.log

파일에 기록된다. 엘라스틱서치를 백그라운드로 실행한 뒤 cat logs/elasticsearch.log 명령으

로 실행 로그를 확인해보자.

$ bin/elasticsearch -d

$ cat logs/elasticsearch.log

[21:22:53,803][INFO][node ] [Wildpride] version[1.1.1], pid[23866], build[f1585f0/2014-

04-16T14:27:12Z]

[21:22:53,804][INFO][node ] [Wildpride] initializing ...

[21:22:53,818][INFO][plugins ] [Wildpride] loaded [], sites []

[21:22:55,780][INFO][node ] [Wildpride] initialized

[21:22:55,781][INFO][node ] [Wildpride] starting ...

[21:22:55,861][INFO][transport ] [Wildpride] bound_address {inet[/0:0:0:0:0:0:0:0:9300]},

Page 35: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진34

publish_address {inet[/192.168.0.40:9300]}

[21:22:58,887][INFO][cluster.service ] [Wildpride] new_master [Wildpride]

[hNLWvcsWT0mm1ws1G1NKlA][.local][inet[/192.168.0.40:9300]], reason: zen-disco-join (elected_as_

master)

[21:22:58,906][INFO][discovery ] [Wildpride] elasticsearch/hNLWvcsWT0mm1ws1G1NKlA

[21:22:58,919][INFO][http ] [Wildpride] bound_address {inet[/0:0:0:0:0:0:0:0:9200]},

publish_address {inet[/192.168.0.40:9200]}

[21:22:58,929][INFO][gateway ] [Wildpride] recovered [0] indices into cluster_state

[21:22:58,930][INFO][node ] [Wildpride] started$

예제 2.2 백그라운드로 실행 중인 엘라스틱서치의 로그 파일 내용

예제 2.2의 로그 파일에서 [Wildpride]라는 이름의 노드로 엘라스틱서치가 실행이 된 것을 확인

할 수 있다. 별도로 설정하지 않으면 처음 실행한 엘라스틱서치 프로세스는 9200번의 포트를 사용

한다. 엘라스틱서치는 유닉스의 curl 명령어를 사용해 REST API를 사용할 수 있다. curl -XGET

http://localhost:9200 명령으로 실행 중인 엘라스틱서치 프로세스의 정보를 가져와보자.

$ curl -XGET http://localhost:9200

{

"status" : 200,

"name" : "Wildpride",

"version" : {

"number" : "1.1.1",

"build_hash" : "f1585f096d3f3985e73456debdc1a0745f512bbc",

"build_timestamp" : "2014-04-16T14:27:12Z",

"build_snapshot" : false,

"lucene_version" : "4.7"

},

"tagline" : "You Know, for Search"

}

예제 2.3 curl -XGET http://localhost:9200 명령으로 엘라스틱서치 정보 확인

예제 2.3과 같이 JSON 형식의 결과가 보이면 정상적으로 프로세스가 실행되고 있는 것이다.

“status” : 200은 REST API의 요청이 정상적으로 수행됐음을 나타내는 결과값이고 “name” :

“Wildpride”에서 이 엘라스틱서치 프로세스의 노드 이름이 “Wildpride”임을 다시 한 번 확인할 수

있다. 이 결과는 웹 브라우저에서도 http://localhost:9200으로 이동해 확인할 수 있다.

Page 36: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 35

그림 2.4 웹 브라우저에서 엘라스틱서치 프로세스 정보 확인

백그라운드로 실행한 후 ps -ef | grep elasticsearch 명령으로 실행 중인 프로세스를 검색하면 엘

라스틱서치가 실행되고 있음을 확인할 수 있다.

$ ps -ef | grep elasticsearch

501 30985 1 0 11:14PM ttys000 0:03.20 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.

awt.headless=true -XX:+UseParNewGC

… 중략 …

org.elasticsearch.bootstrap.Elasticsearch

$

예제 2.4 ps 명령으로 백그라운드로 실행중인 엘라스틱서치 프로세스 검색

백그라운드로 실행 중인 엘라스틱서치 프로세스를 종료하려면 kill 명령을 사용한다. 예제 2.4에서

현재 실행되고 있는 엘라스틱서치의 프로세스 ID는 30985다. kill 30985 명령으로 엘라스틱서치를

종료하고 다시 프로세스를 확인하면 프로세스가 종료됐음을 확인할 수 있다.

$ kill 30985

$ ps -ef | grep elasticsearch

예제 2.5 kill 명령으로 엘라스틱서치 프로세스 종료

Page 37: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진36

-p <파일명> 옵션을 추가해 실행된 엘라스틱서치의 프로세스 ID를 파일에 저장할 수 있다. es.pid

라는 파일에 실행된 엘라스틱서치의 프로세스 ID를 저장해보자. 명령을 실행한 뒤 es.pid 파일의

내용을 확인하고 실행 중인 프로세스와 비교해보자.

$ bin/elasticsearch -d -p es.pid

$ ls

LICENSE.txt README.textile config es.pid logs

NOTICE.txt bin data lib

$ cat es.pid

31070

$ ps -ef | grep elasticsearch

501 31070 1 0 11:23PM ttys000 0:03.56 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.

awt.headless=true -XX:+UseParNewGC

… 중략 …

예제 2.6 -p 옵션으로 es.pid 파일에 프로세스 ID 저장

예제 2.6에서 es.pid 에 저장된 내용과 실행중인 프로세스 ID 모두 31070인 것을 확인할 수 있다.

이제 다시 kill 명령으로 실행 중인 엘라스틱서치 프로세스를 종료하고 ls 명령으로 디렉터리 내용을

확인한다.

$ kill 31070

$ ls

LICENSE.txt NOTICE.txt README.textile bin

config data lib logs

예제 2.7 kill 명령으로 엘라스틱서치 프로세스 종료

엘라스틱서치 실행 시 -p 명령으로 저장했던 es.pid 파일이 사라졌다. 프로세스 ID가 저장된 파일

은 실행 중인 엘라스틱서치를 종료하면 자동으로 삭제된다. 이제 이 옵션을 활용해서 엘라스틱서치

를 백그라운드로 실행하는 start.sh 파일과 stop.sh 파일을 만들어 보자.

<start.sh> 파일의 내용

bin/elasticsearch -d -p es.pid

Page 38: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 37

<stop.sh> 파일의 내용

kill 'cat es.pid'

위 파일들을 엘라스틱서치 실행 경로에 저장하고 실행할 수 있도록 권한을 755로 변경한다.

$ echo 'bin/elasticsearch -d -p es.pid' > start.sh

$ echo 'kill `cat es.pid`' > stop.sh

$ chmod 755 start.sh stop.sh

$ ls

LICENSE.txt README.textile config lib start.sh

NOTICE.txt bin data logs stop.sh

예제 2.8 start.sh, stop.sh 파일 생성 및 실행 권한 부여

이제 start.sh를 실행해 엘라스틱서치가 실행된 것을 확인하고, 다시 stop.sh을 실행해 엘라스틱서

치를 종료해보자.

$ ./start.sh

$ ls

LICENSE.txt README.textile config es.pid logs stop.sh

NOTICE.txt bin data lib start.sh

$ ps -ef | grep elasticsearch

501 31239 1 0 11:41PM ttys000 0:03.17 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.

awt.headless=true -XX:+UseParNewGC

… 중략 …

$ ./stop.sh

$ ls

LICENSE.txt README.textile config lib start.sh

NOTICE.txt bin data logs stop.sh

$ ps -ef | grep elasticsearc

예제 2.9 start.sh, stop.sh로 엘라스틱서치 실행 및 종료

Page 39: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진38

2.1.3 유닉스 서비스로 설치 및 실행

엘라스틱서치를 유닉스 운영체제의 서비스로 등록하고 실행하려면 RPM 설치를 진행한다. 다음과

같이 RPM 파일을 내려받고 rpm -ivh 명령으로 엘라스틱서치를 설치한다. root 계정이 아니라면

sudo 명령으로 설치해야 한다.

$ sudo rpm -ivh elasticsearch-1.1.1.rpm

준비 중... ################################# [100%]

Updating / installing...

1:elasticsearch-1.1.1-1 ################################# [100%]

### NOT starting on installation, please execute the following statements to configure

elasticsearch to start automatically using chkconfig

sudo /sbin/chkconfig --add elasticsearch

### You can start elasticsearch by executing

sudo service elasticsearch start

$

예제 2.10 엘라스틱서치 rpm 설치

rpm 설치를 끝내고 나면 루트 경로의 /etc 디렉터리에 elasticsearch 디렉터리가 생성되고,

elasticsearch 디렉터리에 설정 파일인 elasticsearch.yml, logging.yml 파일이 생성된다. 또한,

/etc/init.d/ 디렉터리에는 실행 파일인 elasticsearch 파일이 생성된다.

$ ls /etc/init.d/elasticsearch

/etc/init.d/elasticsearch

$ ls /etc/elasticsearch/

elasticsearch.yml logging.yml

예제 2.11 엘라스틱서치 실행 파일과 설정 파일

서비스로 설치된 엘라스틱서치의 환경 설정을 하려면 /etc/elasticsearch 경로에 있는

elasticsearch.yml 파일을 수정한다. 이제 service elasticsearch start 명령으로 엘라스틱서치 서

비스를 실행하고 프로세스를 확인한다. root 권한이 필요하므로 sudo 명령으로 실행해야 한다.

Page 40: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 39

$ sudo service elasticsearch start

Starting elasticsearch: [ OK ]

$ ps -ef | grep elasticsearch

498 1727 1 78 14:56 ? 00:00:05 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.

awt.headless=true -XX:+UseParNewGC

… 중략 …

org.elasticsearch.bootstrap.Elasticsearch

예제 2.12 엘라스틱서치 서비스 시작

서비스를 종료하려면 service elasticsearch stop 명령을 사용한다.

$ sudo service elasticsearch stop

Stopping elasticsearch: [ OK ]

$ ps -ef | grep elasticsearch

ec2-user 1791 1323 0 14:59 pts/0 00:00:00 grep java

예제 2.13 엘라스틱서치 서비스 종료

유닉스 서버가 부팅될 때 자동으로 엘라스틱서치가 실행되게 하려면 chkconfig 명령을 사용한다.

chkconfig --add elasticsearch 명령으로 서비스를 등록하면 서버가 시작될 때 자동으로 엘라스

틱서치 서비스가 실행된다.

$ sudo /sbin/chkconfig --add elasticsearch

예제 2.14 서버 시작 시 엘라스틱서치 서비스가 자동으로 시작되게 설정

2.1.4 윈도 운영체제에서 설치 및 실행

윈도 환경에서는 elasticsearch-*.zip 파일을 내려받아 압축을 풀고 bin 폴더의 elasticsearch.bat

파일을 실행하는 것으로 간단하게 실행할 수 있다. 유닉스 운영체제와 마찬가지로 윈도 운영체제에

서도 자바 6 이상의 버전이 설치돼 있어야 한다.

추가로 윈도에서 실행하려면 자바가 설치된 경로가 JAVA_HOME 환경변수로 등록돼 있어야 한다.

JAVA_HOME 환경변수가 등록돼있지 않다면 다음과 같은 오류 메시지를 보게 될 것이다.

Page 41: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

그림 2.5 JAVA_HOME 환경변수 오류

윈도 8 운영체제를 기준으로 제어판 → 시스템 및 보안 → 시스템의 [고급 시스템 설정]에서 [환경변

수] 버튼을 클릭하면 환경변수 설정 창이 나타난다. 시스템 변수 그룹의 [새로 만들기] 버튼을 클릭

하고 다음과 같이 JAVA_HOME 환경변수를 등록한다. 이때 변수 값은 자바가 설치되어 있는 경로

를 지정한다.

그림 2.6 JAVA_HOME 환경변수 등록

Page 42: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 41

다시 elasticsearch.bat 파일을 더블 클릭해보면 엘라스틱서치가 정상적으로 실행되는 모습을 확인

할 수 있다.

그림 2.7 윈도 운영체제에서 엘라스틱서치 실행

웹 브라우저에서 localhost:9200에 접속하면 엘라스틱서치 프로세스 정보를 확인할 수 있다. JSON

문서 형식의 뷰를 지원하지 않는 웹 브라우저라면 화면이 열리는 대신 JSON 문서를 내려받는 팝업

이 나타날 수도 있다.

그림 2.8 윈도 운영체제의 웹 브라우저에서 프로세스 정보 확인

Page 43: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진42

2.1.5 윈도 서비스로 설치 및 실행

엘라스틱서치를 윈도 운영체제에서 서비스로 등록하고 실행하려면 먼저 엘라스틱서치 서비스를 설

치해야 한다. 명령 프롬프트에서 bin/ 디렉터리의 service.bat 프로그램을 실행하면 다음과 같은

옵션을 볼 수 있다. 윈도 운영체제에서 명령 프롬프트는 시작 메뉴의 [실행] 또는 [찾기]에서 cmd를

입력하면 실행할 수 있다.

c:\elasticsearch-1.1.0\bin>service.bat

Usage: service.bat install|remove|start|stop|manager [SERVICE_ID]

예제 2.15 윈도 명령 프롬프트에서 service.bat 실행

서비스를 설치하기 위해 service.bat의 매개변수로 install 옵션을 준다.

c:\elasticsearch-1.1.0\bin>service.bat install

Installing service : "elasticsearch-service-x86"

Using JAVA_HOME (32-bit): "C:\Program Files\Java\jdk1.7.0_45"

The service 'elasticsearch-service-x86' has been installed.

c:\elasticsearch-1.1.0\bin>

예제 2.16 윈도 운영체제에 엘라스틱서치 서비스 설치

설치가 끝나고 service.bat를 매개변수 manager로 실행하면 윈도용 엘라스틱서치 서비스 매니

저가 실행된다. 참고로 탐색기에서 elasticsearch-service-mgr.exe 파일을 더블 클릭해서 매니저

를 실행하려고 하면 정상적으로 실행되지 않는다. 반드시 명령 프롬프트에서 엘라스틱서치의 bin/

디렉터리로 이동한 후 service.bat manager 명령으로 실행해야 정상적으로 엘라스틱서치 서비

스 매니저를 실행할 수 있다.

Page 44: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 43

그림 2.9 엘라스틱서치 서비스 매니저 실행

엘라스틱서치 서비스 매니저의 General 탭에 있는 Start 버튼을 누르면 엘라스틱서치가 실행된다.

Start 버튼을 누르고 웹 브라우저에서 localhost:9200으로 접속하면 그림 2.8과 동일하게 엘라스틱

서치가 실행되고 있음을 확인할 수 있다.

Start 버튼을 눌러 엘라스틱서치를 실행하면 서비스 매니저 창을 닫아도 엘라스틱서치는 계속 실행

중인 상태로 남는다. 엘라스틱서치를 종료하려면 다시 서비스 매니저 창을 열고 Stop 버튼을 눌러

야 한다.

2.2 엘라스틱서치 프로그램 구조

이번 절부터는 다시 유닉스 환경을 기준으로 설명하겠다.

최초로 엘라스틱서치 설치 파일의 압축을 풀면 엘라스틱서치 실행 경로에서 다음과 같은 파일과 디

렉터리를 볼 수 있다. 설명이 있는 텍스트(.txt) 파일을 제외하면 bin/, config/, lib/ 3개의 디렉터

리가 존재한다.

Page 45: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진44

$ ls

LICENSE.txt NOTICE.txt README.textile bin config lib

예제 2.17 엘라스틱서치 실행 디렉터리 – 엘라스틱서치 실행 전

먼저 bin/ 디렉터리를 살펴보면 엘라스틱서치의 실행 파일인 elasticsearch 파일과 elasticsearch.

in.sh 파일 그리고 플러그인 설치를 위한 plugin 파일이 있다.

$ ls bin/

elasticsearch elasticsearch.in.sh plugin

예제 2.18 엘라스틱서치 bin/ 디렉터리 조회

elasticsearch.in.sh 파일은 엘라스틱서치를 실행하기 위한 자바의 실행 변수에 대한 내용이 있

는 설정 파일이다. bin/elasticsearch 명령으로 엘라스틱서치를 실행할 때 elasticsearch 파일은

elasticsearch.in.sh 파일의 내용을 불러와서 여기에 설정된 환경으로 실행된다. elasticsearch.

in.sh 파일의 환경 설정에 관해서는 2.3절 환경 설정에서 설명하겠다.

plugin 파일은 플러그인을 설치하기 위한 실행 파일이다. 플러그인 설치에 관해서는 2.4절 플러그

인 설치에서 설명하겠다.

다음으로 config/ 디렉터리를 살펴보면 환경 설정 파일인 elasticsearch.yml, logging.yml 파일이

있다. 이 두 파일에 관한 내용도 2.3절 환경 설정에서 설명하겠다.

$ ls config/

elasticsearch.yml logging.yml

예제 2.19 엘라스틱서치 config/ 디렉터리 조회

이번에는 lib/ 디렉터리를 살펴보면 자바 라이브러리 파일인 .jar 파일들이 있음을 확인할 수 있다.

Page 46: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 45

$ ls lib/

elasticsearch-1.1.1.jar lucene-codecs-4.6.1.jar

lucene-memory-4.6.1.jar lucene-spatial-4.6.1.jar

jna-3.3.0.jar lucene-core-4.6.1.jarlucene-misc-4.6.1.jar lucene-suggest-4.6.1.jar

jts-1.12.jar

lucene-grouping-4.6.1.jar lucene-queries-4.6.1.jar

sigar log4j-1.2.17.jar

lucene-highlighter-4.6.1.jar lucene-queryparser-4.6.1.jar

spatial4j-0.3.jar lucene-analyzers-common-4.6.1.jar

lucene-join-4.6.1.jar lucene-sandbox-4.6.1.jar

예제 2.20 엘라스틱서치 lib/ 디렉터리 조회

파일명에서 짐작할 수 있듯이 루씬 라이브러리인 lucene-*.jar 파일들과 함께 elasticsearch-*.jar

파일을 확인할 수 있다. 실제로 엘라스틱서치의 프로그램들은 elasticsearch-*.jar 파일에 묶여 있

으며 bin/elasticsearch 명령으로 엘라스틱서치를 실행하면 lib/ 디렉터리의 jar 파일들을 불러와서

라이브러리로 실행한다.

이번에는 bin/elasticsearch -d 명령으로 엘라스틱서치를 백그라운드로 실행한 뒤 다시 ps -ef |

grep elasticsearch 명령으로 실행 중인 프로세스를 살펴보자. 참고로 필자의 엘라스틱서치가 설치

된 경로는 루트 디렉터리 바로 아래의 /elasticsearch-1.1.1이다.

$ bin/elasticsearch -d

$ ps -ef | grep elasticsearch

501 65072 1 0 2:30PM ttys000 0:03.21 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.

awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFract

ion=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -Delasticsearch

-Des.path.home=/elasticsearch-1.1.1 -cp :/elasticsearch-1.1.1/lib/elasticsearch-1.1.1.jar:/

elasticsearch-1.1.1/lib/*:/elasticsearch-1.1.1/lib/sigar/* org.elasticsearch.bootstrap.

Elasticsearch

예제 2.21 엘라스틱서치 실행 프로세스 조회

예제 2.21에서 엘라스틱서치의 실행 명령을 하나씩 살펴보면 먼저 /usr/bin/java 명령으로 자

바 프로그램을 실행하고 있음을 알 수 있다. -X* 매개변수는 자바가 실행되는 메모리를 설정

하는 옵션으로 -Xms256m은 최소 메모리가 256MB, -Xmx1g은 최대 메모리가 1GB로 실행

Page 47: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진46

되게 설정했음을 의미한다. -Des.path.home=/elasticsearch-1.1.1 매개변수는 엘라스틱

서치가 설치된 경로가 /elasticsearch-1.1.1임을 명시하고 있다. -cp 매개변수는 클래스패스,

즉 함께 실행할 자바 프로그램의 위치를 설정하는 옵션이다. -cp :/elasticsearch-1.1.1/lib/

elasticsearch-1.1.1.jar:/elasticsearch-1.1.1/lib/* …후략… 으로 jar 라이브러리 파일들이

있는 /elasticsearch-1.1.1/lib 이하의 *.jar 파일들의 위치를 지정하고 있다. 마지막에 있는 org.

elasticsearch.bootstrap.Elasticsearch가 실제로 실행되는 자바 클래스 프로그램이다.

엘라스틱서치는 오픈소스 프로젝트로 소스 코드는 깃허브(Github)에서 찾을 수 있다. 실제로 깃허

브에 있는 엘라스틱서치의 소스를 찾아 org.elasticsearch.bootstrap 패키지의 Elasticsearch 파일

을 확인해보자.

엘라스틱서치의 깃허브 주소는 https://github.com/elasticsearch/elasticsearch다. 여기에서

src/main/java/org/elasticsearch/bootstrap 경로를 찾아 들어가면 Elasticsearch.java 실행 파일

소스를 확인할 수 있다.

그림 2.10 깃허브에 있는 Elasticsearch.java 엘라스틱서치 프로그램 소스

이제 엘라스틱서치를 실행한 뒤 다시 한 번 엘라스틱서치 설치 경로에서 파일을 조회해보자.

Page 48: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 47

$ ls

LICENSE.txt NOTICE.txt README.textile bin config data

Lib logs

예제 2.22 엘라스틱서치 실행 디렉터리 – 엘라스틱서치 실행 후

엘라스틱서치를 실행하기 전에는 없던 data와 logs 디렉터리가 생성된 모습을 확인할 수 있다. 먼

저 logs 디렉터리를 확인해보자.

$ ls logs/

elasticsearch.log elasticsearch_index_search_slowlog.log

elasticsearch_index_indexing_slowlog.log

예제 2.23 엘라스틱서치 logs/ 디렉터리 조회

엘라스틱서치의 실행 로그가 logs/ 경로의 파일에 저장된다. 앞에서도 설명했듯이 엘라스틱서치를

실행할 때 bin/elasticsearch -d 옵션으로 백그라운드로 실행한 후 logs/elasticsearch.log 파일

을 확인하면 엘라스틱서치의 실행 로그를 확인할 수 있다.

elasticsearch_index_search_slowlog.log, elasticsearch_index_indexing_slowlog.log 파

일은 각 검색과 색인이 일정 시간 이상 소요됐을 때 느린 속도로 실행된 내용을 기록하는 슬로우

(slow) 로그 파일이다. 슬로우 로그 파일의 설정에 관해서는 2.3절 환경 설정에서 다시 설명하겠다.

마지막으로 data/ 디렉터리의 내용을 조회해보자. data/ 디렉터리에는 elasticsearch라는 이름의

디렉터리 하나가 존재하고, 유닉스의 tree 명령을 사용해서 data/ 디렉터리 이하의 모든 파일을 조

회해보면 꽤 많은 레벨의 디렉터리가 있는 것을 확인할 수 있다. 참고로 tree 명령은 일반적으로 유

닉스에 기본으로 포함돼 있지 않으므로 별도로 설치해야 한다.

$ ls data/

elasticsearch

$ tree data/

data/

└── elasticsearch

Page 49: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진48

└── nodes

└── 0

├── _state

│ └── global-1

└── node.lock

4 directories, 2 files

예제 2.24 엘라스틱서치 data/ 디렉터리 조회

data/ 디렉터리는 실제로 색인된 문서의 검색 데이터가 저장되는 공간이다. 별도로 설정하지 않으

면 이처럼 엘라스틱서치가 설치된 경로의 data/ 디렉터리에 색인된 내용이 저장된다. 만약 1GB 가

량의 문서를 엘라스틱서치에 입력하면 data/ 디렉터리 이하의 파일 용량이 1GB 이상으로 늘어날

것이다. 따라서 실제로 엘라스틱서치로 검색 시스템을 구축할 때는 엘라스틱서치가 실행되는 설치

경로와 데이터가 저장되는 저장소를 분리하는 것이 바람직하다.

data/ 경로 아래에 있는 elasticsearch 디렉터리는 실행된 엘라스틱서치의 클러스터명이다. 만일

클러스터명를 es_test로 변경하고 엘라스틱서치를 실행하면 data/경로 아래에 es_test 디렉토리가

추가로 생성된다. 하나의 서버에서 여러 개의 엘라스틱서치 클러스터를 실행하는 경우에도 이와 같

이 클러스터명으로 분리되어 저장되기 때문에 데이터가 덮어 씌워지거나 서로 간섭이 일어나지 않

는다. 클러스터에 대한 내용은 4장 시스템 구조에서 설명한다.

2.3 환경 설정

엘라스틱서치의 환경 설정을 하는 방법은 크게 3가지가 있다.

1.. elasticsearch.in.sh,.elasticsearch.yml.파일.내용을.변경

2..엘라스틱서치.실행.시.-D*.또는.--*.옵션을.이용

3..엘라스틱서치.실행.후.REST.API를.이용

두 번째, 세 번째 방법은 이후 엘라스틱서치의 요소를 설명하면서 중간에 해당 요소를 설정하는 방

법으로 설명을 추가하겠다. 이번 장에서는 첫 번째 방법인 elasticsearch.in.sh, elasticsearch.yml

파일의 내용을 변경해 환경 설정하는 방법을 알아보자.

Page 50: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 49

2.3.1 bin/elasticsearch.in.sh

엘라스틱서치는 자바 가상 머신 위에서 실행되는 프로그램이다. 엘라스틱서치를 실행할 때 필요한

자바 메모리와 관련된 라이브러리 등의 설정들을 불러오기 위한 옵션이 함께 수행된다. 엘라스틱서

치의 실행 프로세스 조회 내용을 한 번 더 살펴보자.

$ bin/elasticsearch -d

$ ps -ef | grep elasticsearch

501 65072 1 0 2:30PM ttys000 0:03.21 /usr/bin/java -Xms256m -Xmx1g -Xss256k -Djava.

awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFract

ion=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -Delasticsearch

-Des.path.home=/elasticsearch-1.1.1 -cp :/elasticsearch-1.1.1/lib/elasticsearch-1.1.1.jar:/

elasticsearch-1.1.1/lib/*:/elasticsearch-1.1.1/lib/sigar/* org.elasticsearch.bootstrap.

Elasticsearch

예제 2.25 엘라스틱서치 실행 프로세스 조회

예제 2.25에서 엘라스틱서치가 실행되는 옵션 중 -Xms256m -Xmx1g 옵션은 엘라스틱서치가 실

행될 때 사용하는 자바 메모리를 최소 256MB, 최대 1GB까지 사용할 수 있게 설정하는 옵션이다.

자바 실행 환경 설정과 관련된 실행 옵션은 bin/ 디렉터리 아래의 elasticsearch.in.sh 파일에서 변

경할 수 있다. 에디터 프로그램을 사용해서 elasticsearch.in.sh 파일을 열어보면 상단에서 다음과

같은 내용을 확인할 수 있다.

<elasticsearch.in.sh> 파일

if [ "x$ES_MIN_MEM" = "x" ]; then

ES_MIN_MEM=256m

fi

if [ "x$ES_MAX_MEM" = "x" ]; then

ES_MAX_MEM=1g

fi

if [ "x$ES_HEAP_SIZE" != "x" ]; then

ES_MIN_MEM=$ES_HEAP_SIZE

ES_MAX_MEM=$ES_HEAP_SIZE

Fi

Page 51: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진50

ES_MIN_MEM=256m, ES_MAX_MEM=1g 이 두 옵션이 가리키는 값을 변경하면 엘라스틱서치에

서 사용되는 자바의 메모리 설정인 -Xms256m -Xmx1g 옵션값이 변경된다. 파일 내용의 값을 각

각 ES_MIN_MEM=512m, ES_MAX_MEM=2g로 변경한 뒤 엘라스틱서치를 다시 실행해보자.

<elasticsearch.in.sh> ES_MIN_MEM=512m, ES_MAX_MEM=2g로 변경

if [ "x$ES_MIN_MEM" = "x" ]; then

ES_MIN_MEM=512m

fi

if [ "x$ES_MAX_MEM" = "x" ]; then

ES_MAX_MEM=2g

fi

if [ "x$ES_HEAP_SIZE" != "x" ]; then

ES_MIN_MEM=$ES_HEAP_SIZE

ES_MAX_MEM=$ES_HEAP_SIZE

Fi

$ ps -ef | grep elasticsearch

501 79114 78269 0 12:08PM ttys000 0:04.80 /usr/bin/java -Xms512m -Xmx2g -Xss256k -Djava.

awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFracti

on=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -Delasticsearch -Des.

foreground=yes -Des.path.home=/elasticsearch-1.1.1 -cp :/elasticsearch-1.1.1/lib/elasticsearch-

1.1.1.jar:/elasticsearch-1.1.1/lib/*:/elasticsearch-1.1.1/lib/sigar/* org.elasticsearch.

bootstrap.Elasticsearch

예제 2.26 elasticsearch.in.sh 설정 변경 후 실행 프로세스 조회

최소 메모리, 최대 메모리 사용이 각 -Xms512m -Xmx2g로 변경돼 실행됐음을 확인할 수 있

다. ES_MIN_MEM, ES_MAX_MEM 설정 외에 ES_HEAP_SIZE 옵션으로 두 메모리를 한꺼번

에 지정할 수도 있다. 실제로 자바 메모리 옵션은 메모리 용량이 변경되는 불필요한 오버헤드를

방지하기 위해 최소 메모리와 최대 메모리를 동일하게 지정해서 사용하는 것을 권장하고 있다.

elasticsearch.in.sh 파일 상단에 ES_HEAP_SIZE=1g를 입력하고 나서 엘라스틱서치를 다시 시작

하면 최대 메모리 옵션과 최소 메모리 옵션 모두 1GB로 설정되는 것을 확인할 수 있다.

Page 52: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 51

<elasticsearch.in.sh> ES_HEAP_SIZE=1g 설정 추가

ES_HEAP_SIZE=1g

if [ "x$ES_MIN_MEM" = "x" ]; then

ES_MIN_MEM=512m

fi

if [ "x$ES_MAX_MEM" = "x" ]; then

ES_MAX_MEM=2g

fi

if [ "x$ES_HEAP_SIZE" != "x" ]; then

ES_MIN_MEM=$ES_HEAP_SIZE

ES_MAX_MEM=$ES_HEAP_SIZE

Fi

$ ps -ef | grep elasticsearch

501 79213 78269 0 12:17PM ttys000 0:03.78 /usr/bin/java -Xms1g -Xmx1g -Xss256k -Djava.awt.

headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75

-XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -Delasticsearch -Des.

foreground=yes -Des.path.home=/elasticsearch-1.1.1 -cp :/elasticsearch-1.1.1/lib/elasticsearch-

1.1.1.jar:/elasticsearch-1.1.1/lib/*:/elasticsearch-1.1.1/lib/sigar/* org.elasticsearch.

bootstrap.Elasticsearch

예제 2.27 elasticsearch.in.sh 설정 변경 후 실행 프로세스 조회

elasticsearch.in.sh 파일에서 설정할 수 있는 또 다른 옵션으로 자바 힙 덤프 파일의 저장 경로

를 지정할 수 있다. 자바 프로그램을 사용하는 중에 자바 힙 메모리 오류가 발생하면 오류 내용이

heapdump.hprof와 같은 파일에 저장되고 분석 툴을 이용해 오류가 나는 프로그램을 확인할 수

있다. 엘라스틱서치에서 별도로 설정하지 않으면 heapdump.hprof 파일은 엘라스틱서치가 설치

된 홈 디렉터리에 생성된다. heapdump.hprof 파일은 수백MB에서 수GB 정도로 용량이 매우 크

므로 넉넉한 용량을 가진 별도의 경로에 저장하는 것이 바람직하다. 다음과 같이 elasticsearch.

in.sh 파일의 맨 하단에 있는 옵션을 변경해서 자바 힙 덤프 파일을 저장할 경로를 지정할 수 있다.

JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=$ES_HOME/logs/heapdump.hprof"

처음에는 #으로 주석 처리가 돼 있다. 위 옵션은 엘라스틱서치 홈 디렉터리의 /logs/ 디렉터리에 저장

하도록 설정한 옵션이며, 원하는 경로로 $ES_HOME/logs/heapdump.hprof를 설정하면 된다.

Page 53: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진52

2.3.2 config/elasticsearch.yml

엘라스틱서치의 주요 환경 설정은 대부분 config 디렉터리에 있는 elasticsearch.yml 파일에서 설

정한다. 에디터 프로그램으로 elasticsearch.yml 파일을 열고 내용을 확인해보자. 엘라스틱서치를

처음 설치한 상태라면 모든 옵션의 맨 앞에 # 문자로 주석 처리가 돼 있을 것이다. 클러스터와 노드,

샤드, 디스커버리 등의 설정은 해당 모듈에 대한 이해가 필요하므로 뒤에서 해당 모듈을 설명하면서

설정 방법을 다시 설명하겠다. 이번 장에서는 elasticsearch.yml 파일을 수정하면 어떤 식으로 엘

라스틱서치의 환경이 변경되는지 확인하는 정도로 이해하고 넘어가기 바란다.

elasticsearch.yml 파일 설정에는 YAML 문법을 사용할 수 있다. YAML 문법은 사람이 쉽게 읽을

수 있게 고안된 데이터 직렬화 양식이다. YAML은 공백 문자를 이용한 들여쓰기로 구조체를 구분하

는 특징이 있다.

클러스터

elasticsearch.yml 파일에서 맨 처음 나오는 내용은 클러스터명의 설정이다.

# cluster.name: elasticsearch

별도로 설정하지 않으면 클러스터명은 “elasticsearch”로 설정된다. 클러스터명은 엘라스틱서치 시

스템 전체를 구분 짓는 이름이므로 처음 엘라스틱서치를 설치했을 때 반드시 바꿔주는 것이 좋다.

예를 들어 클러스터명을 es_test로 하려면 주석을 제거하고 다음과 같이 클러스터명을 입력한다.

cluster.name: es_test

주의할 점은 cluster.name: 의 콜론(:) 뒤에 반드시 공백이 있어야 한다. 다음과 같이 공백 없이 입

력하면 엘라스틱서치를 실행했을 때 오류가 발생한다.

cluster.name:es_test ←.오류 발생!!

또한, YAML 문법을 사용해서 다음과 같이 설정할 수도 있다. cluster: 이후 줄 바꿈을 한 후에 공백

을 두고 name: 을 설정한다.

cluster:

name: es_test

Page 54: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 53

이제 클러스터명을 es_test로 변경하고 다시 엘라스틱서치를 실행한다. 엘라스틱서치 실행 후 curl

-XGET localhost:9200/_cluster/stats?pretty=true 명령으로 클러스터의 상태를 확인할 수 있다.

$ curl -XGET localhost:9200/_cluster/stats?pretty=true

{

"timestamp" : 1400221341618,

"cluster_name" : "es_test",

"status" : "green",

"indices" : {

"count" : 0,

"shards" : { },

"docs" : {

"count" : 0,

"deleted" : 0

},

…중략…

예제 2.28 클러스터 설정 확인

“cluster_name” : “es_test”에서 클러스터명이 es_test로 실행된 모습을 확인할 수 있다. 참고로

_cluster는 클러스터와 관련된 작업을 수행하는 API고 ?pretty=true 매개변수는 결과를 보기 좋게

줄 바꿈 해주는 옵션이다.

노드

클러스터 다음에 있는 설정은 노드에 대한 설정이다.

# node.name: "Franz Kafka"

엘라스틱서치는 하나 이상의 노드로 구성된다. 실행된 하나의 엘라스틱서치 프로세스를 한 노드라

고 하고 각 노드가 연결된 전체 시스템을 엘라스틱서치 클러스터라고 한다. 클러스터와 노드에 관해

서는 4장에서 좀 더 자세히 다룰 예정이니 이번 장에서 나오는 노드는 실행 중인 하나의 엘라스틱서

치 프로세스라고 우선 이해하고 넘어가자. 노드는 엘라스틱서치를 실행할 때마다 임의의 이름이 부

여되는데, 설정 파일에서 노드명을 지정할 수 있다. # 주석을 제거하고 노드명을 “Node1”로 변경한

뒤 다시 엘라스틱서치를 실행해보자. 클러스터명과 달리 노드명은 반드시 따옴표(")로 묶어야 한다.

node.name: "Node1"

Page 55: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진54

$ bin/elasticsearch

[2014-05-16 15:40:07,597][INFO ][node ] [Node1] version[1.1.1], pid[88169],

build[f1585f0/2014-04-16T14:27:12Z]

[2014-05-16 15:40:07,597][INFO ][node ] [Node1] initializing ...

[2014-05-16 15:40:07,612][INFO ][plugins ] [Node1] loaded [], sites []

[2014-05-16 15:40:09,629][INFO ][node ] [Node1] initialized

[2014-05-16 15:40:09,629][INFO ][node ] [Node1] starting ...

…중략…

예제 2.29 노드명 변경 후 엘라스틱서치 실행

예제 2.29의 엘라스틱서치 실행 콘솔을 보면 노드명이 Node1로 실행된 모습을 볼 수 있다. 이후에

있는 node.master, node.data 등의 설정은 4장에서 클러스터와 노드를 설명하면서 다시 다루겠다.

인덱스

그다음에 나오는 내용은 인덱스를 구성하는 샤드(Shard) 와 복사본(Replica)에 대한 설정이다. 기

본적으로 엘라스틱서치에 색인되는 데이터들은 5개의 샤드와 1개의 복사본으로 구성돼 저장된다.

다음 내용을 변경하면 기본으로 구성되는 샤드와 복제본의 개수를 변경할 수 있다. 샤드와 복사본에

대해서는 4장에서 다시 다루겠다.

# index.number_of_shards: 5 ← 샤드 개수

# index.number_of_replicas: 1 ← 복사본 개수

경로

앞의 2.2절 엘라스틱서치 프로그램 구조에서 살펴봤듯이 엘라스틱서치가 설치된 경로에는 config/,

data/, logs/ 등의 디렉터리가 있으며, 각 필요한 파일이 있다. 다음 설정으로 이 디렉터리들의 경로

를 변경할 수 있다.

# path.conf: /path/to/conf ← config/ 설정 파일 경로

# path.data: /path/to/data ← data/ 데이터 파일 경로

# path.work: /path/to/work ← 임시 작업 파일 경로

# path.logs: /path/to/logs ← logs/ 로그 파일 경로

# path.plugins: /path/to/plugins ← 플러그인이 설치되는 경로

Page 56: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 55

로그 파일이 저장되는 경로를 logs/가 아닌 test_log/로 변경하고 다시 한 번 엘라스틱서치를 실행

해보자.

path.logs: test_log

위와 같이 설정한 뒤에 엘라스틱서치를 다시 실행하고 디렉터리 구조를 다시 살펴보자.

$ ls

LICENSE.txt README.textile config lib test_log

NOTICE.txt bin data logs

$ ls test_log/

es_test.log es_test_index_indexing_slowlog.log

es_test_index_search_slowlog.log

예제 2.30 path.logs 설정 변경 후 엘라스틱서치 디렉터리 구조 확인

예제 2.30을 살펴보면 test_log 디렉터리가 새로 생겼음을 확인할 수 있다. 이 디렉터리를 다

시 조회해보면 es_test.log 를 비롯한 로그 파일이 생성됐다. 예제 2.23에서는 로그 파일명이

elasticsearch.log였는데, 이번에는 es_test.log로 저장된 이유는 앞의 설정에서 클러스터명을 es_

test로 지정했기 때문에 로그 파일명 또한 그에 맞게 저장된 것이다. 경로명은 엘라스틱서치가 설치

된 실행 경로를 기준으로 생성되며 슬러시(/) 기호를 시작으로 루트 이하 디렉터리의 절대 경로로도

지정할 수 있다.

로그 파일의 경로 외에 다른 경로도 설정을 변경해서 한 번씩 확인해보기 바란다. 참고로 data 경로

는 쉼표(,)로 구분해서 여러 경로를 지정할 수 있다. 이 방법으로 색인 된 데이터를 여러 개의 드라이

브에 나눠서 저장할 수도 있다.

플러그인

엘라스틱서치는 여러 가지 편리한 플러그인을 설치할 수 있다. elasticsearch.yml 파일에서

plugin.mandatory: 옵션 뒤에 플러그인 이름을 명시하면 필수 플러그인으로 검사하여 해당 플러

그인이 설치돼 있어야만 엘라스틱서치가 정상적으로 실행된다. 쉼표(,)로 구분해서 여러 개의 플러

그인을 지정할 수 있다.

# plugin.mandatory: mapper-attachments,lang-groovy

Page 57: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진56

위 주석을 제거하면 mapper-attachments 플러그인과 lang-groovy 플러그인이 설치돼 있어야

엘라스틱서치가 실행된다.

메모리

bootstrap.mlockall: 옵션의 주석을 제거하고 true로 설정하면 자바 가상 머신 위에서 실행 중인

엘라스틱서치가 점유하는 메모리를 고정(lock)시킨다. 이렇게 해서 자바 가상 머신이 엘라스틱서치

가 사용하지 않는 메모리를 다른 자바 프로그램으로 돌리는(swap) 것을 방지할 수 있다.

# bootstrap.mlockall: true

앞서 elasticsearch.in.sh에서 설정했던 대로 ES_MIN_MEM, ES_MAX_MEM 옵션을 동일한 크기

로 설정하고 bootstrap.mlockall: true 옵션을 설정해 엘라스틱서치에서 메모리가 부족하지 않도

록 방지할 수 있으므로 이 옵션은 반드시 true로 설정하기를 추천한다. 다만 엘라스틱서치가 설치된

시스템의 메모리 용량을 충분히 고려해 너무 많은 메모리를 엘라스틱서치에 할당하지 않도록 적절

한 조절이 필요하다. 시스템 전체 메모리의 50%가 넘지 않도록 하는 것이 안정적이다.

HTTP 네트워크

같은 서버에서는 별도의 네트워크 설정 없이도 엘라스틱서치 노드를 여러 개 실행하면 바로 바인딩

(binding)된다. 같은 서버가 아닌 서로 다른 네트워크에 있는 엘라스틱서치의 노드를 연결하려면

각 노드에 대한 네트워크의 설정을 해야 한다. elasticsearch.yml 설정 파일에 다음과 같은 항목이

있다.

# network.bind_host: 192.168.0.1

# network.publish_host: 192.168.0.1

# network.host: 192.168.0.1

network.bind_host: 는 엘라스틱서치 서버의 내부 IP 주소를 나타내고, network.publish_host:

는 외부, 즉 공개 IP 주소를 나타낸다. network.bind_host: , network.publish_host: 설정이 모

두 같은 경우 network.host: 항목을 설정하면 한번에 앞의 두 항목에 동일하게 반영된다. 서버가

방화벽이나 인터넷 공유기 등을 통해 다음과 같이 내부 네트워크 위치에 있는 경우를 가정해보자.

서버의 내부 주소는 192.168.0.40이고 방화벽 외부의 인터넷 주소는 121.131.44.64다.

Page 58: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 57

인터넷

192.168.0.40 121.131.44.64

엘라스틱서치 서버 방화벽

그림 2.11 엘라스틱서치가 방화벽 내부에 존재

이 경우 네트워크 설정은 다음과 같이 해야 한다.

network.bind_host: 192.168.0.40

network.publish_host: 121.131.44.64

기본적으로 REST API를 서비스하기 위해 엘라스틱서치는 9200~9299 범위의 HTTP 통신 포트를

사용한다. 서버에서 엘라스틱서치 노드를 처음 실행하면 9200번 포트로 실행된다. 같은 서버에서

새로운 엘라스틱서치 노드를 또다시 실행하면 두 번째 노드는 9201번 포트로 실행된다. 이런 식으

로 같은 서버에서 엘라스틱서치 노드는 9200부터 차례대로 포트 번호를 늘려가며 실행된다. 이 설

정은 http.port: 항목에서 설정할 수 있다.

또한, 하나의 엘라스틱서치 노드가 다른 노드와 바인딩(binding)되어 데이터 교환을 위해 통신하는

포트는 9300~9399 범위의 HTTP 통신 포트를 사용한다. 이 포트 또한 마찬가지로 같은 서버에서

두 개 이상의 엘라스틱서치 노드가 실행된 경우 9300, 9301과 같이 차례대로 포트 번호를 늘려가며

실행된다. 이 설정은 transport.tcp.port: 항목에서 설정할 수 있다.

# transport.tcp.port: 9300

# http.port: 9200

transport.tcp.compress: 옵션의 주석을 해제하면 엘라스틱서치가 통신하는 내용의 데이터를 압

축해서 전송한다. 전송해야 할 데이터가 http.max_content_length: 옵션에서 설정된 용량을 초과

하면 데이터를 전송하지 않는다.

# transport.tcp.compress: true

# http.max_content_length: 100mb

마지막으로 http.enabled: false로 설정하면 해당 엘라스틱서치 노드는 REST API 통신을 하지 않

는다.

# http.enabled: false

Page 59: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진58

여러 개의 엘라스틱서치 노드를 클러스터링해서 운용하는 경우 하나의 노드만 REST API 통신을 허

용하고 나머지 노드는 http.enabled: false로 설정해서 데이터를 저장하는 용도로만 사용하는 식으

로 운영할 수 있다.

게이트웨이

게이트웨이는 엘라스틱서치의 전체 클러스터의 상태를 저장하는 저장소다. 엘라스틱서치의 전체 클

러스터가 종료된 후 재실행 될 때 게이트웨이에 저장된 상태 값을 읽어 들여 노드와 인덱스 등에 대

해 새로 설정하는데, 이 과정을 리커버리(recovery)라 한다.

gateway.type: local 항목으로 저장 경로를 지정할 수 있으나, 이 책에서 사용한 버전인 엘라스틱

1.1.1에서 지원하는 기본 게이트웨이의 기본 저장 경로는 로컬(local)이 유일하다.

# gateway.type: local

아마존 웹 서비스(AWS) 플러그인을 설치하면 게이트웨이 저장소를 아마존 S3 클라우드 스토리지로

저장하도록 설정할 수 있다.

gateway.recover_after_nodes: 항목은 전체 클러스터가 재시작 되고 몇 개의 노드가 활성화됐을

때 리커버리를 시작할지 설정한다. 또한, gateway.recover_after_time: 을 설정하면 앞에 지정된

몇 개의 노드가 활성화 되고 다시 얼마 동안의 시간을 기다린 후에 리커버리를 실행할지 설정한다.

# gateway.recover_after_nodes: 1

# gateway.recover_after_time: 5m

위와 같이 설정하면 엘라스틱서치 클러스터가 재시작되고 노드 1개가 실행된 후에 5분이 지나면 리

커버리가 실행된다.

gateway.expected_nodes: 설정은 현재 엘라스틱서치 클러스터에 몇 개의 노드가 있는지 명시하

고 설정된 개수만큼의 노드가 활성화가 되면 즉시 리커버리를 실행한다.

# gateway.expected_nodes: 2

현재 엘라스틱서치 클러스터가 2개의 노드로 이뤄졌다고 가정했을 때, 위 설정은 2개의 노드가 활

성화되면 기다리는 시간 없이 즉시 리커버리를 실행한다.

Page 60: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 59

리커버리 제한

리커버리는 엘라스틱서치의 전체 클러스터가 재실행되거나 노드, 인덱스 등이 추가/삭제될 때 설정

된 클러스터의 상태를 유지하기 위해 데이터를 복사하고 재배치하는 활동이다. 설정할 수 있는 항목

은 다음과 같다.

# cluster.routing.allocation.node_initial_primaries_recoveries: 4

# cluster.routing.allocation.node_concurrent_recoveries: 2

# indices.recovery.max_bytes_per_sec: 20mb

# indices.recovery.concurrent_streams: 5

cluster.routing.allocation.node_initial_primaries_recoveries: 항목은 클러스터의 재실행 후

에 처음 리커버리가 실행될 때 몇 개의 샤드 및 복사본을 동시에 재배치하는 작업을 할지 설정한다.

cluster.routing.allocation.node_concurrent_recoveries: 항목은 엘라스틱서치 운영 중 노드가

추가, 삭제되는 등 구조가 변경될 때 몇 개의 샤드 및 복사본을 동시에 재배치하는 작업을 할지 설정

한다.

indices.recovery.max_bytes_per_sec: 항목은 초당 최대 얼만큼의 데이터를 리커버리 작업에 수

행할 것인지 설정한다. indices.recovery.concurrent_streams: 항목은 노드 간 최대 몇 개까지의

데이터 교환 통신을 동시에 수행할 것인지 설정한다. 이 설정들은 리커버리 작업이 엘라스틱서치 운

용과 서버의 또 다른 프로그램에게 과부하를 주지 않도록 할 때 필요하다.

디스커버리

디스커버리는 원격 네트워크에 있는 노드와의 바인딩을 설정하는 데 필요하다. 엘라스틱서치 클러

스터와 노드에 대한 사전 지식이 필요하므로 디스커버리 설정에 관해서는 4장에서 클러스터와 노드

를 설명한 뒤에 다시 설명하겠다.

슬로우로그

엘라스틱서치는 log4j 라이브러리를 사용해서 로그를 기록한다. 엘라스틱서치에서 수행하는 질의

(query)와 불러오기(fetch) 그리고 색인(indexing) 활동에 대해 다음과 같이 슬로우로그의 설정을

할 수 있다.

#index.search.slowlog.threshold.query.warn: 10s

#index.search.slowlog.threshold.query.info: 5s

Page 61: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진60

#index.search.slowlog.threshold.query.debug: 2s

#index.search.slowlog.threshold.query.trace: 500ms

#index.search.slowlog.threshold.fetch.warn: 1s

#index.search.slowlog.threshold.fetch.info: 800ms

#index.search.slowlog.threshold.fetch.debug: 500ms

#index.search.slowlog.threshold.fetch.trace: 200ms

#index.indexing.slowlog.threshold.index.warn: 10s

#index.indexing.slowlog.threshold.index.info: 5s

#index.indexing.slowlog.threshold.index.debug: 2s

#index.indexing.slowlog.threshold.index.trace: 500ms

예를 들어 index.search.slowlog.threshold.query.debug: 2s는 질의 활동에 2초 이상이 소요됐

을 때 해당 질의를 debug 레벨의 로그로 기록하는 설정이다. 슬로우로그 파일은 logs/ 디렉터리에

클러스터명_index_search_slowlog.log 형식으로 저장된다. 앞서 살펴봤던 예제 2.30을 다시 한

번 살펴보자.

$ ls

LICENSE.txt README.textile config lib test_log

NOTICE.txt bin data logs

$ ls test_log/

es_test.log es_test_index_indexing_slowlog.log

es_test_index_search_slowlog.log

예제 2.31 path.logs 설정 변경 후 엘라스틱서치 디렉터리 구조 확인

클러스터명이 es_test로 설정된 엘라스틱서치 시스템에서 logs/ 디렉터리에 es_test_index_

search_slowlog.log 파일이 있는 것을 확인할 수 있다. 질의와 불러오기 활동에 대한 슬로우로그

는 es_test_index_search_slowlog.log 파일에 저장되고 색인 활동에 대한 슬로우로그는 es_test_

index_search_slowlog.log 파일에 저장된다.

저장되는 파일명 형식은 config/ 디렉터리에 있는 logging.yml 파일에서 설정할 수 있다. 2.3.3절

에서 logging.yml 파일 형식을 살펴보겠다.

Page 62: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 61

2.3.3 config/logging.yml

logging.yml 설정 파일에서 앞 절의 elasticsearch.yml 파일 설정 중에 마지막으로 설명한 슬로우

로그 파일의 저장 형식을 지정할 수 있다. 파일 내용을 살펴보면 다음과 같다.

file:

type: dailyRollingFile

file: ${path.logs}/${cluster.name}.log

datePattern: "'.'yyyy-MM-dd"

layout:

type: pattern

conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"

index_search_slow_log_file:

type: dailyRollingFile

file: ${path.logs}/${cluster.name}_index_search_slowlog.log

datePattern: "'.'yyyy-MM-dd"

layout:

type: pattern

conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"

index_indexing_slow_log_file:

type: dailyRollingFile

file: ${path.logs}/${cluster.name}_index_indexing_slowlog.log

datePattern: "'.'yyyy-MM-dd"

layout:

type: pattern

conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"

${path.logs}는 로그가 저장 경로로 설정된 값으로 기본값은 엘라스틱서치 홈 디렉터리의 logs/ 디

렉터리다. ${cluster.name}은 엘라스틱서치의 클러스터명이다.

맨 처음 단락에서 file: ${path.logs}/${cluster.name}.log는 기본 로그가 클러스터명.log로 저장하

도록 설정하고 있다. 날짜가 변경되면 이전 날짜의 로그는 로그 뒤에 “yyyy-MM-dd” 형식의 날짜

가 추가돼 분리된다.

두 번째 단락에서 file: ${path.logs}/${cluster.name}_index_search_slowlog.log는 검색 슬로우

로그가 클러스터명_index_search_slowlog.log라는 이름으로 저장되게 한다. 마찬가지로 세 번

째 단락은 색인 슬로우로그가 클러스터명_index_indexing_slowlog.log로 저장되게 하는 단락

이다.

Page 63: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진62

필자의 시스템에 저장된 다음 로그를 확인해보자.

$ ls test_log/

elasticsearch.log elasticsearch_index_search_slowlog.log

elasticsearch.log.2014-05-13 es_test.log

elasticsearch.log.2014-05-14 es_test.log.2014-05-16

elasticsearch.log.2014-05-15 es_test_index_indexing_slowlog.log

elasticsearch_index_indexing_slowlog.log es_test_index_search_slowlog.log

예제 2.32 엘라스틱서치 로그 파일 조회

필자가 처음 엘라스틱서치를 설치했을 때에는 별도로 설정하지 않고 실행했기 때문에 클러스

터명이 elasticsearch로 실행돼 당시 로그가 elasticsearch_index_indexing_slowlog.log,

elasticsearch_index_search_slowlog.log, elasticsearch.log와 같은 이름으로 생성됐다. 이후

날짜가 지남에 따라 elasticsearch.log.2014-05-15와 같은 형식으로 지난 로그들이 백업됐다.

클러스터명을 es_test로 변경한 후에는 로그 파일이 es_test_index_indexing_slowlog.log, es_

test_index_search_slowlog.log, es_test.log와 같은 형식으로 새로 생성된 모습을 확인할 수 있

다.

이처럼 logging.yml 파일에서 엘라스틱서치 로그 파일을 필요한 형식대로 파일명을 설정해 저장할

수 있다. 클러스터명별로 설정된 로그 파일은 같은 설치 디렉터리에서 서로 다른 클러스터를 실행해

도 로그 파일이 섞이지 않도록 방지하는 기능이 있다.

2.4 플러그인 설치

엘라스틱서치는 플러그인을 설치해 여러 가지 편리한 기능을 추가로 사용할 수 있다. 플러그인 설치

방법을 알아보고 직접 설치와 삭제까지 진행해보자.

플러그인은 bin/ 디렉터리의 plugin 프로그램을 사용해서 설치한다. 플러그인을 설치하는 명령어

는 다음과 같다.

bin/plugin --install {org}/{user/component}/{version}

Page 64: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 63

bin/plugin 프로그램을 실행하면서 첫 매개변수로 --install 또는 -i를 입력하면 플러그인의 설치

가 진행된다. --install은 대시(-)가 두 개이고, -i는 대시가 하나임에 유의한다. 그다음 매개변수

로는 플러그인이 있는 경로를 지정하는데 플러그인의 설치 파일 경로는 다음 위치 중 하나에 있어야

한다.

.≆ http://download.elasticsearch.org/에.있는.경로와.파일

.≆ http://search.maven.org/remotecontent?filepath=에.있는.경로와.파일

.≆ https://github.com/에.있는.경로와.파일

다시 말해 플러그인 설치 명령을 실행하면 위 3개의 위치를 검색해서 설치할 플러그인이 있는 위치

를 찾아 해당 플러그인을 내려받고 설치를 진행한다.

엘라스틱서치 시스템을 한눈에 보기 쉽게 다룰 수 있는 유용한 플러그인인 헤드(Head)를 설치해

보자. 헤드 플러그인의 설치 파일은 깃허브의 mobz/elasticsearch-head에 있으며 설치 명령은

bin/plugin --install mobz/elasticsearch-head다.

$ bin/plugin --install mobz/elasticsearch-head

-> Installing mobz/elasticsearch-head...

Trying https://github.com/mobz/elasticsearch-head/archive/master.zip...

Downloading ...................................................................................

...................................DONE

Installed mobz/elasticsearch-head into /elasticsearch-1.1.1/plugins/head

Identified as a _site plugin, moving to _site structure ...

예제 2.33 헤드 플러그인 설치

너무 순식간이지만 이것으로 헤드 플러그인의 설치가 끝났다. 이제 엘라스틱서치를 실행하고 헤드

플러그인 화면에 접속해보겠다. 플러그인의 실행 주소는 다음과 같다.

http://{URL}:{port}/_plugin/{플러그인명}

엘라스틱서치를 실행한 뒤 웹 브라우저에서 localhost:9200/_plugin/head로 접속하면 다음과 같

은 화면을 볼 수 있다.

Page 65: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진64

그림 2.12 헤드 플러그인 화면

상단에 es_test라는 이름의 클러스터명과 왼쪽에 Node1이라는 노드명을 확인할 수 있다. 아직 입

력된 데이터가 없으므로 그 외에 설명할만한 별다른 특징은 없다.

헤드 플러그인은 mobz/elasticsearch-head 경로로부터 설치했다. 헤드는 깃허브에 소스와 설치

파일이 올라와 있으며 https://github.com/mobz/elasticsearch-head에서 헤드의 내용을 확인

할 수 있다.

그림 2.13 깃허브의 헤드 플러그인 경로

클러스터 명

노드 명

Page 66: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

02. 엘라스틱서치 설치와 실행 65

설치된 플러그인은 bin/plugin --list 또는 -l 명령으로 확인할 수 있다. 이때는 엘라스틱서치가

실행된 상태가 아니어도 된다.

$ bin/plugin --list

Installed plugins:

- head

예제 2.34 설치된 플러그인 확인

또는 엘라스틱서치의 노드 상태를 조회하는 명령어로도 설치된 플러그인을 확인할 수 있다. 엘라스

틱서치가 실행 중인 상태에서 curl -XGET localhost:9200/_nodes?pretty=true 명령어로 노드

의 상태를 확인해보자.

$ curl -XGET localhost:9200/_nodes?pretty=true

{

"cluster_name" : "es_test",

"nodes" : {

"wrJ8tGsRQOqN9pldUwf1kw" : {

"name" : "Node1",

… 중략 …

},

"plugins" : [ {

"name" : "head",

"version" : "NA",

"description" : "No description found.",

"url" : "/_plugin/head/",

"jvm" : false,

"site" : true

} ]

}

}

}

예제 2.35 실행 중인 노드 상태 확인

설치된 플러그인을 삭제하려면 bin/plugin --remove 또는 -r 명령을 사용한다. 설치한 헤드 플

러그인을 삭제하고 다시 플러그인 목록을 조회해보자.

Page 67: 시작하세요! 엘라스틱서치 : 루씬 기반의 실시간 오픈소스 검색엔진

시작하세요! 엘라스틱서치: 루씬 기반의 실시간 오픈소스 검색엔진66

$ bin/plugin --remove head

-> Removing head

Removed head

$ bin/plugin --list

Installed plugins:

- No plugin detected in /elasticsearch-1.1.1/plugins

예제 2.36 헤드 플러그인 삭제 후 설치된 플러그인 확인

헤드 플러그인을 설치하고 삭제하면서 플러그인의 설치 방법을 알아봤다. 이번 장 이후에도 헤드 플

러그인은 엘라스틱서치의 상태와 데이터를 확인하는 데 종종 활용할 예정이므로 예제 2.33을 참고

해서 다시 설치해두기 바란다.

엘라스틱서치의 상태를 조회하는 헤드 플러그인 외에도 데이터 입출력을 다루거나 시스템 설정 등

을 확인할 수 있는 유용한 플러그인이 많이 개발돼 있다.

2.5 정리

이번 장에서는 엘라스틱서치를 설치하고 환경을 설정하는 방법을 알아봤다. 엘라스틱서치는 유닉스

환경을 기본으로 만들어졌지만, 윈도 환경에서도 실행할 수 있게 지원하고 있다. 다른 빅데이터 솔

루션이나 DBMS처럼 서버 인증서나 계정, 권한 등의 복잡한 설정 없이 단순히 파일을 내려받고 압

축을 푼 뒤 실행하는 것만으로 간편하게 실행할 수 있다. 설치가 간편함은 물론이고 강력한 클러스

터링을 통해 손쉽게 시스템을 확장할 수 있다.

엘라스틱서치는 자바로 개발됐고 자바 가상 머신에서 실행되므로 자바 프로그래밍에 친숙한 독자라

면 이번 장의 설명을 좀 더 수월하게 이해했을 것이다. 이번 장에서 설명한 환경 설정에 관한 내용은

앞으로 해당 모듈에 대한 내용을 설명하면서 다시 언급하는 경우가 많이 있을 것이므로 잘 이해하고

넘어가기 바란다.