logstash 도커 이미지 사용하기


안녕하십니까.

현재 저는 현업으로 엘라스틱 서치를 사용하고 있습니다. 

엘라스틱 서치를 테스트 하는 도중 테스트 디비의 데이터를 indexing할 필요성이 생기게 되었는데요. 직접 DB 쿼리를 통해서 데이터를 조회하여 데이터를 입력하기에는 번거로움이 많습니다. 그래서 logstash를 사용하기로 결정 하였습니다. 

logstash를 로컬에 설치하기도 또한 귀찮은 점이 있기도 하여서 도커를 통해서 사용을 하였고 이번에는 간략하게 사용 방법을 리뷰 해보려고 합니다. 


Logstash Docker Image 다운로드

logstash 이미지는 엘라스틱 서치 공식 홈페이지에서 찾을 수 있습니다.
자신의 컴퓨터와 맞춰서 실행하시면 되고, 또한 ES 버전도 잘 맞아야 합니다. 

저같은 경우는 ES 버전 6.6.0을 사용하였고, logstash는 최신 버전을 사용하였습니다. 이후 아래와 같은 오류를 보게 되었는데요, ES 공식 페이지의 글에서는 ES의 버전을 올리라고 하였습니다.

[ERROR] 2021-07-26 05:09:18.379 [[.monitoring-logstash]>worker0] elasticsearchmonitoring - Encountered a retryable error (will retry with exponential backoff) {:code=>400, :url=>"http://192.168.153.77:9200/_monitoring/bulk?system_id=logstash&system_api_version=7&interval=1s", :content_length=>1369} 

가능하면 최신 ES를 사용하는게 좋을 듯 합니다.

CONFIG 설정


이후에는 컨피그를 설정해주어야 합니다. 공식 페이지는 여기서 확인하실 수 있습니다. default ip는 elasticsearch 라는 domain으로 되어 있어서 접근이 되지 않습니다. 저는 아래와 같이 저만의 내부 ip를 사용하여서 매핑 시켜주었습니다. 아래의 파일을 config/logstash.yml로 로컬에 저장해줍니다.

xpack.monitoring.elasticsearch.hosts: ["192.168.153.77:9200"]

pipeline 설정
config 이후에는 pipeline을 설정 해야합니다. pipeline은 "어떤 데이터를 어떻게 넣을 것이다" 에 대한
설정 입니다.

파이프라인 형식은 다음과 같습니다. id는 파이프라인 id, path는 설정 위치입니다. 괄호가 들어있는 이유는 여러 파일을 comma로 넣을 수 있고, 이를 괄호로 감싸게 됩니다.
설정한 파일을 config/pipelines.yml으로 저장해줍니다.

pipeline.idmy-pipeline_1
  path.config".//config/{in}.cfg"

pipeline 설정

아래는 config/in.cfg 파일의 내용입니다.
input 부분은 입력을 넣을 source 데이터를 설정 합니다. 저는 티베로를 source로 지정하였고 이를 ES에 넣을 예정이라 다음과 같이 지정하였습니다. schedule을 다음과 같이 할경우 10초에 한번씩 호출하기 때문에 디비에 부하는 없는지 체크해야합니다. 
또한 내부적으로는 jdbc를 사용하기에 jdbc jar를 다운로드 하고 plugin 폴더에 넣어주면 됩니다. 
필터 부분도 있으나, 저는 사용하지 않아서 생략 합니다.
output 부분은 출력을 어느 index에 할지를 결정 합니다. 아래와 같이 es를 지정할 수 도 있지만, stdout을 지정하면 화면에 출력을 하게 됩니다. 하지만 데이터가 매우 많을 경우 도커 서버가 작동하기 어려워지므로 추천드리지 않습니다. document_id 부분은 index에서 설정할 document id 입니다. 
input {
  jdbc {
    jdbc_driver_library => ".//plugin/tibero6-jdbc.jar"
    jdbc_driver_class => "com.tmax.tibero.jdbc.TbDriver"
    jdbc_connection_string => "jdbc:tibero:thin:@127.0.0.1:8629:tibero"
    jdbc_user => "user"
    jdbc_password => "password"
    tracking_column => "id"
    use_column_value => true
    tracking_column_type => "numeric"
    schedule => "*/10 * * * * *"
    statement => "SELECT * FROM TABLE_A A"
  }
}
output {
  elasticsearch {
      hosts => ["192.168.153.77:9200"]
      index => "tibero_index"
      document_id => "%{msg_id}"
  }
}

참고로 현재 버전에서는 tibero의 paging을 위한 쿼리가 동작하지 않습니다. 이는 차츰 알아볼 예정입니다.

실행

위의 설정들을 임의의 config 폴더에 옮기고, jdbc만 임의의 plugin 폴더로 옮깁니다.
윈도우 기준으로 다음과 같이 실행 합니다. 
Host Path의 처음 폴더와 두번째 폴더의 윈도우 위치는 제가 설정한 config, plugin의 위치 입니다.
Container Path의 /usr/share/logstash/config는 logstash에서 사용하는 폴더 이름입니다. /usr/share/logstash/plugin 위치는 logstash에서 사용하는 위치는 아니지만, 위의 설정에서 입력하였기에 매핑 하였습니다.
나머지 설정들은 필요하신 만큼 변경하시면 됩니다. 

실행 이후

정상 실행시에는 아래와 같이 select 로그가 뜨게 됩니다. 그리고 es에 인덱싱을 하게 됩니다.
select를 계속 하게 되므로 계속 sync해야하는 상황이 아니면 한번만 돌리고 끄시는 것을 추천 드립니다. 










댓글

이 블로그의 인기 게시물

고려대학교 야간대학원 중간 후기

포켓몬 고 17셀 확인 포고맵 사용 방법

HTTP 오류 500.19 - Internal Server Error 에러 처리법