본문 바로가기
ELK/ElasticSearch

엘라스틱서치(Elasticsearch) Logstash configuration 파이프라인 시작하기 2편

by by 앵과장 2020. 7. 1.
반응형

Logstash

Logstash는 플러그인 기반의 데이터 수집 및 처리 엔진으로서, 광범위한 플러그인이 구비되어 다양한 수많은 아키텍처에서 손쉽게 데이터를 수집, 처리, 전달할 수 있게 해줍니다.

프로세싱은 하나 이상의 파이프라인으로 구성됩니다. 각 파이프라인에서 하나 이상의 입력 플러그인이 내부 대기열에 배치된 데이터를 수신하거나 수집합니다. 이것은 기본적으로 작고 메모리에 보관되지만 안정성과 복원력을 향상시키도록 디스크에서 더 크고 영구적으로 구성할 수 있습니다.

 

 

Logtash 파이프라인

 

로그스태시는 로그 수집도구라고 볼 수가 있는데 예전에는 엘라스틱에 데이터를 밀어넣기 위해 redis 등이 많이 쓰였던 것 같은데 최근에는 아예 ELK라는 이름에서 보듯이 logstash가 대세인 듯 하다.

구성은 정말 심플하게 3단계의 파이프라이닝을 구성하고 있으며, plugin도 다양하게 존재한다. 낮은 버전의 로그스태시에서는 플러그인을 별도로 설치해주거나 하는 거 같은데, 내가 쓰는 5.5 버전에서는 왠만한 플러그인은 전부 built-in 되어 있는 듯.

  • Input
    • input과 관련된 플러그인 관련 링크
    • 데이터를 어디서 받겠냐는 것인데 http 호출을 통한 리턴값을 받거나, TCP로 직접 로그를 받을 수도 있고, csv/json 등의 파일 뿐 아니라 twitter에서도 인풋을 받을 수 있다!!
  • Filter
    • filter와 관련된 플러그인 관련 링크
    • 사실상 로그스태시의 핵심 모듈이라고 생각. 빅데이터 엔진의 가장 큰 특징은 비정형 데이터를 처리 할 수 있다는 점인데, 이 비정형 데이터라는 게 말 그대로 규약이 없다
    • 다시 말해, 실제로 데이터를 활용하기 위해서는 인풋 데이터로부터 일정한 가공이 필요한데, 이러한 가공 방법을 여기서 규약한다.
    • 예를 들어, syslog를 받아 그 중에 IP만 처리하려고 한다면 정규식 등을 활용해서 다른 데이터는 없애고, 수정하고, 입력하려는 컬럼 데이터 정의하고, 특정 필드는 없애고 등등의 대부분의 작업이 된다 (심지어 code plugin으로 ruby 코드까지 돌릴 수 있다!)
    • grok  mutate 필터가 핵심인데.. 사실 아직 이 부분을 사용하기 참 어렵다.
  • Output
    • output과 관련된 플러그인 관련 링크
    • output(필터링된 데이터))을 어떻게 출력하고 어디로 보낼 것이냐를 정의하면 됨

Logstash 연결이 ELK 연동이되고나면 Kibana > Monitoring 에서 Pipelines 를 클릭하면 

설정되어있는 파이프라인 들에 대해서 확인가능하며 목록에 노출된 conf 파일 클릭시 UI/UX로 구성한 상세내용 확인이 가능합니다.

 

실제로 수행된 시간까지 확인할수 있으니 작업된 부분에 대해서 예상했던 부분보다 오래걸리는 결과가 나올경우 튜닝 포인트를 빠르게 찾을수 있습니다.


6가지 기본개념

Pipeline

  • 데이터 처리를 위한 logstash 설정. 위와 같이 3가지 processor (Input, Filter, Output)로 구성되어있으며 순차적으로 실행됨
  • 서비스에 '어떤 데이터'가 필요한지에 대한 정의해서, 이에 따라 '어떤 플러그인'을 선택하여 필터링할 것인가? 를 고민하는게 파이프라인 설계의 핵심임

Plugin

  • 각 단계(Input, Filter, Output)는 여러 플러그인 조합으로 구성하며, Input -> Filter -> Output이 순차적으로 실행됨.
    • 예를 들어, Input은 File Plugin으로, Filter는 JSON plugin 그리고 Output에는 ElasticSearch plugin으로 구성한다면, 파일로부터 데이터를 가져와서 ElasticSearch에 저장가능한 JSON형태로 변환한 후 ElasticSearch로 Indexing하게 됨.
  • 각 단계를 조합하는 Plugin의 사용법은 비슷비슷해서 사용법의 학습비용은 크지 않음.
  • 원하는 plugin도 만들어서 사용할 수 있음. 참고: howtowritealogstashoutputplugin

Input

  • 데이터가 유입되는 근원지. Input Plugins을 사용해 특정 소스의 이벤트(데이터)를 가져옴.
  • logs & Files, Metrics, Wire Data, Web Apps, Data Stores, Data Streams 등의 수집을 지원함. Elastic Reference - input-plugins을 보면 많은 종류의 Input을 가져올 수 있도록 지원함. 사용법은 거의 비슷함.
  • Beats와 결합해서 쓰는 것도 가능함

Filter

  • log parsing, 데이터 확장, 태그 추가 등 의 데이터 변형 작업을 함. Filtering 과정은 필수가 아님.
  • 자주 쓰이는 Filter plugin 5가지는 아래와 같음
  • gork
    • 문자열 데이터에서 필요한 데이터를 뽑아내려면 정규표현식으로 원하는 내용만 뽑아내야함. grok은 자주 쓰이는 정규표현식 패턴이 사전정의되어있어 패턴을 골라서 사용하면 됨.
    • logstash-patterns-core를 보면 aws, maven, redis 등등의 로그 패턴을 볼 수 있음.
  • mutate
    • 데이터 필드 단위로 변형할 수 있음. 예를 들면, 필드를 변경하고 합치고(join), 이름을 변경할 수 있음.
    • elastic search 에서 indexing된 data를 변경하는 것은 상대적으로 어려움. indexing 전에 필드를 변경해서 넘기는 것이 속도도 빠르고, 불필요한 indexing을 줄이면서 elasticsearch에 전송하는 데이터양도 줄일 수 있음.
  • date : String을 Data타입으로 변환함. 날짜를 string타입으로 Elastic Search에서 indexing하면 Query나 Aggreagtion할때 문제가 발생할 수 있기 때문임.
  • json : input의 JSON 데이터 구조를 유지
  • kv : 위 JSON처럼 Key-value 형태로 구문분석 유지
  • Elastic - filter-plugins

Output

  • 데이터를 전송할 목적지. 가공된 데이터를 '어딘가의 저장소'에 적재함. Elastic Search, RDBMS 처럼 '어딘가'에 저장할 것인지는 Output plugin으로 결정됨.
  • Elastic Reference - output-plugins

Codec plugin

  • 데이터 인코딩 & 디코딩. 메세지(들어오는 데이터)를 쉽게 구분하고 전송할 수 있도록 하는 input과 output 단계에서 사용되는 stream filter. 
  • 많이 쓰이는 것으로는 json, msgpack, plain (text), multiline(여러 줄로 이루어진 로그를 하나의 메시지로 다룸)
  • Elastic Reference - codec-plugins


Logstash 디렉토리 구조

ㄴ bin : 바이너리 스크립트가 있는 디렉토리 입니다. Logstash를 시작하기 위해 사용되는 logstash와 Logstash 플러그인 설치를 위한 logstash-plugin 파일등이 있습니다.

ㄴ config : logstash.yml, pipeline.yml 등 설정 파일이 존재합니다.

ㄴ data

ㄴ logs : 로그 파일이 존재합니다.


 

Logstash 파이프라인에는 2개의 필수 요소 input과 ouput, 1개의 선택 요소 filter가 있습니다.

  • input 플러그인 : consume data from a source

    • file, redis, beats

  • filter 플러그인 : modify the data as you specify

    • grok, mutate, drop, geoip

  • output 플러그인 : write the data to a destination. ouput은 하나 이상이다.

    • elasticsearch, file, kafka

  • codec : input과 output에서 데이터를 인코딩하거나 디코딩하기 위한 코덱을 지원한다.

    • json, multiline


 

Settings File

/config 디렉토리에 위치합니다.

  • logstash.yml : Logstash 실행과 관련된 설정이 들어있습니다.

  • pipeline.yml : 단일 Logstash 인스턴스에서 여러개의 파이프라인을 실행할 때 사용한다.

  • jvm.option : JVM 설정이 들어가 있습니다. 이 설정파일을 통해 힙 사이즈를 조절하거나 GC 관련 옵션 등을 설정할 수 있습니다.

  • log4j2.properties : log4j 관련 설정 파일

자세한 사항은 공식 문서를 참고하시길 바랍니다.