背景介紹
隨著業(yè)務(wù)服務(wù)(Server App)逐漸增加,使得問題排查非常困難埠对,很多時候需要關(guān)聯(lián)查詢多個服務(wù)的日志衬以,而且統(tǒng)計分析十分不便译隘。因此,急需設(shè)計一個集中式海量日志實時處理系統(tǒng)。需要滿足功能需求(實時看日志、統(tǒng)計歷史日志、實時行為分析经伙、用戶軌跡跟蹤等)、性能需求(具有高吞吐能力勿锅、高擴(kuò)展性帕膜、高容錯性)等枣氧。
組件介紹
Kafka 是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它適合處理海量日志發(fā)布訂閱垮刹,提供消息磁盤持久化作瞄、支持物理分片存儲、多組消費(fèi)等特性危纫。
Elasticsearch 是一個開源實時分布式搜索引擎宗挥,具備如下特征:零配置,索引自動分片种蝶,索引副本機(jī)制契耿,restful風(fēng)格接口,多數(shù)據(jù)源螃征,自動搜索負(fù)載等搪桂。
Flume 是Apache基金會的一個高可用的,高可靠的盯滚,分布式的海量日志采集踢械、聚合和傳輸?shù)南到y(tǒng),它支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方魄藕,用于收集數(shù)據(jù)内列;同時提供對數(shù)據(jù)進(jìn)行簡單處理,并寫到各種數(shù)據(jù)接受方(可定制)背率。
實現(xiàn)思路
- 開發(fā)業(yè)務(wù)日志SDK(下文為描述方便话瞧,稱之為 BizLogSDK),嵌于各業(yè)務(wù)App寝姿;
- 從業(yè)務(wù)服務(wù)端收集日志并集中輸出到Kafka交排;
- 根據(jù)不同需求(查詢、統(tǒng)計)饵筑,由Flume對數(shù)據(jù)預(yù)處理并分發(fā)埃篓;
- Flume 的下游組件對日志內(nèi)容進(jìn)行消費(fèi);
架構(gòu)設(shè)計
目前日志消費(fèi)方式有兩種:
- Elasticsearch 做索引根资,用于查詢架专、統(tǒng)計;
- 基于Storm流式計算實現(xiàn)(待完成)嫂冻。
引入Kafka的目的:
- 線上業(yè)務(wù)集群規(guī)模較大胶征,日志產(chǎn)生量巨大塞椎,如果直接同步日志對下游服務(wù)負(fù)荷較重桨仿,容易因為故障導(dǎo)致日志阻塞延遲和丟失,所以引入了kafka 案狠;
- 消息可以持久化服傍,并且可以進(jìn)行日志回溯钱雷。有了消息隊列,上游服務(wù)和下游服務(wù)完全解藕吹零,網(wǎng)絡(luò)傳輸會更穩(wěn)定罩抗、更高效、更均衡灿椅,避免級聯(lián)效應(yīng)套蒂。
架構(gòu)說明
- 由于業(yè)務(wù)日志量極大,為減輕業(yè)務(wù)服務(wù)的壓力茫蛹,故將業(yè)務(wù)日志首先輸出到 Kafka 集群操刀;
- Flume 做分發(fā)和預(yù)處理。從Kafka中拉取待處理的業(yè)務(wù)日志婴洼,先在本地保留一份骨坑,然后做預(yù)處理和分發(fā);
- Elasticsearch 做日志索引柬采。對業(yè)務(wù)日志按 Prefix-bizType-YYYY.MM.dd 的格式創(chuàng)建索引欢唾;
- Kibana 做查詢界面與簡單的統(tǒng)計報表。供開發(fā)粉捻、運(yùn)維礁遣、運(yùn)營人員使用;
- Zookeeper 用于維護(hù)Kafka集群配置肩刃。Flume作為Kafka的消費(fèi)者亡脸,需要配置Zookeeper的相關(guān)信息;
- Kibana 的報表展示能力有限树酪,可以在Elasticsearch 下游對接 Grafana或其他工具(架構(gòu)圖中未做描述)浅碾,實現(xiàn)更炫酷的報表;
- 可以根據(jù)業(yè)務(wù)擴(kuò)展需求续语,增加對應(yīng)的 Flume 及處理服務(wù)垂谢,以實現(xiàn)業(yè)務(wù)橫向擴(kuò)展;
- 目前還沒有對業(yè)務(wù)日志做大數(shù)據(jù)分析疮茄,因此架構(gòu)中只做了節(jié)點描述滥朱。
技術(shù)方案
- Flume 1.6增加了 KafkaSource,之前版本需要自己實現(xiàn)(自定義 Source 實現(xiàn)示例)力试;
- Flume 做預(yù)處理和分發(fā)徙邻,需要自定義Sink(自定義Sink實現(xiàn)示例);
- BizLogSDK 的配置中可以添加對Kafka Producer 的配置(Producer Configs)畸裳,以優(yōu)化性能缰犁;
- Elasticsearch 官網(wǎng)的 Java Client 比較重,連接數(shù)太多,建議按照Elasticsearch Reference 自己開發(fā)一個基于HTTP 協(xié)議 的 Client(實現(xiàn)CRUD)帅容,方便業(yè)務(wù)日志按照 biztype-date 格式進(jìn)行索引颇象。注意:HTTP 連接應(yīng)該復(fù)用,(可以采用HttpClient 的連接池管理方式)并徘,避免連接數(shù)過多遣钳;
- Flume Sink 中拿到業(yè)務(wù)日志后,應(yīng)該放到線程池里處理麦乞,避免 Flume卡死蕴茴;
- Elasticsearch 默認(rèn)會將 string 類型字段設(shè)為 _ analyzed _,會造成CPU過高姐直〖隹可以通過 Elasticsearch 提供的 Index Templates 方式,在index 創(chuàng)建后简肴,應(yīng)用 template 到匹配的index晃听,將相關(guān) _ string _ 型字段設(shè)為 _ not_analyzed _。
BizLogSDK :
業(yè)務(wù)App通過調(diào)用 BizLogSDK砰识,將業(yè)務(wù)日志輸出到Kafka集群能扒。BizLogSDK 需要實現(xiàn)設(shè)置公用屬性、擴(kuò)展屬性辫狼,日志發(fā)送等功能初斑。可參考 Log4j 的源碼來實現(xiàn)膨处。
- 業(yè)務(wù)日志公用屬性:
- _ bizType _ :業(yè)務(wù)類型
- _ bizAction _:業(yè)務(wù)操作
- _ serverIp _ :服務(wù)器IP
- _ requestTime _ :請求時間
- 基本配置:
# 隊列名稱
topicName = bizlog-server
# 是否同步發(fā)送消息(異步速度更快)
send.sync = false
# kafka 消息隊列服務(wù)器
bootstrap.servers = 127.0.0.1:9091
實時查詢
實時統(tǒng)計
相關(guān)監(jiān)控
- KafkaOffsetMonitor
-
Elasticsearch Monitor
Elasticsearch 監(jiān)控
后續(xù)改進(jìn)
- BizLogSDK 中需要加入 Log Level见秤;
- 業(yè)務(wù)日志需要一個統(tǒng)一的界面來管理(設(shè)置level、關(guān)閉真椿、刪除鹃答、定期清理等);