[검색엔진 라이브서치 개발과정 정리] Logstash JDBC 활용 및 ES plugin 설치

2019. 5. 27. 12:17ELK stack

Logstash는 기존 RDBMS의 데이터를 편하게 ES에 입력하기 위해 JDBC 플러그인을 지원한다. 플러그인의 설치는 아래의 명령어를 따르면 손쉽게 설치가 가능하다.

./bin/logstash-plugin install logstash-input-jdbc # logstash-input-jdbc 플러그인 설치

 

Jdbc 플러그인이 설치되면 자신이 사용하는 RDBMS의 커넥터 jar 라이브러리가 있어야 한다. mySQL의 경우 mySQL-connector 5.1.4 라이브러리를 사용하면 특별한 문제 없이 사용가능하다. 라이브러리를 받아서 압축을 풀고 logstash lib 폴더에 jar파일을 복사해주면 된다.

이렇게 하면 logstash.conf 에서 JDBC 플러그인을 통해 직접 RDBMS의 데이터에 sql 쿼리를 보내서 데이터를 받아 JSON형태로 ES에 넣어줄 수 있다. 다음은 예시이다.

input {

  jdbc {

    jdbc_driver_library => "../lib/mysql-connector-java-5.1.38.jar"

    jdbc_driver_class => "com.mysql.jdbc.Driver"

    jdbc_connection_string => "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf8"

    jdbc_user => "user_id"

    jdbc_password => "user_password"

   

    parameters => {"param1" : "abc"}

    statement => "select * from ... where :param1"

   

    jdbc_pool_timeout => 10

    jdbc_paging_enabled => true

    jdbc_page_size => 10000

  }

}

 

output {

  elasticsearch {

    hosts => ["localhost:9200"]

    index => "naver_movie"

    document_type => "review"

  }

  stdout {

    codec => rubydebug

  }

}

 

·         input

o    stdin

입력을 표준 입력으로 받겠다는 설정이다. 입력의 포맷은 json이다. codec 보통 어떤 데이터 스트림을 변환(인코딩, 디코딩)하여 다른 데이터 스트림으로 바꾸는 역할을 하는 것을 말하는데 여기선 표준 입력으로 들어온 json데이터를 해석하겠다는 뜻으로 보면 되겠다.

·         output

o    elasticsearch

출력을 elasticsearch 보내겠다는 뜻이다. elasticsearch 설정하기 위한 몇가지 옵션이 있다. logstash 버전별로 설정법이 조금 다른것같다. 버전별 공식 reference 확인하고 설정하자. ( 예제 설정은 logstash 5.6.4버전 기준으로 작성되었다.)

§  hosts : 보낼 elasticsearch 호스트설정이다.

§  index : elasticsearch 보낼 index 지정한다.

§  document_type : elasticsearch 보낼 type 지정.

§  document_id : elasticsearch 보낼 document id 지정.

§  많은 옵션값들이 있음 (공식 reference 참고 바람)

(참고 : https://www.elastic.co/guide/en/logstash/5.6/plugins-outputs-elasticsearch.html)

o    stdout

표준출력으로 보내겠다는 뜻이다. 코덱은 rubydebug 지정한다. rubydebug 설정하면 ruby awesome_print 라이브러리를 이용하여 json 보기좋게 출력해준다.

 

·         jdbc

o    jdbc_driver_library : connecter 라이브러리 설정이다. 앞에서 다운로드 받은 mysql-connector 경로를 설정하면 된다.

o    jdbc_driver_class : 드라이버 클래스를 설정한다. Mysql이므로 com.mysql.jdbc.Driver 설정

o    jdbc_connection_string : DBMS connection string 설정

o    jdbc_user : DBMS 접속 계정 설정

o    jdbc_password : DBMS 접속 계정 비밀번호

o    parameters : statement에서 사용할 파라미터를 설정한다.

o    statement : 조회하고자하는 데이터의 쿼리를 설정한다.

o    jdbc_pool_timeout : connection pool timeout 시간을 설정한다. (단위 , 기본값 5)

o    jdbc_paging_enabled : 데이터 조회시 페이징 처리를 것인지를 설정한다. (쿼리 결과의 ordering 보장하지 않는다.)

o    jdbc_page_size : 페이징의 사이즈를 결정한다.

o    많은 설정 (공식 문서 참고)

참고 : https://www.elastic.co/guide/en/logstash/5.6/plugins-inputs-jdbc.html

 

statement에서 조회 쿼리를 작성할 조회할 칼럼 이름을 elasticsearch 필드명과 동일하게 하면 조회한 데이터의 칼럼명과 동일한 필드에 색인한다. 또한 statement 위와같이 config 파일이 아닌 따로 파일로 작성하여 추가할 수도 있다.

위와 같이 설정한 logstash 위의 config 파일로 실행하면 DB에서 데이터를 읽어 elasticsearch 저장한다. 대량의 데이터를 elasticsearch 색인하려는 경우 logstash 이용하면 간단하게 데이터를 색인 있다

외에도 sql_last_value, schedule, tracking_column, use_column_value, document_id 등을 통해 옵션을 추가할 있다. Logstash input output 관련된 옵션 역시 여러가지 방법이 있으니 자신이 필요한 부분에 맞추어 알아보고 사용하는 것이 필요하다.

아래는 실제 적용중인 logstash_jdbc 설정이다.

 

 

여기까지 진행한다면 ELK stack 통해 기존 DB 데이터를 활용하여 기본적인 검색기능을 구현할 준비가 완료되었다.

이후에는 각자의 어플리케이션 실행환경을 통해 ES 통신을 구축하고, 검색어 쿼리(Query DSL, JSON ) 이용해 각자의 상황에 맞는 검색기능을 만들면 된다.

 

ES 플러그인의 설치는 간단하다. 

 

ES에는 다양한 기능들이 플러그인으로 존재하고, 특히 한국어 토큰 형태소 분석기 등 필수적인 plugin도 있다. 공식적으로 지원하는 플러그인의 경우 간단한 명령어를 통해 설치할 수 있으며, 비공식적인 플러그인의 경우 호환성을 보장하지 않는다.

 

플러그인을 설치하는 문법은 다음과 같다.

 

./bin/elasticsearch-plugin install <플러그인 이름>

 

설치가 완료되면 각 플러그인에 대한 사용법을 숙지해 적용하면 된다.

 

ES의 경우 오픈소스이며 http 통신의 특성상 보안에 취약한 결점이 있다. 따라서 ES 내부의 X-PACK을 통해 보안을 높은 단계까지 지원하지만, 이는 오픈소스가 아니라 유료화 모델로 따로 결제를 하지 않으면 지원을 받을 수 없다. (최근 7.1과 6.8버전에서 TLS통신과 기본권한관리 및 인증에 대해 무료화가 실시되어서 이 단점은 어느정도 상쇄되었다) 

 

또한 ES AWS 환경에서 원활하게 구축 할 수 있도록 아마존 AWS 상에서 기업 레벨의 ES 기술지원 및 설치를 진행한다. 그리고 아마존 AWS의 경우 각자의 인스턴스 환경에 맞는 커스터마이징 역시 손쉽게 이뤄지는 것으로 알고 있다. ES를 적용하는 과정에 있어서 각 서비스와 개발환경에 맞는 접근법을 가지면 다양한 방식으로 ES를 구축할 수 있는 셈이다.

 

ES는 한국어 검색에 특화된 것이 아니다. 한국어 형태소 분석기인 노리를 공식적으로 지원하지만, 자연어 검색에 있어서 목표한 만큼의 결과물을 가져오지 않는다. 따라서 개발자나 관리자가 직접 유저 커스텀 사전을 통해 txt 파일을 등록하여 특정 단어들에 대한 검색적합성을 높여야 한다는 단점이 있다. 그리고 집계함수를 통해 결과를 정렬하고 조건을 통해 상세검색을 하는 등의 기능들은 쿼리의 내용을 깊이 숙지하지 않으면 기초적인 문자열 검색 이상의 기능을 구현하기가 쉽지 않다.

 

ES는 사용과정에서 메모리나 리소스의 사용, 여타 사용환경에 있어 예상치 못한 문제를 일으킬 수 있기 때문에 개발자입장에서 java, 서버, RESTful, 메모리 구조 등에 대한 지식을 필요로 한다. 사용자가 많은 오픈소스이기 때문에 대중적인 문제는 Google 검색을 통해 대부분 확인해 볼 수 있으며,  Elastic.co에서 제한적인 기술지원도 받을 수 있다.

 

색인을 효과적으로 만드는 것, 성능을 개선하는 것, 플러그인을 실제로 만드는 것들은 ES를 통해 검색성능을 끌어올리기 위한 중요한 과제이다. 이러한 것들은 간단하게 습득하기는 어렵고, 결국 시도와 경험을 쌓는 수 밖에 없다. ES는 특히 버전업이 상당히 빠르기 때문에 늘 레퍼런스 문서와 친해지는 것도 도움이 된다.

 

실제 라이브서치를 런칭하여 기존 노후화된 상용검색엔진을 보조하는 용도로 사용하며, ES의 성능과 속도에 꽤 감탄했다. 게다가 검색엔진이라곤 한번도 만져보지 않은 신입 개발자가 책과 인터넷만으로 한달여만에 어느정도의 검색성능이 보장되는 검색엔진을 서비스 할 수 있다니 놀라운 일이었다. 당장은 ES가 최우선 과제는 아니지만, 지속적으로 관심을 갖고 개선해나가고 싶다.