logstash를 이용하여 mysql과 elasticsearch 연동하기

2
post-thumbnail

지난 이야기

  • 엘라스틱서치에 은전한닢을 적용한 인덱스를 만드는 방법과
  • 은전한닢의 사용자 사전 기능을 이용하는 방법과
  • 엘라스틱서치의 동의어 사전 기능을 이용하는 방법을 알아봤었다.

logstash

다운로드 공식 링크
위의 링크를 통해 다운로드 받을 수 있다.

양해를 구하는 말씀

저는 로그스태시와 친하지 않습니다.
그래서 자세한 설명이 들어가지 않을 수도 있습니다.
저도 겨우겨우 실행만 한 수준이기 때문입니다.

사용 방법

압축을 풀고 안에 들어가면 여러 폴더들이 있을 것이다.
거기서 bin/logstash 파일이 logstash의 실행파일이다.

Java 버전과 충돌

일단, 다른 설정은 건드리지 않고 ./bin/logstash 를 입력하여 실행했을 때 실행이 되는지 확인해야 한다.
Java가 설치되어있지 않으면 logstash 폴더 내에 내장되어있는 Java를 통해 실행된다.

하지만 만약 설치되어있다면 조금 난감한 상황이 생길수도 있는데, 너무 낮은 버전이 설치되어 있거나, 너무 최신버전이 설치되어 있어도 실행이 되지 않는다.


최신버전에서 안된다니? 로스트 테크놀로지라도 있는거냐?!
실은 최신버전으로 오면시 지원이 중단된 기능들이 있다보니 너무 최신버전에서는 작동되지 않는다.

본인의 경우에는 .zshrc 혹은 .bashrc 파일 내에 있는 JAVA_HOME 프로퍼티에 주석처리를 하여 로컬에 설치된 Java를 사용하지 않는 것으로 logstash에 내장된 Java를 통해 실행되도록 처리했다.

다른 방법도 많이 있을텐데 각자의 방법으로 해보시길 바란다.

설정

config/ 경로에 있는 파일들이다.

pipeline.yml

기본적으로 이 파일이 있긴 한데 전부 주석처리 되어있어 실질적인 내용은 없는것과 마찬가지다.

본인이 넣은 설정이다.
중요한게 path.config 인데, 여기에 로그스태시가 설치된 경로의 config/logstash.conf 를 써줘야 한다.
만약 설정 파일을 여러개를 쓰려거든 config/*.conf 이렇게 써도 된다.

logstash.conf [설명]

이 파일은 기본적으로 들어있지 않은 파일인데, 샘플은 config/logstash-sample.conf 라는 이름으로 들어있다.

input, filter, output 이렇게 구역이 나눠지며,

  • input 은 데이터 소스에 대한 설정
  • filter 는 가공해야 하는 부분이 있다면 그 부분에 대한 설정
  • output 은 데이터가 들어갈 목적지를 설정한다.

input

여기서 jdbc_driver_library 는 기본적으로 제공되지가 않는다.
직접 어딘가에서 다운로드 받아야 하는데,
https://downloads.mysql.com/archives/c-j/
위 주소에서 받거나, 어떻게든 다운로드 받아서 사용해야 한다.

filter

https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
filter에 대한 공식 가이드 문서이다.

본인은 mysql 쿼리문에 JSON_ARRAYAGG 를 사용해서 나온 array string을 json filter가 파싱하지 못해서 방법을 찾다가 ruby filter를 이용하여 성공했다.
("[\"모자\"]" 이런 느낌의 json string을 json filter가 파싱하지 못한다.)

ruby filter에 대한 가이드 문서는 아래 링크를 참고하실 바란다.
https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html

output

여기서 AWS의 elasticsearch에 연결하면서 애먹은 부분이 있는데, ssl 설정과 ilm_enabled 설정이 없으면
xpack permission denied 에러가 나면서 실패하는 것이다.

AWS elasticsearch를 사용하시는 분들은 아래 링크를 참고하시길 바란다.
https://docs.aws.amazon.com/ko_kr/elasticsearch-service/latest/developerguide/es-managedomains-logstash.html

logstash.conf [완전체 샘플]

input {
  jdbc {
    jdbc_driver_library => "/Users/juunini/logstash-7.11.2/mysql-connector-java-8.0.16.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://url:port/db_name"
    jdbc_user => "user"
    jdbc_password => "password"
    jdbc_paging_enabled => true
    tracking_column => "updated_at"
    use_column_value => true
    tracking_column_type => "numeric"
    schedule => "*/5 * * * * *"
    statement => "SELECT ... FROM ..."	
  }
}

filter {
  ruby {
    code => "
      require 'json'

      category_names = JSON.parse(event.get('category_names'))

      event.set('category_names', category_names.select { |name| name != nil })
    "
  }
  mutate {
    copy => { "idx" => "[@metadata][_id]"}
    remove_field => ["idx", "@version", "updated_at"]
  }
}

output {
  stdout { codec => "rubydebug"}
  elasticsearch {
    index => "items"
    document_id => "%{[@metadata][_id]}"
    hosts => ["https://url:443"]
    user => "user"
    password => "password"
    ssl => true
    ilm_enabled => false
  }
}
profile
지상 최강의 개발자 쥬니니

0개의 댓글