zoukankan      html  css  js  c++  java
  • logstash的pipeline

    一个 logstash 实例中可以同时进行多个独立数据流程的处理工作,如下图所示。

    而在这之前用户只能通过在单机运行多个 logstash 实例或者在配置文件中增加大量 if-else 条件判断语句来解决。要使用 multiple pipeline 也很简单,只需要将不同的 pipeline 在 config/pipeline.yml中定义好即可,如下所示:

    - pipeline.id: apache
      pipeline.batch.size: 125
      queue.type: persisted
      path.config: "/path/to/config/apache.cfg"
    - pipeline.id: nginx
      path.config: "/path/to/config/nginx.cfg"

    其中 apachenginx作为独立的 pipeline 执行,而且配置也可以独立设置,互不干扰。pipeline.yml的引入极大地简化了 logstash 的配置管理工作,使得新手也可以很快完成复杂的 ETL 配置。

    - `pipeline.workers`:设置启动多少个线程执行 fliter 和 output;当 input 的内容出现堆积而 CPU 使用率还比较充足时,可以考虑增加该参数的大小;
    - `pipeline.batch.size`:设置单个工作线程在执行过滤器和输出之前收集的最大事件数,较大的批量大小通常更高效,但会增加内存开销。输出插件会将每个批处理作为一个输出单元。;例如,ES 输出会为收到的每个批次发出批量请求;调整 `pipeline.batch.size` 可调整发送到 ES 的批量请求(Bulk)的大小;
    - `pipeline.batch.delay`:设置 Logstash 管道的延迟时间, 管道批处理延迟是 Logstash 在当前管道工作线程中接收事件后等待新消息的最长时间(以毫秒为单位);简单来说,当 `pipeline.batch.size` 不满足时,会等待 `pipeline.batch.delay` 设置的时间,超时后便开始执行 filter 和 output 操作。

    在 6.3 版本中,Logstash 又增加了 Pipeline-to-Pipeline的管道机制(beta),即管道和管道之间可以连接在一起组成一个完成的数据处理流。熟悉 linux 的管道命令 |的同学应该可以很快明白这种模式的好处。这无疑使得 Logstash 的配置会更加灵活,今天我们就来了解下这种灵活自由的配置方式。

    Pipeline-to-Pipeline配置

    修改 config/pipeline.yml文件如下:

     - pipeline.id: upstream
       config.string: input { stdin {} } output { pipeline { send_to => [test_output] } }
     - pipeline.id: downstream
       config.string: input { pipeline { address => test_output } } output{ stdout{}}

    然后运行 logstash,其中 -r 表示配置文件有改动时自动重新加载,方便我们调试。

    bin/logstash -r

    在终端随意输入字符(比如aaa)后回车,会看到屏幕输出了类似下面的内容,代表运行成功了。

    {
        "@timestamp" => 2018-12-06T14:43:50.310Z,
        "@version" => "1",
        "message" => "aaa",
        "host" => "rockybean-MacBook-Pro.local"
    }

    我们再回头看下这个配置,upstreamoutput 使用了名为 pipeline 的 plugin,然后 send_to的输出对象test_output是在 downstreaminput pipeline plugin 中定义的。通过这个唯一的address(虚拟地址)就能够把不同的 pipeline 连接在一起组成一个更长的pipeline来处理数据。类似下图所示:

    当数据由 upstream传递给 downstream时会进行一个复制操作,这也意味着在这两个 pipeline 中的数据是完全独立的,互不影响。有一点要注意的是:数据的复制会增加额外的性能开销,比如会加大 JVM Heap 的使用。

    2. 使用场景

    2.1 Distributor Pattern 分发者模式

    在一个 pipeline 处理输入,然后根据不同的数据类型再分发到对应的 Pipeline 去处理。这种模式的好处在于统一输入端口,隔离不同类型的处理配置文件,减少由于配置文件混合在一起带来的维护成本。大家可以想一想如果不用这种Pipeline-to-Pipeline的方式,我们如果轻松做到一个端口处理多个来源的数据呢?

    这种模式的参考配置如下所示:

    # config/pipelines.yml
    - pipeline.id: beats-server
      config.string: |
        input { beats { port => 5044 } }
        output {
            if [type] == apache {
              pipeline { send_to => weblogs }
            } else if [type] == system {
              pipeline { send_to => syslog }
            } else {
              pipeline { send_to => fallback }
            }
        }
    - pipeline.id: weblog-processing
      config.string: |
        input { pipeline { address => weblogs } }
        filter {
           # Weblog filter statements here...
        }
        output {
          elasticsearch { hosts => [es_cluster_a_host] }
        }
    - pipeline.id: syslog-processing
      config.string: |
        input { pipeline { address => syslog } }
        filter {
           # Syslog filter statements here...
        }
        output {
          elasticsearch { hosts => [es_cluster_b_host] }
        }
    - pipeline.id: fallback-processing
        config.string: |
        input { pipeline { address => fallback } }
        output { elasticsearch { hosts => [es_cluster_b_host] } }

    2.2 Output Isolator Pattern 输出隔离模式

    虽然 Logstash 的一个 pipeline 可以配置多个 output,但是这多个 output 会相依为命,一旦某一个 output 出问题,会导致另一个 output 也无法接收新数据。而通过这种模式可以完美解决这个问题。其运行方式如下图所示:

    通过输出到两个独立的 pipeline,解除相互之间的影响,比如 http service 出问题的时候,es 依然可以正常接收数据,而且两个 pipeline 可以配置独立的队列来保障数据的完备性,其配置如下所示:

    # config/pipelines.yml
    - pipeline.id: intake
      queue.type: persisted
      config.string: |
        input { beats { port => 5044 } }
        output { pipeline { send_to => [es, http] } }
    - pipeline.id: buffered-es
      queue.type: persisted
      config.string: |
        input { pipeline { address => es } }
        output { elasticsearch { } }
    - pipeline.id: buffered-http
      queue.type: persisted
      config.string: |
        input { pipeline { address => http } }
        output { http { } }

    2.3 Forked Path Pattern 克隆路径模式

    这个模式类似 Output Isolator Pattern,只是在不同的 output pipeline 中可以配置不同的 filter 来完成各自输出的数据处理需求,这里就不展开讲了,可以参考如下的配置,其中不同 output pipeline 的 filter 是不同的,比如 partner 这个 pipeline 去掉了一些敏感数据:

    # config/pipelines.yml
    - pipeline.id: intake
      queue.type: persisted
      config.string: |
        input { beats { port => 5044 } }
        output { pipeline { send_to => ["internal-es", "partner-s3"] } }
    - pipeline.id: buffered-es
      queue.type: persisted
      config.string: |
        input { pipeline { address => "internal-es" } }
        # Index the full event
        output { elasticsearch { } }
    - pipeline.id: partner
      queue.type: persisted
      config.string: |
        input { pipeline { address => "partner-s3" } }
        filter {
          # Remove the sensitive data
          mutate { remove_field => 'sensitive-data' }
        }
        output { s3 { } } # Output to partner's bucket

    2.4 Collector Pattern 收集者模式

    从名字可以看出,该模式是将所有 Pipeline 汇集于一处的处理模式,如下图所示:

    其配置参考如下:

    # config/pipelines.yml
    - pipeline.id: beats
      config.string: |
        input { beats { port => 5044 } }
        output { pipeline { send_to => [commonOut] } }
    - pipeline.id: kafka
      config.string: |
        input { kafka { ... } }
        output { pipeline { send_to => [commonOut] } }
    - pipeline.id: partner
      # This common pipeline enforces the same logic whether data comes from Kafka or Beats
      config.string: |
        input { pipeline { address => commonOut } }
        filter {
          # Always remove sensitive data from all input sources
          mutate { remove_field => 'sensitive-data' }
        }
        output { elasticsearch { } }
  • 相关阅读:
    校验XX是否在有效期内
    Thymleaf js直接获取后台传过来的对象或者对象的属性以及map
    H5新特性之data-*
    Thymleaf中th:each标签遍历list如何获取index
    SpringBoot图片上传(三)——调用文件上传项目的方法(同时启动两个项目)
    根据状态码,展示不同的文本,两种方法简单讨论
    列表前台验空的必要性
    thymleaf模板截取日期的年月日,去掉时分秒
    javaWeb锁屏的简单实现
    svn上check下来的项目,用idea打开,菜单栏没有svn工具解决办法
  • 原文地址:https://www.cnblogs.com/fat-girl-spring/p/14313006.html
Copyright © 2011-2022 走看看