Logstash Multiple Pipelines

做爲生產者和消費者之間數據流的一箇中心組件,須要一個 Logstash 實例負責驅動多個並行事件流的狀況。默認狀況下,這樣的使用場景的配置讓人並不太開心,使用者會遭遇所謂的條件地獄(Conditional hell)。由於每一個單獨的 Logstash 實例默認支持一個管道,該管道由一個輸入、若干個過濾器和一個輸出組成,若是要處理多個數據流,就要處處使用條件判斷。html

條件地獄(Conditional hell)

已知的在一個管道中實現多個獨立流的方法是使用條件判斷。主要方式是在輸入部分經過標籤標記事件,而後在過濾器中和輸出階段建立條件分支,對貼有不一樣標籤的事件,應用不一樣的插件集。這種方式雖然能夠解決問題,但在實際的使用中卻很是的痛苦!下面是一個簡單的 demo 片斷:apache

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 { ... } } }

對應的 Logstash 管道配置已經被條件語句包裹的十分臃腫,而它們的惟一目的是保持流的獨立性。
雖然使用條件實現獨立的多個流是可行的,可是很容易看出,因爲存在單個管道和處理的單個階段,隨着複雜性的增長,配置會變得很是冗長,很難管理。下圖展現了包含兩個流的簡單管道:elasticsearch

不幸的是,這並非該方案的惟一缺陷。tcp

缺少擁塞隔離

若是您熟悉 Logstash 的工做原理,就會知道管道的輸出部分接收到一批事件,而且在全部事件和完成全部輸出以前不會移動到下一批事件。這意味着,對於上面的管道,若是 TCP 套接字目標不可達,Logstash將不會處理其餘批次的事件,這也就意味着 Elasticsearch 將不會接收事件,而且會對 TCP 輸入和 Beats 輸入施加反壓力。ide

不一樣的數據流須要以不一樣的方式處理

若是 TCP - > Grok - > TCP 數據流處理大量的小數據,而 Beats -> Dissect -> ES 數據流中的單個數據體積大可是數量少。那麼前一個數據流但願有多個 worker 並行並其每一批次處理更多事件,第二個數據流則指望使用少許的 worker 和每批次處理少許的事件。使用單個管道,沒法爲單個數據流指定獨立的管道配置。ui

經過多個 Logstash 實例解決問題

上述問題能夠經過在同一臺機器上運行多個 Logstash 實例來解決,而後能夠獨立地管理這些實例。可是即便這樣的解決方案也會產生其餘問題:spa

  • 須要管理多個實例(經過 init 系統管理多個後臺服務)
  • 每一個 Logstash 的實例也意味着一個獨立的 JVM
  • 須要監視每一個 Logstash 實例

這種方式其實很糟糕!插件

多個管道

從 Logstash 6.0 開始,引入了 Multiple Pipelines,才完美的解決了這個問題。Multiple Pipelines 的配置很是簡單:在配置文件  pipelines.yml 中添加新的 pipeline 配置並指定其配置文件就能夠了。下面是一個簡單的 demo 配置:code

- 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 {} }"

這個 YAML 文件包含一個散列(或字典)列表,其中每一個散列表示一個管道,鍵和值爲該管道設置名稱。被省略的設置值返回到它們的默認值。htm

配置多個管道

下面來看一個真實點的例子,筆者在 Ubuntu 18.04 Server 中安裝了 Logstash 6.2.4,除了在默認的配置文件目錄(/etc/logstash/conf.d)中添加配置文件外,建立新的目錄 /etc/logstash/myconf.d,並在 /etc/logstash/myconf.d 目錄下建立 Logstash 配置文件 krtest.conf。而後在 /etc/logstash/pipelines.yml 文件中添加新的 pipeline 配置:

- pipeline.id: main
  path.config: "/etc/logstash/conf.d/*.conf"
- pipeline.id: krtest path.config: "/etc/logstash/myconf.d/krtest.conf"

其中 pipeline.id 爲 main 的管道是默認的配置,咱們新添加了 id 爲 krtest 的管道並指定了對應的配置文件路徑。啓動 Logstash,若是你安裝的 X-Pack 插件就能夠在 Kibana->Monitoring->Logstash 中看到新添加的名稱爲 krtest 的管道:

使用 Multiple Pipelines 後,咱們的 Logstash 配置文件就能夠寫得像下面的代碼同樣簡練(再也不須要那麼多的條件語句)了:

input { beats { port => 5064 } } filter { grok { ... } } output { elasticsearch { ... } }

參考:
Multiple Pipelines
Introducing Multiple Pipelines in Logstash

相關文章
相關標籤/搜索