Stories

Detail Return Return

雲環境中的日誌收集和處理方案 - Stories Detail

在雲環境中,高效的日誌收集與處理是系統監控和運維的關鍵。本文圍繞《雲環境中的日誌收集和處理方案》展開,先介紹日誌收集的兩種方式,再聚焦處理環節,探討寫入 kafka、共享存儲、S3 等路徑,分析使用 raft 組日誌集羣及 NewSQL 的方案,最後結合 Spark 端調度進行總結,為雲日誌管理提供多維度技術參考。

日誌收集-兩種方式

這裏是將pod中的日誌收集,放到一個指定的地方
首先是將程序中的日誌能採集到,大致有兩種方式通過插件將日誌重定向到指定目的地用輔助程序採集pod中日誌,並重定向兩種方式處理如下都是將日誌寫到一個指定的地方區別是由程序本身去做,還是由額外的程序去捕獲
圖片
日誌擴展比如 log4j,需要實現一個自定義的 appender修改配置文件,用 log4j 的自定義擴展,寫入指定的目的地配置如下:
圖片
對於應用程序來説,需要增加一些啓動參數記錄角色, -Drole=spark,或者 flink記錄 application_id、executor_id以及路徑前綴(將日誌寫入到哪裏)注意這種模式下,一般需要將日誌寫入到 NFS 這種共享存儲當程序退出後,在這個目錄下寫一個標誌文件,表示文件退出了當然,程序啓動的時候,如果有這個標誌文件,需要先清理掉對於 System.out 和 err ,需要做重定向

處理日誌-寫 kafka

這裏是將日誌通過插件寫入到kafka
log-service消費kafka,將日誌寫入到內部的buffer後面有 writer 寫入到 NFS,注意這裏還要有 ack 機制其他還有 日誌定期清理日誌,遷移到 s3 模塊
圖片
log-sumer從kafka 讀取日誌,寫入到內部的 channel 中這裏的 channel 可以做限流,記錄等額外的功能之後有另外一個 writer 負責讀取 channel,將日誌寫入 NFS同時還需要做日誌輪轉處理,以及 遷移到 s3
圖片

處理日誌-直接寫共享存儲

跟第一種差不多,但是少了 kafka 的處理部分
log-service有一個日誌查詢服務,用户可以通過 application_id 來查詢日誌文件內容為了解決單個目錄下小文件過多問題,需要增加一個 hash 前綴可以設置為 20,003,這是一個質數,也就是一個目錄下最多有2W文件目錄為: hash/application_id/executor_id/xx.loghash 最多2W個,一天產生 10W個應用,算算可以用幾十年了
圖片
日誌清理一個日誌清理模塊,可以清理disk,NFS以及清理策略,根據時間戳,可以目錄下是否包括一個 標誌文件來清理比如: /data/spark/cluster_logs/14937/app-12345/executor-17路徑前綴是:/data/spark/cluster_logs,產生了 14937 這個 hash 目錄然後是 app-12345,清理程序根據app-12345 是否空了,來決定是否刪除 app-12345同樣邏輯,清理下面的 driver 和 executor最後將日誌複製到 S3、或者 minio;這裏需要先複製到 s3,再清理如果複製成功,沒刪除,下一次處理的時候會覆蓋 s3並清理文件最後刪除目錄下的標誌文件
圖片
多個節點處理為防止日誌太多單個節點處理不過來,可以啓動多個節點但多個節點可能會重複處理一個文件,所以每個節點處理前先獲取文件列表,然後 shuffle一次,這樣每個節點處理的目錄就不一樣了,這種方式最簡單也可以將文件寫入 紅黑樹,然後轉換成 一致性hash 的環形根據當前的節點 hash,定位到環的一個為止,然後順時針處理,這樣每段由不同節點處理雖然每個節點都遍歷了全部目錄,但是非自己處理的基本都是空的(被別人處理過了),所以效率會提升

直接寫 S3

這種方式比較簡單日誌直接寫入到 s3,但是會產生很多小文件需要定期將小文件合併同理提供query 服務,可以查詢 s3 上的日誌文件這裏查詢的話會麻煩一些了,可能需要查多個 日誌小文件
圖片

使用raft 組日誌集羣

這裏不需要寫 共享存儲日誌寫入到 log-service,這是包含一主-兩從的三節點服務通過 raft 實現強一致,主從同步,當主節點掛了,從節點晉升為主節點這種方式不需要共享存儲了,直接寫本地磁盤就行了,三副本保證高可用同時定期寫 s3,這種方式需要處理好選主,可以用 apache 的 raft 實現
圖片

使用 NewSQL

使用 newsql比如寫入到 TiDB,mysql或者寫入到 ES,直接用這個中間設備做查詢,還可以做模糊匹配查詢這種模式的查詢能力強了,但是強依賴了一箇中間件同樣也需要定期寫入到 s3
圖片

總結-Spark端

一個完整的 spark-submit 參數:
圖片
Spark 的 driver 和 executor 都需要設置一些 ENV 參數:
SPARK_EXECUTOR_ID ,driver端需要手動設置,executor 是自動設置上的
SPARK_APPLICATION_ID ,driver 和 executor 都是自動設置上的
SPARK_PREFIX_DIR ,driver 和 executor 都需要手動設置上

user avatar edonsoft Avatar mimangdeyangcong Avatar
Favorites 2 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.