测试[Elasticsearch][Logstash]的多个管道

简介

看到这篇文章后试验的内容。
据说 Logstash 6.0 将能够定义多个 Pipeline。有了这个功能之后,会带来哪些便利之处呢?我们将从这个角度来看。
在看到 Qiita 上关于 fluentd 的标签很多,但关于 Logstash 的标签很少的情况下,为了增加一篇文章数量,我写下了这篇。

我在以下环境下进行了测试。

productversionElasticsearch6.0.0-beta1Kibana6.0.0-beta1Logstash6.0.0-beta1

只有当没有Pipeline时,设置地狱(以551的方式)

在没有Pipeline的情况下,如何实现具有多个input、filter和output的设置?

将所有设置都写在一个配置文件里

如果语句的分支或者容易出错的地方很多。可读性也不好。
给这里后续添加东西时,似乎会制造出会导致错误的氛围。

    input {
      beats { port => 3444  tag => apache   }
      tcp { port => 4222  tag => firewall   }
    }
    filter {
       if "apache" in [tags] {  
        dissect { ... }
       } else if "firewall" in [tags] {  
        grok { ... }
       }  
    }
    output {
       if "apache" in [tags] {  
        elasticsearch { ... }
       } else if "firewall" in [tags] {  
        tcp { ... }
       }  
    }

解决方法在5.x之前

在前面提到的例子中,情况是这样的。

TCP转为Grok,再转为TCP
Beats转为Dissect,再转为ES

对于TCP的输入,Dissect和ES是不必要的,但由于试图在一个配置文件中编写它们,结果变成了前面提到的一种包含了全部内容的配置文件。

如果你想在5.x版本中解决这个问题,你可以考虑将文件分成几份,在不同的logstash实例中执行。

logstash -f aaa.config
logstash -f bbb.config

然而,对于每个Logstash实例,它们启动了一个Java实例,占用了大量内存,效率并不高。因此,我们可以采用Pipeline的方式来解决这个问题。

管道

Pipeline可以根据输入、过滤器和输出以及处理的系统进行分组描述。
举个例子来说,可以分别管理从TCP开始的处理流水线和从Beats开始的处理流水线。

参考文章中的示例如下:
我们可以看出,它分别定义了用于apache处理的管道和用于TCP接收的管道。

- pipeline.id: apache
  pipeline.batch.size: 125
  queue.type: persisted
  path.config: "/path/to/config/apache.cfg"
  queue.page_capacity: 50mb
- pipeline.id: test
  pipeline.batch.size: 2
  pipeline.batch.delay: 1
  queue.type: memory
  config.string: "input { tcp { port => 3333 } } output { stdout {} }"

如果使用Docker镜像的Logstash,那么此pipeline.yml文件位于以下位置。

/opt/logstash/config/pipelines.yml 可配置文件路径。

请参考设置文件以了解每个设定值的详细信息,这里只列出了运行确认所必需的重要要点。

項目説明pipeline.id[必須] 一意となる文字列を設定するpath.config個別のPipelineの設定ファイルのパスconfig.string文字列としてPipelineの設定を渡すときに使う

实际上,我觉得如果在config.string中进行编写,pipelines.yml的可读性会变差,所以我只想使用path.config。

执行

如果在运行Logstash时不指定-e(指定config.string)或-f(指定path.config),则将读取并执行pipelines.yml。

如果更改pipelines.yml文件,只需无参数执行logstash即可。
通过添加-r选项,它将自动重新加载pipelines.yml文件。

作为示例,我是这样做的。只需传递pipelines.yml等必要文件,然后执行logstash命令。

docker run --rm -it --name logstash \
 -v $(pwd)/pipelines.yml:/opt/logstash/config/pipelines.yml \
 -v $(pwd)/logstash.yml:/opt/logstash/config/logstash.yml \
 -v $(pwd)/sc.conf:/opt/logstash/pipeline/sc.conf \
 --link elasticsearch6b:elasticsearch \
 --network default \
 docker.elastic.co/logstash/logstash:6.0.0-beta1 logstash

我正在传递logstash.yml,目的是将数据从logstash发送到用于监控的Elasticsearch服务器,
因为这个连接字符串包含在其中。

我认为有了Pipeline,会有以下优点。

    • Logstashの設定ファイルの簡素化!(分離できるところが一番大きいかな)

 

    • 処理の系統ごとに細かな個別設定が可能(バッチサイズや、Queueの持ち方など)

 

    可視化、モニタリングもある!

[参考] 监控

如果您正在使用监控功能,可以从Kibana界面看到Logstash的处理状态和Pipeline的状况。结合Pipeline使用监控效果更好。

监控界面

如果能够获取到Logstash的监控信息,会在Kibana下方的框中显示,您只需点击类似于Kibana旁边的心形图标。

Monitoring docker cluster Overview.png

节点的状态

可以看到负荷情况。

Node.png

管道的状况

当运行Logstash时,可以看到Pipeline的内容。

Monitoring docker cluster Logstash Pipelines.png

点击版本链接,可以查看Pipeline的内容。

3.png

请注意

关注事项1

如果在path.config的值中指定了不存在的文件等,将会通过INFO消息显示。如果完全看不到Pipeline正在运行的情况,建议进行确认。

在路径{:path=>”*************************”}中找不到配置文件。

20170829.png

当Pipeline正常启动后,在Pipelines running下面会显示已启动的Pipeline的计数。
因为有一个用于监控的Pipeline,所以从显示的值中减去1,得到的结果就是期望的Pipeline数,如果一致就表示OK。

2个小心事

由于与监测无直接关联,所以与多管道无关。

xpack.monitoring.elasticsearch.url: http://elasticsearch:9200
xpack.monitoring.elasticsearch.username: HogeHoge
xpack.monitoring.elasticsearch.password: BarBar

假设您在设置中使用了例如”xpack.security.enabled=false”等内容,并且处于无需身份验证的状态,
请将用户名(username)和密码(password)的设置值设为空。但请不要删除该设置项。

    良い例
xpack.monitoring.elasticsearch.url: http://elasticsearch:9200
xpack.monitoring.elasticsearch.username: 
xpack.monitoring.elasticsearch.password: 
    悪い例 (コメントアウトしてしまう)
xpack.monitoring.elasticsearch.url: http://elasticsearch:9200
# xpack.monitoring.elasticsearch.username: 
# xpack.monitoring.elasticsearch.password: 

如果是一个糟糕的例子,将会在日志中输出以下错误。

[2017-08-29T06:07:24,928][ERROR][logstash.pipeline        ] Pipeline aborted due to error {:pipeline_id=>".monitoring-logstash", :exception=>#<ArgumentError: You must set the password using the xpack.monitoring.elasticsearch.password in logstash.yml>, :backtrace=>["/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/x-pack-6.0.0.beta1-java/lib/license_checker/license_reader.rb:29:in `initialize'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/x-pack-6.0.0.beta1-java/lib/license_checker/licensed.rb:86:in `license_reader'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/x-pack-6.0.0.beta1-java/lib/license_checker/licensed.rb:48:in `setup_license_checker'", "/usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/x-pack-6.0.0.beta1-java/lib/monitoring/inputs/metrics.rb:63:in `register'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:376:in `register_plugin'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:387:in `block in register_plugins'", "org/jruby/RubyArray.java:1734:in `each'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:387:in `register_plugins'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:551:in `start_inputs'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:433:in `start_workers'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:321:in `run'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:281:in `block in start'"], :thread=>"#<Thread:0x64c80450@/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:278 run>"}

在logstash.yml中,必须使用xpack.monitoring.elasticsearch.password来设置密码。

请提供更多上下文,以便我能够准确地为您提供中文的同义句。

本次使用的 ES 和 Kibana 的启动是通过 docker-compose up -d 命令实现的。

version: '2'
services:
  elasticsearch6b:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.0.0-beta1
    container_name: elasticsearch6b
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - "xpack.security.enabled=false"
  kibana6b:
    image: docker.elastic.co/kibana/kibana:6.0.0-beta1
    container_name: kibana6b
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch6b
    links:
      - elasticsearch6b:elasticsearch
    environment:
      - "xpack.security.enabled=false"
广告
将在 10 秒后关闭
bannerAds