Logstash 與 Kafka
1. 概述
Logstash 和 Kafka 是兩個管理即時資料流的強大工具。 Kafka 是一個出色的分散式事件流平台,而 Logstash 是一個資料處理管道,用於攝取、過濾資料並將資料轉發到各種輸出。
在本教程中,我們將更詳細地研究 Kafka 和 Logstash 之間的區別,並提供它們的用法範例。
2. 要求
在了解 Logstash 和 Kafka 之間的差異之前,讓我們確保已經安裝了一些先決條件以及所涉及技術的基本知識。首先,我們需要安裝Java 8或更高版本。
Logstash 是ELK 堆疊(Elasticsearch、Logstash、Kibana)的一部分,但可以獨立安裝和使用。對於 Logstash,我們可以訪問官方 Logstash 下載頁面並下載適合我們作業系統(Linux、macOS 或 Windows)的軟體包。
我們還需要安裝 Kafka,並對我們對發布者-訂閱者模型的理解有信心。
3. 日誌存儲
讓我們看看主要的 Logstash 元件和處理日誌檔案的命令列範例。
3.1. Logstash 元件
Logstash 是 ELK Stack 中的一個開源資料處理管道,用於收集、處理和轉發來自多個來源的資料。它由幾個核心組件組成,這些組件協同工作來收集、轉換和輸出資料:
- 輸入:這些將資料從各種來源引入 Logstash,例如日誌檔案、資料庫、Kafka 等訊息佇列或雲端服務。輸入定義原始資料的來源。
- 過濾器:這些元件處理和轉換資料。常見的過濾器包括用於解析非結構化資料的Grok 、用於修改欄位的 mutate 以及用於時間戳格式化的 date。過濾器允許在將資料發送到最終目的地之前進行深度自訂和資料準備。
- 輸出:處理後,輸出將資料傳送到目的地,例如 Elasticsearch、資料庫、訊息佇列或本機檔案。 Logstash 支援多個平行輸出,非常適合將資料分發到各個端點。
- 編解碼器:編解碼器對資料流進行編碼和解碼,例如將 JSON 轉換為結構化物件或讀取純文字。它們充當迷你插件,在攝取或發送資料時處理資料。
- 管道:管道是透過輸入、過濾器和輸出定義的資料流。管道可以創建複雜的工作流程,從而實現多個階段的資料處理。
這些元件協同工作,使 Logstash 成為集中日誌、轉換資料以及與各種外部系統整合的強大工具。
3.2. Logstash 範例
讓我們舉一個例子來說明如何將輸入檔處理為 JSON 格式的輸出。讓我們在/tmp
目錄中建立一個example.log
輸入檔:
2024-10-12 10:01:15 INFO User login successful
2024-10-12 10:05:32 ERROR Database connection failed
2024-10-12 10:10:45 WARN Disk space running low
然後我們可以透過提供配置來運行logstash -e
命令:
$ sudo logstash -e '
input {
file {
path => "/tmp/example.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
}
mutate {
remove_field => ["log", "timestamp", "event", "@timestamp"]
}
}
output {
file {
path => "/tmp/processed-logs.json"
codec => json_lines
}
}'
讓我們解釋一下配置的不同部分:
- 整個命令鏈(
input
/filter
/output
)是一個管道。 - 使用
grok
過濾器從日誌中提取時間戳記、日誌等級和訊息欄位。 - 使用
mutate
過濾器刪除不必要的資訊。 - 在
output
過濾器中套用帶有 Codec 的 JSON 格式。 - 處理輸入
example.log
檔案後,輸出將以 JSON 格式編碼在processed-log.json
檔案中。
讓我們來看一個輸出範例:
{"message":["2024-10-12 10:05:32 ERROR Database connection failed","Database connection failed"],"host":{"name":"baeldung"},"@version":"1"}
{"message":["2024-10-12 10:10:45 WARN Disk space running low","Disk space running low"],"host":{"name":"baeldung"},"@version":"1"}
{"message":["2024-10-12 10:01:15 INFO User login successful","User login successful"],"host":{"name":"baeldung"},"@version":"1"}
正如我們所看到的,輸出檔案是帶有附加資訊的 JSON,例如@version,
我們可以使用它來記錄變更並確保任何下游進程(如 Elasticsearch 中的查詢)都知道它以維護資料一致性。
4.卡夫卡
讓我們來看看主要的 Kakfa 元件以及發布和使用訊息的命令列範例。
4.1.卡夫卡組件
Apache Kafka 是一個開源分散式事件流平台,用於建立即時資料管道和應用程式。
讓我們來看看它的主要組成部分:
- 主題和分區:Kafka 將訊息組織成稱為主題的類別。每個主題都分為多個分區,允許資料在多個伺服器上並行處理。例如,在電子商務應用程式中,您可能有訂單資料、付款交易和使用者活動日誌的單獨主題。
- 生產者和消費者:生產者將資料(訊息)發佈到 Kafka 主題,而消費者是讀取和處理這些訊息的應用程式或服務。生產者將資料推送到 Kafka 的分散式代理,確保可擴展性,而消費者可以訂閱主題並從特定分區讀取訊息。 Kafka 保證消費者會依序讀取每個訊息。
- Brokers :Kafka Brokers 是儲存和管理主題分區的伺服器。多個broker組成一個Kafka集群,負責分發資料並保證容錯。如果一個代理程式發生故障,其他代理程式將接管數據,從而提供高可用性。
- Kafka Streams 和 Kafka Connect :Kafka Streams 是一個強大的串流處理庫,允許直接從 Kafka 主題進行即時資料處理。因此,它使應用程式能夠動態處理和轉換數據,例如計算即時分析或檢測金融交易中的模式。另一方面,Kafka Connect簡化了Kafka與外部系統的整合。它提供用於整合資料庫、雲端服務和其他應用程式的連接器。
- ZooKeeper 和 KRaft :傳統上,Kafka 使用 ZooKeeper 進行分散式設定管理,包括管理代理元資料和分區複製的領導者選舉。隨著 KRaft (Kafka Raft) 的引入,Kafka 現在支援無 ZooKeeper 架構,但 ZooKeeper 仍然在許多設定中普遍使用。
這些元件共同使 Kafka 能夠提供可擴展、容錯的分散式訊息傳遞平台,可以處理大量流資料。
4.2.卡夫卡範例
讓我們創建一個主題,發布一條簡單的「Hello, World」訊息並使用它。
首先,我們創建一個主題。它可以屬於多個分區,通常代表我們網域的一個主題:
$ /bin/kafka-topics.sh \
--create \
--topic hello-world \
--bootstrap-server localhost:9092 \
--partitions 1 \
--replication-factor 1
我們會收到主題創建的訊息:
$ Created topic hello-world.
現在讓我們嘗試向該主題發送訊息:
$ /bin/kafka-console-producer.sh \
--topic hello-world \
--bootstrap-server localhost:9092 \
<<< "Hello, World!"
現在,我們可以使用我們的訊息:
$ /bin/kafka-console-consumer.sh \
--topic hello-world \
--from-beginning \
--bootstrap-server localhost:9092
我們將從 Kafka 日誌儲存中取得該特定主題的訊息,方法是使用它們:
Hello, World!
5.Logstash和Kafka之間的核心區別
Logstash 和 Kafka 是現代資料處理架構不可或缺的組成部分,各自發揮獨特但互補的作用。
5.1.日誌儲存
Logstash 是一個開源資料處理管道,專門負責提取資料、轉換資料並將結果發送到各種輸出。它的優勢在於其解析和豐富資料的能力,使其成為處理日誌和事件資料的理想選擇。
例如,一個典型的用例可能涉及一個 Web 應用程序,其中 Logstash 從多個伺服器取得日誌。然後,它應用過濾器來提取相關字段,例如時間戳記和錯誤訊息。最後,它將這些豐富的數據轉發到 Elasticsearch,在 Kibana 中進行索引和視覺化,以監控應用程式效能並診斷即時問題。
5.2.卡夫卡
相較之下,Kafka 是一個分散式串流平台,擅長處理高吞吐量、容錯和即時資料流。它充當訊息代理,促進記錄流的發布和訂閱。
例如,在電子商務架構中,Kafka可以從各種服務中擷取使用者活動事件,例如網站點擊、購買和庫存更新。這些事件可以產生 Kafka 主題,允許多個下游服務(如推薦引擎、分析平台和通知系統)即時使用資料。
5.3.差異
Logstash 專注於資料轉換、豐富原始日誌並將其發送到各個目的地,而 Kafka 則強調可靠的訊息傳遞和串流處理,允許跨不同系統的即時資料流。
讓我們看看主要區別:
特徵 | 日誌儲存 | 卡夫卡 |
---|---|---|
主要目的 | 日誌和事件資料的資料收集、處理和轉換管道 | 用於即時資料流的分散式訊息代理 |
建築學 | 基於插件的管道,具有輸入、過濾器和輸出來處理資料流 | 基於集群,生產者和消費者透過 Brokers 和 Topic 進行交互 |
訊息保留 | 即時處理數據,一般不會永久儲存數據 | 將訊息儲存可設定的保留期限,從而可以重播訊息 |
資料攝取 | 使用多個輸入插件從多個來源(日誌、檔案、資料庫等)取得數據 | 以可擴展的分散式方式從生產者處獲取大量數據 |
資料轉換 | 使用 grok、mutate 和 GeoIP 等過濾器進行強大的資料轉換 | 有限的資料轉換(通常在下游系統中完成) |
訊息傳遞保證 | 以流的方式處理資料;沒有用於訊息保證的內建傳遞語義 | 支持傳遞語意:至少一次、最多或恰好一次 |
整合焦點 | 主要整合各種資料來源,轉發到Elasticsearch、資料庫、檔案等儲存/監控系統 | 主要整合分散式資料流系統和分析平台 |
典型用例 | 集中記錄、資料解析、轉換和即時系統監控 | 事件驅動架構、流分析、分散式日誌記錄和資料管道 |
它們共同使組織能夠建立強大的資料管道,促進即時洞察和決策,展示它們在不斷發展的資料架構領域中的關鍵作用。
6.Logstash和Kafka可以一起工作嗎?
Logstash 和 Kafka 可以無縫協作創建強大的資料處理管道,結合各自的優勢來增強資料攝取、處理和交付。
6.1.來自 Logstash
例如,Logstash 可以充當資料收集器和處理器,攝取各種資料來源(例如日誌、指標和事件),然後轉換這些資料以適應特定的格式或模式。例如,在微服務架構中,Logstash 可以從各種微服務收集日誌,應用過濾器提取相關信息,然後將結構化數據轉發到 Kafka 主題進行進一步處理。
6.2.致卡夫卡
一旦資料進入 Kafka,它就可以被需要即時處理和分析的多個應用程式和服務使用。例如,金融機構可以使用 Kafka 從其支付處理系統傳輸交易數據,各種應用程式(包括詐欺偵測系統、分析平台和報告工具)都可以使用這些數據。
6.3. LogStash 與 Kafka
Logstash 有助於日誌和事件的初始攝取和轉換。同時,Kafka 是一個可擴展、容錯的訊息傳遞主幹,可確保跨架構的可靠資料交付。
透過整合 Logstash 和 Kafka,組織可以建立強大而靈活的數據管道,有效處理大量數據,從而實現即時分析和洞察。這種協作允許資料攝取與處理分離,從而促進資料架構內的可擴展性和彈性。
七、結論
在本教程中,我們透過提供架構和命令列範例了解了 Logstash 和 Kafka 的工作原理。我們了解了它們的主要用途,並透過描述它們的主要組件來描述了它們的最佳實際用途。最後,我們看到了這兩個系統之間的主要區別以及它們如何協同工作。