上一篇中咱們介紹了爲何須要一個日誌系統、爲何雲原生下的日誌系統如此重要以及雲原生下日誌系統的建設難點,相信DevOps、SRE、運維等同窗看了是深有體會的。本篇文章單刀直入,會直接跟你們分享一下如何在雲原生的場景下搭建一個靈活、功能強大、可靠、可擴容的日誌系統。算法
需求驅動架構設計
技術架構,是將產品需求轉變爲技術實現的過程。對於全部的架構師而言,可以將產品需求分析透徹是很是基本也是很是重要的一點。不少系統剛建成沒多久就要被推翻,最根本的緣由仍是沒有解決好產品真正的需求。安全
我所在的日誌服務團隊在日誌這塊有近10年的經驗,幾乎服務阿里內部全部的團隊,涉及電商、支付、物流、雲計算、遊戲、即時通信、IoT等領域,多年來的產品功能的優化和迭代都是基於各個團隊的日誌需求變化。架構
有幸咱們最近幾年在阿里雲上實現了產品化,服務了數以萬計的企業用戶,包括國內各大直播類、短視頻、新聞媒體、遊戲等行業Top1互聯網客戶。產品功能從服務一個公司到服務上萬家公司會有質的差異,上雲促使咱們更加深刻的去思考:究竟哪些功能是日誌這個平臺須要去爲用戶去解決的,日誌最核心的訴求是什麼,如何去知足各行各業、各類不一樣業務角色的需求...併發
需求分解與功能設計
上一節中咱們分析了公司內各個不一樣角色對於日誌的相關需求,總結起來有如下幾點:框架
- 支持各類日誌格式、數據源的採集,包括非K8s
- 可以快速的查找/定位問題日誌
- 可以將各類格式的半結構化/非結構化日誌格式化,並支持快速的統計分析、可視化
- 支持經過日誌進行實時計算並得到一些業務指標,並支持基於業務指標實時的告警(其實本質就是APM)
- 支持對於超大規模的日誌進行各類維度的關聯分析,可接受必定時間的延遲
- 可以便捷的對接各類外部系統或支持自定義的獲取數據,例如對接第三方審計系統
- 可以基於日誌以及相關的時序信息,實現智能的告警、預測、根因分析等,並可以支持自定義的離線訓練方式以得到更好的效果
爲知足上述這些功能需求,日誌平臺上必須具有的功能功能模塊有:運維
- 全方位日誌採集,支持DaemonSet、Sidecar各類採集方式以應對不一樣的採集需求,同時支持Web、移動端、IoT、物理機/虛擬機各類數據源的採集;
- 日誌實時通道,這個是爲了對接上下游所必備的功能,保證日誌可以被多種系統所便捷的使用;
- 數據清洗(ETL: Extract,Transform,Load),對各類格式的日誌進行清洗,支持過濾、富化、轉換、補漏、分裂、聚合等;
- 日誌展示與搜索,這是全部日誌平臺必須具有的功能,可以根據關鍵詞快速的定位到日誌並查看日誌上下文,看似簡單的功能卻最難作好;
- 實時分析,搜索只能完成一些定位到問題,而分析統計功能能夠幫助快速分析問題的根因,同時能夠用於快速的計算一些業務指標;
- 流計算,一般咱們都會使用流計算框架(Flink、Storm、Spark Stream等)來計算一些實時的指標或對數據進行一些自定義的清洗等;
- 離線分析,運營、安全相關的需求都須要對大量的歷史日誌進行各類維度的關聯計算,目前只有T+1的離線分析引擎可以完成;
- 機器學習框架,可以便捷、快速的將歷史的日誌對接到機器學習框架進行離線訓練,並將訓練後的結果加載到線上實時的算法庫中。
開源方案設計
藉助於強大的開源社區,咱們能夠很容易基於開源軟件的組合來實現這樣一套日誌平臺,上圖是一個很是典型的以ELK爲核心的日誌平臺方案:機器學習
- 利用FileBeats、Fluentd等採集Agent實現容器上的數據統一收集。
- 爲了提供更加豐富的上下游以及緩衝能力,可使用kafka做爲數據採集的接收端。
- 採集到的原始數據還須要進一步的清洗,可使用Logstash或者Flink訂閱Kafka中的數據,清洗完畢後再寫入kafka中。
- 清洗後的數據能夠對接ElasticSearch來作實時的查詢檢索、對接Flink來計算實時的指標和告警、對接Hadoop來作離線的數據分析、對接TensorFlow來作離線模型訓練。
- 數據的可視化可使用grafana、kibana等經常使用的可視化組件。
爲何咱們選擇自研
採用開源軟件的組合是很是高效的方案,得益於強大的開源社區以及龐大用戶羣體的經驗積累,咱們能夠很快搭建出這樣一套系統,而且能夠知足咱們絕大部分的需求。elasticsearch
當咱們把這套系統部署好,可以把日誌從容器上採集上來、elasticsearch上可以查到、Hadoop上可以成功執行SQL、Grafana上能看到圖、告警短信能收到。。。完成上述流程打通後,加加班可能只須要花費幾天的時間,當系統終於跑通的時候,這時候終於能夠長舒一口氣,躺在辦公椅上放鬆放鬆。ide
然而理想很豐滿現實很骨感,當咱們預發通了,測試完了上到生產,開始接入第一個應用,逐漸更多的應用接入,愈來愈多的人開始使用。。。這時候不少問題均可能暴露出來:微服務
- 隨着業務量的上漲,日誌量也愈來愈大,Kakfa和ES要不斷擴容,同時同步Kafka到ES的Connector也須要擴容,最煩的是採集Agent,每臺機器上部署的DaemonSet Fluentd根本沒辦法擴容,到了單Agent瓶頸就沒辦法了,只能換Sidecar,換Sidecar工做量大不說,還會帶來一系列其餘的問題,好比怎麼和CICD系統集成、資源消耗、配置規劃、stdout採集不支持等等。
- 從剛開始上的邊緣業務,慢慢更多的核心業務接入,對於日誌的可靠性要求愈來愈高,常常有研發反應從ES上查不到數據、運營說統計出來的報表不許、安全說拿到的數據不是實時的。。。每次問題的排查都要通過採集、隊列、清洗、傳輸等等很是多的路徑,排查代價很是高。同時還要爲日誌系統搭建一套監控方案,可以即時發現問題,並且這套方案還不能基於日誌系統,不能自依賴。
- 當愈來愈多的開發開始用日誌平臺調查問題時,常常會出現由於某1-2我的提交一個大的查詢,致使系統總體負載上升,其餘人的查詢都會被Block,甚至出現Full GC等狀況。這時候一些大能力的公司會對ES進行改造,來支持多租戶隔離;或者爲不一樣的業務部門搭建不一樣的ES集羣,最後又要運維多個ES集羣,工做量仍是很大。
- 當投入了不少人力,終於可以把日誌平臺維持平常使用,這時候公司財務找過來了,說咱們用了很是多的機器,成本太大。這時候開始要優化成本,可是思來想去就是須要這麼多臺機器,天天大部分的機器水位都在20%-30%,可是高峯的水位可能到70%,因此不能撤,撤了高峯頂不住,這時候只能搞搞削峯填谷,又是一堆工做量。
上述這些是一家中等規模的互聯網企業在日誌平臺建設中常常會遇到的問題,在阿里這些問題會放大很是多倍:
- 好比面對雙十一的流量,市面上全部的開源軟件都沒法知足咱們那麼大流量的需求。
- 面對阿里內部上萬個業務應用,幾千名工程師同時使用,併發和多租戶隔離咱們必需要作到極致。
- 面對很是多核心的訂單、交易等場景,整個鏈路的穩定性必需要求3個9甚至4個9的可用性。
- 天天如此大的數據量,對於成本的優化顯得極爲重要,10%的成本優化帶來的收益可能就有上億。
阿里K8s日誌方案
針對上述的一些問題,咱們通過多年的時間,開發並打磨出這樣一套K8s日誌方案:
- 使用咱們自研的日誌採集Agent Logtail實現K8s全方位的數據採集,目前Logtail在集團內有數百萬的全量部署,性能、穩定性通過屢次雙十一金融級考驗。
- 化繁爲簡,數據隊列、清洗加工、實時檢索、實時分析、AI算法等原生集成,而不是基於各類開源軟件搭積木的形式實,大大下降了數據鏈路長度,鏈路長度的下降也意味着出錯可能性的減小。
- 隊列、清洗加工、檢索、分析、AI引擎等所有針對日誌場景深度定製優化,知足大吞吐、動態擴容、億級日誌秒級可查、低成本、高可用性等需求。
- 對於流式計算、離線分析場景這種通用需求,不管是開源仍是阿里內部都有很是成熟的產品,咱們經過無縫對接的方式來支持,目前日誌服務支持了數十種下游的開源、雲上產品的對接。
這套系統目前支撐了整個阿里集團、螞蟻集團、雲上上萬家企業的日誌分析,天天寫入的數據量16PB+,開發、運維這樣一套系統問題和挑戰很是多,這裏就再也不展開,有興趣的同窗能夠參考咱們團隊的技術分享:阿里10PB/天日誌系統設計和實現。
總結
本篇主要從架構層面去介紹如何搭建一套K8s的日誌分析平臺,包括開源方案以及咱們阿里自研的一套方案。然而實際這套系統落地到生產環境並有效運行還有不少工做要作:
- K8s上以什麼樣的姿式來打日誌?
- K8s上的日誌採集方案選擇,DaemonSet or Sidecar?
- 日誌方案如何與CICD去集成?
- 微服務下各個應用的日誌存儲如何劃分?
- 如何基於K8s系統的日誌去作K8s監控?
- 如何去監控日誌平臺的可靠性?
- 如何去對多個微服務/組件去作自動的巡檢?
- 如何自動的監控多個站點並實現流量異常時的快速定位?
後續文章咱們會一步一步來和你們分享如何把這套系統落地,敬請期待。
閱讀原文
本文爲雲棲社區原創內容,未經容許不得轉載。