背景介紹
隨著業務服務(Server App)逐漸增加,使得問題排查非常困難,很多時候需要關聯查詢多個服務的日志,而且統計分析十分不便。因此,急需設計一個集中式海量日志實時處理系統。需要滿足功能需求(實時看日志、統計歷史日志、實時行為分析、用戶軌跡跟蹤等)、性能需求(具有高吞吐能力、高擴展性、高容錯性)等。
組件介紹
Kafka 是一種高吞吐量的分布式發布訂閱消息系統,它適合處理海量日志發布訂閱,提供消息磁盤持久化、支持物理分片存儲、多組消費等特性。
Elasticsearch 是一個開源實時分布式搜索引擎,具備如下特征:零配置,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
Flume 是Apache基金會的一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸的系統,它支持在日志系統中定制各類數據發送方,用于收集數據;同時提供對數據進行簡單處理,并寫到各種數據接受方(可定制)。
實現思路
- 開發業務日志SDK(下文為描述方便,稱之為 BizLogSDK),嵌于各業務App;
- 從業務服務端收集日志并集中輸出到Kafka;
- 根據不同需求(查詢、統計),由Flume對數據預處理并分發;
- Flume 的下游組件對日志內容進行消費;
架構設計
業務日志服務架構.png
目前日志消費方式有兩種:
- Elasticsearch 做索引,用于查詢、統計;
- 基于Storm流式計算實現(待完成)。
引入Kafka的目的:
- 線上業務集群規模較大,日志產生量巨大,如果直接同步日志對下游服務負荷較重,容易因為故障導致日志阻塞延遲和丟失,所以引入了kafka ;
- 消息可以持久化,并且可以進行日志回溯。有了消息隊列,上游服務和下游服務完全解藕,網絡傳輸會更穩定、更高效、更均衡,避免級聯效應。
架構說明
- 由于業務日志量極大,為減輕業務服務的壓力,故將業務日志首先輸出到 Kafka 集群;
- Flume 做分發和預處理。從Kafka中拉取待處理的業務日志,先在本地保留一份,然后做預處理和分發;
- Elasticsearch 做日志索引。對業務日志按 Prefix-bizType-YYYY.MM.dd 的格式創建索引;
- Kibana 做查詢界面與簡單的統計報表。供開發、運維、運營人員使用;
- Zookeeper 用于維護Kafka集群配置。Flume作為Kafka的消費者,需要配置Zookeeper的相關信息;
- Kibana 的報表展示能力有限,可以在Elasticsearch 下游對接 Grafana或其他工具(架構圖中未做描述),實現更炫酷的報表;
- 可以根據業務擴展需求,增加對應的 Flume 及處理服務,以實現業務橫向擴展;
- 目前還沒有對業務日志做大數據分析,因此架構中只做了節點描述。
技術方案
- Flume 1.6增加了 KafkaSource,之前版本需要自己實現(自定義 Source 實現示例);
- Flume 做預處理和分發,需要自定義Sink(自定義Sink實現示例);
- BizLogSDK 的配置中可以添加對Kafka Producer 的配置(Producer Configs),以優化性能;
- Elasticsearch 官網的 Java Client 比較重,連接數太多,建議按照Elasticsearch Reference 自己開發一個基于HTTP 協議 的 Client(實現CRUD),方便業務日志按照 biztype-date 格式進行索引。注意:HTTP 連接應該復用,(可以采用HttpClient 的連接池管理方式),避免連接數過多;
- Flume Sink 中拿到業務日志后,應該放到線程池里處理,避免 Flume卡死;
- Elasticsearch 默認會將 string 類型字段設為 _ analyzed _,會造成CPU過高。可以通過 Elasticsearch 提供的 Index Templates 方式,在index 創建后,應用 template 到匹配的index,將相關 _ string _ 型字段設為 _ not_analyzed _。
BizLogSDK :
業務App通過調用 BizLogSDK,將業務日志輸出到Kafka集群。BizLogSDK 需要實現設置公用屬性、擴展屬性,日志發送等功能。可參考 Log4j 的源碼來實現。
- 業務日志公用屬性:
- _ bizType _ :業務類型
- _ bizAction _:業務操作
- _ serverIp _ :服務器IP
- _ requestTime _ :請求時間
- 基本配置:
# 隊列名稱
topicName = bizlog-server
# 是否同步發送消息(異步速度更快)
send.sync = false
# kafka 消息隊列服務器
bootstrap.servers = 127.0.0.1:9091
實時查詢
查詢界面
實時統計
統計界面 1
統計界面 2
相關監控
- KafkaOffsetMonitor
Kafka隊列監控
-
Elasticsearch Monitor
Elasticsearch 監控
后續改進
- BizLogSDK 中需要加入 Log Level;
- 業務日志需要一個統一的界面來管理(設置level、關閉、刪除、定期清理等);