LogStash

Filebeat 데이터를 로드밸런싱하는 방법들

behonestar 2016. 7. 25. 10:31

Filebeat 데이터를 로드밸런싱하는 방법을 검토해보았습니다.

1. logstash loadbalance 설정을 활성화시키는 방법

filebeat.yml

  logstash:

    hosts: ["192.168.0.10:5044", "192.168.0.11:5044", "192.168.0.12:5044"]

    loadbalance: true


Filebeat 설정에서 logstash의 loadbalance 옵션을 활성화시키면 등록된 Logstash hosts들에게 데이터가 분산됩니다. LogStash 인스턴스 개수가 고정이라면 이 방법이 가장 유용합니다.


하지만 LogStash가 오토-스케일링되는 조건이라면 LogStash 인스턴스들을 Discovery하여 Filebeat 설정에 반영해주는 모듈을 별도로 구현해줘야합니다. filebeat.yml 파일을 직접 변경하지 않고 환경변수를 통해 변경하는 방법을 사용하면 구현이 용이합니다.

2. Filebeat가 로그를 Shipping하는 방법

첫번째 방법에서 LogStash Shipper로 분산되었던 데이터들도 결국은 메시지큐에 담겼습니다. 필터 플러그인 적용 전,후의 데이터 크기가 큰 차이가 없다면 LogStash Shipper를 별도로 구축하지 않고 Filebeat 자신이 Shipper가 되는 것도 좋은 방법입니다. 


이 경우 Filter 플러그인은 LogStash Indexer에 적용하는 것이 좋습니다. Filebeat에서 로그를 직접 파싱할 수도 있지만 정규식 처리는 리소스 비용이 비싸기 때문에 원활한 서비스 제공에 영향을 미칠 수 있기 때문입니다.


개인적으로 LogStash가 오토-스케일링되는 조건에서는 이 방법이 가장 편리하고 합리적이라고 생각합니다.


filebeat.yml

filebeat:

  prospectors:

      paths:

        - /var/log/celery.log

      input_type: log

      multiline:

        pattern: '^[[:space:]]+|^Traceback'

        negate: false

        match: after


output:

  redis:

    host: 192.168.10.100

    port: 6379

    password: mypassword


logstash.conf

input {

  redis {

    host => "192.168.10.100"

    password => "mypassword"

    key => "filebeat"

    data_type => "list"

  }

}


output {

  elasticsearch {

    hosts => ["192.168.10.200:9200"]

  }

  stdout {}

}

3. AWS ELB를 통한 로드밸런싱 방법


Filebeat는 LogStash와 Persistent 연결을 하기 때문에 ELB를 거치더라도 최초에 연결됐던 Logstash에게만 데이터를 전송합니다. 반드시 ELB를 통해 로드밸런싱을 구현해야 한다면 LogStash 연결에 대한 TTL을 설정하여 재연결을 유도하는 방법을 사용해야합니다. 1.12 버전에서는 해당 기능을 옵션으로 지원하고 있지 않습니다.



참고

  1. https://discuss.elastic.co/t/filebeat-only-goes-to-one-of-the-logstash-servers-that-is-behind-an-elb/48875/5
  2. https://github.com/elastic/beats/issues/661
  3. http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html