2017-02-06 26 views
0

我有一個SQL數據庫Elasticsearch管道,看起來像下面這樣:利用SQL數據庫多線程和logstash聚集過濾

  1. 輸入logstash輸入-JDBC
  2. 各種過濾和變異各個事件的
  3. 事件被根據GROUP_ID屬性使用logstash濾波器骨料聚集
  4. 集合體事件輸出使用logstash - 輸出 - elasticsearch
  5. 到Elasticsearch

正因爲如此,這條管線的吞吐量是相當低的。我知道這是由於聚合步驟(它執行一些相對較重的處理),並且我想使用幾個線程/進程來提高性能(允許我使用多個核心)。

但是,logstash-filter-aggregate插件不支持多個篩選器工作人員 - 大概是因爲它無法保證應該組合爲一個集合事件的事件將由同一個工作人員處理。

我目前的解決方案是其中每個實例選擇從SQL數據庫group_ids的某個子集運行logstash的幾個實例。但是,這有很多開銷。有沒有更好的方法使用logstash-filter-aggregate使用多個核心?

回答

1

你是有點洞,那裏。 Aggregate是需要序列化事件流的過濾器之一,因爲它認爲需要的狀態是一個或多個事件。無論何時您需要序列化,您的吞吐量將僅限於單個核心,以確保過濾器工作人員能夠看到所需的所有事件。與數據庫一樣,解決這個問題的方法是分割數據集。你已經發現了。

真的,分片是最好的單級logstash解決了這個問題。

有一個多級的解決方案,如果你想去那裏。那是建立第二條管道。它的工作是這樣的:

  1. 第一管道攝取事件和標記了相關的事件相關,但不執行聚集。
  2. 如您一樣,第一個管道輸出至elasticsearch
  3. 二管道使用elasticsearch輸入來查詢,看上去就像他們是未聚集事件的事件。
  4. 聚合層聚合完成的事件(包含它們的所有部分)
  5. 將聚合事件刷新到Elasticsearch。

或者,您也可以使用非logstash方法,一旦它在ElasticSearch執行聚合。

+0

感謝您的建議。我想我所希望的是在單個logstash實例中執行分片的方法,但這似乎不可行。 – haroba