Meteor — ElasticSearch 연동하기

Meteor로 앱을 만들어 서비스를 하면서 검색에서 어려움을 겪었다. 서비스 구조가 다소 복잡하여 검색을 하면 slow-query 경고가 나왔다. 고민, 고민을 하다가, 이 참에 과감하게 검색엔진을 적용해보자고 맘을 먹었다.

구글에서 검색을 해보니 가장 많이 언급되는 것이 ElasticSearch였다. 좀 더 찾아보니 비슷한 솔루션으로는 Solr가 있었다. 둘 다 Apache Lucene 기반으로 유사한 기능을 제공하는 것으로 보였다.

게다가 Solr는 Apache 공식 프로젝트이니, 차라리 Solr가 더 적합하지 않을까 싶었지만, ElasticSearch로 결정한 것은 바로 이 것 때문이었다.

ElasticSearch는 짧은 기간에 엄청난 스피드로 Solr를 추월하고 있었다.

특히 Elastic 사이트에서 제시한 비전과 ELK stack(Elasticsearch, Logstash, Kibana)이 맘에 들었다.

Meteor와 연동하기 위해서 Atmosphere에서 패키지를 들을 검색하였지만 여기에서 제공하는 패키지들은 주로 연동이 된 다음의 처리를 하는 부분에 초점을 맞추고 있었다.

어떻게 연동을 하는지는 알기가 어려웠다.

다시 구글링을 통해서 알아보니 River라는 ElasticSearch 플러그인으로 연동을 한다고 한다. 그리고 MongoDB-River 플러그인이 있었다:

여기서는 Elasticsearch 1.4.2 버전에 맞추어져 있었다. 현재 최신은 1.5.2 이지만, 이 당시에 Elasticsearch 1.5.0 버전은 RC 상태였다.

일단 Elasticsearch 1.4.2를 다운로드하여 테스트 서버에 설치하고 연동을 시도하는데 뭔가 잘 되지 않고, 자꾸 오류가 발생하였다. 하루를 보내고 다음날이 되어 다시 시도를 하는데… 사고가 터졌다.

IDC에서 연락이 왔다. 이상 트래픽을 발생하여 테스트서버를 차단한다는 거다. 엥? 확인해보니 정말 이상한 프로세스가 떠 있고 쉼없이 뭔가 작업을 하고 있다. 막 삭제하려는데 IDC에서 시급하다며 네트워크를 차단해버렸다.

사실 방화벽도 있고, root 로그인도 차단한 상태였는데, 이럴 수가… 하는 생각이 들었다. 정말 보안이 이렇게 쉽게 뚫리는 거였나?

이런, 눈물을 머금고 IDC로 가서 서버를 싹 밀고 새로 깔았다. 그리고 보안 설정을 더 강화했다. 그렇게 하루를 보내고, 작업은 당분간 중단했다. 다른 일이 바빴기 때문이다.

며칠 후, 재시도를 했다. 그런데, 똑같은 일이 일어났다. 다시 IDC에서 이상트래픽이 발생한다며 차단한 것이다. 그럴리가? 보안을 강화했는데? 22번, 80번, 443번 포트 외에는 별로 열어둔 것도 없었다. 게다가 접속 IP 주소도 회사 사무실 쪽만 열어두었었다.

이번에는 IDC 담당자도 의아한지 함께 원인을 분석해보기로 했다. 한참을 분석한 끝에 이상트래픽은 Elasticsearch에서 발생한다고 보았다. 이것을 내리고 해당 프로세스를 삭제하니 정상화되었다.

구글링을 해보니 Elasticsearch 1.4.2 버전이 보안 취약점이 있다며 1.4.3을 사용하라고 하는 것 아닌가? 정말 이것때문이었는 지는 확실한 증거가 있는 것은 아니지만, 그 이후로는 이런 침입은 발생하지 않고 있다.

과감하게 1.5.0으로 업그레이드하여 시도하였다. 그런데 River 플러그인은 정상적으로 작동하지 않는다. 왜?

또 한 참 헤메다보니, ElasticSearch 1.5.0부터는 River를 deprecate시킨다는 공지가 있었다.

이제 막 시작하는 데 이런 플러그인을 사용할 수는 없지.

이 글에서는 River 대신, Logstash를 사용하라는 거다. 이건 또 뭐냐? 바쁜데…

또 찾아보니 있다!

하지만, 이것은 바로 적용하기가 어려웠다. 완성도도 떨어지고, 잘 되지도 않고, 여러모로 불안했다.

내친김에 직접 만들어보자고 작심하고 시작했지만, 하루 정도 해보니 내가 모르는 것이 너무 많았다. 음, 좀 더 공부하라는 소리라고 생각하고 여기서 Logstash를 이용하는 방법은 접었다.

그리고 또 며칠이 흘렀다. 다른 일을 하다고 MongoDB 관련해서 검색을 하는데, Mongo-Connector라는 것이 있었다.

Elasticsearch, Solr, MongoDB 등을 연결하는 모듈이었다. 이런 게 있다니… ㅎㅎㅎ.

이것은 MongoDB 개발사에서 제공하는 것이니 괜찮겠다는 생각이 우선 들었다.

한 참 해메이다 이제 제 갈길을 찾은 느낌이다.

ElasticSearch 1.5.2를 깔고, Mongo-connector를 설치하고 연동을 시도했다. 설정을 잡고, 시도를 하니… 오~~ 된다!

이제 Meteor에서 ElasticSearch 결과를 가져오는 방법이 필요하다.

ElasticSearch에서 제공하는 JavaScript API가 있다. 이것을 사용하면 된다. Atmosphere에서 Elasticsearch 관련 패키지들을 조사했다. 여기서 Easy-search 패키지가 가장 인기가 있었다.

하지만, 내용을 분석해보니 UI측면에서는 구조적으로나 이것을 바로 적용할 수가 없었다. 결국 직접 만들어야 했다.

아주 간단하게 elasticsearch.js 라이브러리를 이용하여 연동하는 패키지를 작성하고 Meteor에서 연동을 시도했다.

그리고 마침내 성공했다!

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.