一條日誌訊息的現代生活
從一條日誌訊息的角度來巡覽現代分散式系統。
混沌系統往往是不可預測的。在構建像分散式系統這樣複雜的東西時,這一點尤其明顯。如果不加以控制,這種不可預測性會無止境的浪費時間。因此,分散式系統的每個元件,無論多小,都必須設計成以簡化的方式組合在一起。
Kubernetes 為抽象計算資源提供了一個很有前景的模型 —— 但即使是它也必須與其他分散式平臺(如 Apache Kafka)協調一致,以確保可靠的資料傳輸。如果有人要整合這兩個平臺,它會如何運作?此外,如果你通過這樣的系統跟蹤像日誌訊息這麼簡單的東西,它會是什麼樣子?本文將重點介紹來自在 OKD 內執行的應用程式的日誌訊息如何通過 Kafka 進入資料倉儲(OKD 是為 Red Hat OpenShift 提供支援的 Kubernetes 的原初社群發行版)。
OKD 定義的環境
這樣的旅程始於 OKD,因為該容器平臺完全覆蓋了它抽象的硬體。這意味著日誌訊息等待由駐留在容器中的應用程式寫入 stdout 或 stderr 流。從那裡,日誌訊息被容器引擎(例如 CRI-O)重定向到節點的檔案系統。
在 OpenShift 中,一個或多個容器封裝在稱為 pod(豆莢)的虛擬計算節點中。實際上,在 OKD 中執行的所有應用程式都被抽象為 pod。這允許應用程式以統一的方式操縱。這也大大簡化了分散式元件之間的通訊,因為 pod 可以通過 IP 地址和負載均衡服務進行系統定址。因此,當日志訊息由日誌收集器應用程式從節點的檔案系統獲取時,它可以很容易地傳遞到在 OpenShift 中執行的另一個 pod 中。
在豆莢裡的兩個豌豆
為了確保可以在整個分散式系統中四處傳播日誌訊息,日誌收集器需要將日誌訊息傳遞到在 OpenShift 中執行的 Kafka 叢集資料中心。通過 Kafka,日誌訊息可以以可靠且容錯的方式低延遲傳遞給消費應用程式。但是,為了在 OKD 定義的環境中獲得 Kafka 的好處,Kafka 需要完全整合到 OKD 中。
執行 Strimzi 操作子將所有 Kafka 元件例項化為 pod,並將它們整合在 OKD 環境中執行。 這包括用於排隊日誌訊息的 Kafka 代理,用於從 Kafka 代理讀取和寫入的 Kafka 聯結器,以及用於管理 Kafka 叢集狀態的 Zookeeper 節點。Strimzi 還可以將日誌收集器例項化兼做 Kafka 聯結器,允許日誌收集器將日誌訊息直接提供給在 OKD 中執行的 Kafka 代理 pod。
在 OKD 內的 Kafka
當日志收集器 pod 將日誌訊息傳遞給 Kafka 代理時,收集器會寫到單個代理分割槽,並將日誌訊息附加到該分割槽的末尾。使用 Kafka 的一個優點是它將日誌收集器與日誌的最終目標分離。由於解耦,日誌收集器不關心日誌最後是放在 Elasticsearch、Hadoop、Amazon S3 中的某個還是全都。Kafka 與所有基礎設施連線良好,因此 Kafka 聯結器可以在任何需要的地方獲取日誌訊息。
一旦寫入 Kafka 代理的分割槽,該日誌訊息就會在 Kafka 叢集內的跨代理分割槽複製。這是它的一個非常強大的概念;結合平臺的自愈功能,它建立了一個非常有彈性的分散式系統。例如,當節點變得不可用時,(故障)節點上執行的應用程式幾乎立即在健康節點上生成。因此,即使帶有 Kafka 代理的節點丟失或損壞,日誌訊息也能保證存活在儘可能多的節點上,並且新的 Kafka 代理將快速原位取代。
儲存起來
在日誌訊息被提交到 Kafka 主題後,它將等待 Kafka 聯結器使用它,該聯結器將日誌訊息中繼到分析引擎或日誌記錄倉庫。在傳遞到其最終目的地時,可以分析日誌訊息以進行異常檢測,也可以查詢日誌以立即進行根本原因分析,或用於其他目的。無論哪種方式,日誌訊息都由 Kafka 以安全可靠的方式傳送到目的地。
OKD 和 Kafka 是正在迅速發展的功能強大的分散式平臺。建立能夠在不影響效能的情況下抽象出分散式計算的複雜特性的系統至關重要。畢竟,如果我們不能簡化單一日誌訊息的旅程,我們怎麼能誇耀全系統的效率呢?
via: https://opensource.com/article/18/9/life-log-message
作者:Josef Karásek 選題:lujun9972 譯者:wxy 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- Yii2 log 模組,訊息日誌
- After Effects出現“最後日誌訊息報警”該怎麼解決
- Beego框架的一條神祕日誌引發的思考Go框架
- After Effects報警 最後日誌訊息是: GPU Sniffer 10GPU
- 使用Mac通知中心,生活訊息一眼看盡!Mac
- 一個實用的rust日誌板條箱,灰常好用Rust
- MySQL日誌(一條sql更新語句是如何執行的)MySql
- 另一種列印輸出日誌資訊的方式
- 直播原始碼網站,訊息圖示在收到訊息時展示訊息條數原始碼網站
- 工作總結!日誌列印的11條建議
- 新一代日誌型系統在 SOFAJRaft 中的應用Raft
- 02 | 日誌系統:一條SQL更新語句是如何執行的?SQL
- 開發一個現代化的.NetCore控制檯程式,包含依賴注入/配置/日誌等要素NetCore依賴注入
- 如何實現一個高效的本地日誌收集程式
- SpringBoot日誌實現Spring Boot
- 掌握Rabbitmq幾個重要概念,從一條訊息說起MQ
- 如何解決After Effects報警最後日誌訊息是: GPU Sniffer 10的問題GPU
- 系統日誌中出現大量的truncating integer value to 32 bits資訊
- 一體化汙水處理裝置對現代生活的影響ZVF
- update操作會產生幾條mlog$日誌?
- Web 前端開發日誌(四):構建現代化 Node 應用Web前端
- 國服新訊息!《英雄聯盟手遊》最新開發者日誌釋出
- 下一代分散式訊息佇列Apache Pulsar從入門到實現分散式佇列Apache
- PHP基於Redis訊息佇列實現的訊息推送的方法PHPRedis佇列
- Facebook :WhatsApp日活躍使用者超4.5億 每日發訊息650億條APP
- 歷史性突破:使用 .net core 日處理訊息量超過 1.7 萬條!
- Spring AOP實現統一日誌輸出Spring
- Monaco Editor 實現一個日誌檢視器
- Kafka與ELK實現一個日誌系統Kafka
- 如何優雅的實現訊息通訊?
- go開發屬於自己的日誌庫-檔案日誌庫實現Go
- SpringBoot | SpringBoot 是如何實現日誌的?Spring Boot
- 分散式 | DBLE 的 general 日誌實現分散式
- Ifood如何使用Golang實現每天消耗超過10億條 Kafka 訊息GolangKafka
- 一個完整的go 日誌元件Go元件
- go 開發屬於自己的日誌庫-檔案日誌庫原型實現Go原型
- 解決 AS 3.1.0 版本 Logcat 合併多條日誌的問題GC
- Kafka是如何處理Netflix每天2萬億條訊息的?Kafka