一個百億級日誌系統是怎麼設計出來的?

2022-01-30 51CTO技術棧

日誌是記錄系統中各種問題信息的關鍵,也是一種常見的海量數據。

日誌平臺為集團所有業務系統提供日誌採集、消費、分析、存儲、索引和查詢的一站式日誌服務。

主要為了解決日誌分散不方便查看、日誌搜索操作複雜且效率低、業務異常無法及時發現等等問題。

隨著有贊業務的發展與增長,每天都會產生百億級別的日誌量(據統計,平均每秒產生 50 萬條日誌,峰值每秒可達 80 萬條)。日誌平臺也隨著業務的不斷發展經歷了多次改變和升級。

本文跟大家分享有贊在當前日誌系統的建設、演進以及優化的經歷,這裡先拋磚引玉,歡迎大家一起交流討論。

有贊從 2016 年就開始構建適用於業務系統的統一日誌平臺,負責收集所有系統日誌和業務日誌,轉化為流式數據。

通過 Flume 或者 Logstash 上傳到日誌中心(Kafka 集群),然後供 Track、Storm、Spark 及其他系統實時分析處理日誌。

並將日誌持久化存儲到 HDFS 供離線數據分析處理,或寫入 ElasticSearch 提供數據查詢。

整體架構如圖 2-1 所示:

圖 2-1:原有日誌系統架構

隨著接入的應用越來越多,接入的日誌量越來越大,逐漸出現一些問題和新的需求,主要在以下幾個方面:

關於存儲方面:

採用了 ES 默認的管理策略,所有的 Index 對應 3*2 Shard(3 個 Primary,3 個 Replica)。

有部分 Index 數量較大,對應單個 Shard 對應的數據量就會很大,導致有 Hot Node,出現很多 bulk request rejected,同時磁碟 IO 集中在少數機器上。

對於 bulk request rejected 的日誌沒有處理,導致業務日誌丟失。

日誌默認保留 7 天,對於 SSD 作為存儲介質,隨著業務增長,存儲成本過於高昂。

另外 Elasticsearch 集群也沒有做物理隔離,ES 集群 OOM 的情況下,使得集群內全部索引都無法正常工作,不能為核心業務運行保駕護航。

日誌從產生到檢索,主要經歷以下幾個階段:

詳細架構如圖 3-1 所示:

圖 3-1:現有系統架構

日誌接入目前分為兩種方式:


現在有 Rsyslog-Hub 和 Web Portal 做為日誌傳輸系統,Rsyslog 是一個快速處理收集系統日誌的程序,提供了高性能、安全功能和模塊化設計。
之前系統演進過程中使用過直接在宿主機上部署 Flume 的方式,由於 Flume 本身是 Java 開發的,會比較佔用機器資源而統一升級為使用 Rsyslog 服務。
為了防止本地部署與 Kafka 客戶端連接數過多,本機上的 Rsyslog 接收到數據後,不做過多的處理就直接將數據轉發到 Rsyslog-Hub 集群。通過 LVS 做負載均衡,後端的 Rsyslog-Hub 會通過解析日誌的內容,提取出需要發往後端的 Kafka Topic。

Kafka 是一個高性能、高可用、易擴展的分布式日誌系統,可以將整個數據處理流程解耦。

將 Kafka 集群作為日誌平臺的緩衝層,可以為後面的分布式日誌消費服務提供異步解耦、削峰填谷的能力,也同時具備了海量數據堆積、高吞吐讀寫的特性。

日誌分析是重中之重,為了能夠更加快速、簡單、精確地處理數據。日誌平臺使用 Spark Streaming 流計算框架消費寫入 Kafka 的業務日誌。

Yarn 作為計算資源分配管理的容器,會跟不同業務的日誌量級,分配不同的資源處理不同日誌模型。

整個 Spark 任務正式運行起來後,單個批次的任務會將拉取到的所有的日誌分別異步的寫入到 ES 集群。

業務接入之前可以在管理臺對不同的日誌模型設置任意的過濾匹配的告警規則,Spark 任務每個 Excutor 會在本地內存裡保存一份這樣的規則。

在規則設定的時間內,計數達到告警規則所配置的閾值後,通過指定的渠道給指定用戶發送告警,以便及時發現問題。

當流量突然增加,ES 會有 bulk request rejected 的日誌重新寫入 Kakfa,等待補償。

原先所有的日誌都會寫到 SSD 盤的 ES 集群,LogIndex 直接對應 ES 裡面的索引結構。

隨著業務增長,為了解決 ES 磁碟使用率單機最高達到 70%~80% 的問題,現有系統採用 Hbase 存儲原始日誌數據和 ElasticSearch 索引內容相結合的方式,完成存儲和索引。

Index 按天的維度創建,提前創建 Index 會根據歷史數據量,決定創建明日 Index 對應的 Shard 數量,也防止集中創建導致數據無法寫入。

現在日誌系統只存近 7 天的業務日誌,如果配置更久的保存時間的,會存到歸檔日誌中。

對於存儲來說,Hbase、ES 都是分布式系統,可以做到線性擴展。

隨著日誌系統不斷發展,全網日誌的 QPS 越來越大,並且部分用戶對日誌的實時性、準確性、分詞、查詢等需求越來越多樣。

為了滿足這部分用戶的需求,日誌系統支持多租戶的的功能,根據用戶的需求,分配到不同的租戶中,以避免相互影響。

針對單個租戶的架構如下:

SDK:可以根據需求定製,或者採用天網的 TrackAppender 或 SkynetClient。

Kafka 集群:可以共用,也可以使用指定 Kafka 集群。

Spark 集群:目前的 Spark 集群是在 Yarn 集群上,資源是隔離的,一般情況下不需要特地做隔離。

存儲:包含 ES 和 Hbase,可以根據需要共用或單獨部署 ES 和 Hbase。


目前,有贊日誌系統作為集成在天網裡的功能模塊,提供簡單易用的搜索方式,包括時間範圍查詢、欄位過濾、NOT/AND/OR、模糊匹配等方式。

並能對查詢欄位高亮顯示,定位日誌上下文,基本能滿足大部分現有日誌檢索的場景。

但是日誌系統還存在很多不足的地方,主要有:

缺乏部分鏈路監控:日誌從產生到可以檢索,經過多級模塊,現在採集,日誌緩衝層還未串聯,無法對丟失情況進行精準監控,並及時推送告警。

現在一個日誌模型對應一個 Kafka Topic,Topic 默認分配三個 Partition。

由於日誌模型寫入日誌量上存在差異,導致有的 Topic 負載很高,有的 Topic 造成一定的資源浪費,且不便於資源動態伸縮。

Topic 數量過多,導致 Partition 數量過多,對 Kafka 也造成了一定資源浪費,也會增加延遲和 Broker 宕機恢復時間。

目前 Elasticsearch 中文分詞我們採用 ikmaxword,分詞目標是中文,會將文本做最細粒度的拆分,但是日誌大部分都是英文,分詞效果並不是很好。

上述的不足之處也是我們以後努力改進的地方,除此之外,對於日誌更深層次的價值挖掘也是我們探索的方向,從而為業務的正常運行保駕護航。

作者:饒榕

編輯:陶家龍、孫淑娟

出處:轉載自微信公眾號有贊coder(ID:youzan_coder)

精彩文章推薦:

Spring Boot是如何實現日誌的?

百億級日誌系統架構設計及優化

網際網路人黑話大全:那些殘忍的潛臺詞!

相關焦點

  • 騰訊內部全鏈路追蹤系統「天機閣「的設計與實現
    本文的「天機閣」是一個基於鏈路跟蹤的監控系統,後臺開發人員能夠通過「天機閣」洞察「天機」,快速解決問題。為了支撐日益增長的龐大業務量,業界大量使用微服務架構。服務按照不同的維度進行拆分,網際網路應用構建在不同的軟體模塊集上,這些軟體模塊可能是由不同的團隊開發、可能使用不同的程式語言來實現、可能布在了幾千臺伺服器,橫跨多個不同的數據中心,分布式系統變得日趨複雜。
  • windows 伺服器系統日誌分析及安全
    怎麼同一個IP出現了很多,那你可要注意了!下面是我寫的幾個敏感字符,僅供參考,你可以根據自己系統、網頁定製自己的敏感字符,當然如果你根據 這些字符作一個批處理命令就更方便了。cmd、'、\\、..、;、and、webconfig、global、如果你感覺findstr功能不夠直觀強大,你可以AutoScanIISLogFilesV1.4工具。它使用圖形化界面一次可以檢測多個文件。
  • 支付系統高可用架構設計實戰
    直到某天,這臺節點所在的物理主機硬體因為年久失修壞掉了,當時這臺RabbitMQ就無法提供服務,導致系統服務瞬間不可用。故障發生了也不可怕,最重要的是及時發現並解決故障。付錢拉對自身系統的要求是,秒級發現故障,快速診斷和解決故障,從而降低故障帶來的負面影響。
  • 丁奇:MySQL 中 6 個常見的日誌問題
    如圖 1 所示為一個事務的執行流程,你在最後三步可以看到,redo log 先 prepare 完成,再寫 binlog,最後才進入 redo log commit 階段。圖 1 兩階段提交示意圖這裡,我要先和你解釋一個誤會式的問題:這個圖不就是一個 update 語句的執行流程嗎,怎麼還會調用 commit 語句?
  • Uber 下一代支付平臺的系統架構設計
    為了實現這一點,我們將每筆交易更改都保存在實體更改日誌中,以便我們的系統通過實體更改日誌的每個用戶版本號對寫回進行序列化。我們使用包含版本號的欄位對舊系統中的每筆交易進行雙重寫入。這樣,即使同一作業進行了多個並發調整,寫回也不會出現混亂,並且最終結果始終是一致的。
  • 更新日誌
    ;3.更新炎魔和幽影武士爆聖戰裝備,高級技能書;4.修復一區46級飛升引起的升級經驗異常,改為65級封頂,必須飛升後才能升級重數;5.修復道士一把武器讓所有認識的道士朋友都帶上牛逼寶寶的問題;3.24日更新日誌1.更新靈獸系統,靈獸分職業,孵化時隨機賦予職業屬性;2.增加虎王系統;
  • 一個海量在線用戶即時通訊系統(IM)的完整設計Plus
    《一個海量在線用戶即時通訊系統(IM)的完整設計》(以下稱《完整設計》)這篇文章發出來之後有不少讀者諮詢問題,提出意見或建議。主要集中在模塊拆分、協議、存儲等方面。針對這些問題做個簡單說明。1、真實生產系統的模塊拆分比《完整設計》一文中要複雜許多。《完整設計》只在反應IM系統最核心大功能點之間的關係,便於沒有經驗的讀者能夠快速上手進行IM設計和開發。
  • Android ANR日誌分析進行曲
    如果你應用程式在UI線程被阻塞太長時間,就會出現ANR,通常出現ANR,系統會彈出一個提示提示框,讓用戶知道,該程序正在被阻塞,是否繼續等待還是關閉。仔細看一下就會發現:23:04:19時間點做了界面跳轉,之後將近8秒後,就出現ANR了,那麼,我們知道怎麼開始的,但是具體原因還是沒有找到。那麼接下來,是不是當時CPU很緊張、各路APP再搶佔資源?我們再看看CPU的信息,。
  • 系統設計之高可用
    在系統功能迭代過程中,我們可以在研發環境中儘可能完善地測試我們的系統,但測試case通常並不能面面俱到,所以每次上線還是難免會有一定的風險;
  • Windows日誌分析工具
    作者因為平時需要遠程許多用戶,看很多日誌, 所以寫了一個簡單的日誌分析工具,希望能幫到一些不怎麼懂如何看日誌的人。(這個主要想寫個不懂技術的人看的,所以寫的特別的詳細。不要噴,只是為了我自己以後方便。不用每次都給別人講解很多次,真的太繁瑣,不僅浪費時間,用戶也很惱火,所以每個步驟都非常詳細,覺得不夠詳細的地方可以留言,後面我再補充。懂技術的可以直接跳著看重點。)
  • 創新研究丨系統日誌查詢
    /var/log/apt/ : Apt/apt-get命令歷史和日誌目錄/var/log/syslog或/var/log/messages:顯示有關系統的一般消息和信息。基本上是整個全球系統所有活動的數據日誌。要知道在基於 Redhat 的系統(如 CentOS 或 Rhel)上發生的一切都將進入消息。
  • 當vulnhub邂逅百香果沙盤後...
    為了讓小夥伴更深入的了解百香果沙盤的真香體驗,本次文章將帶領大家使用網際網路公開的靶機(vulnhub)來構建一個內網安全實戰環境來進行攻擊演練。,vulnhub提供的靶機是一個不錯的學習範本。下面鬥哥就教大家怎麼將下載到本地的vulnuni1.0.1靶機配置加入到百香果沙盤,然後進行實戰演練的過程:準備如下虛擬機:虛擬機對應百香果區域IP位址百香果沙盤docker版
  • 鴻蒙系統日誌工具HiLog的使用方法!
    做為一個
  • 從linux網站搭建到日誌服務審計滲透溯源
    攻擊者的系統從上大致也可以看出攻擊者的IP系統著重攻擊點,以及看到了appscan掃描的特徵,以此判斷網站肯定被掃描過,根據這裡面的數據我們可以注重挑出來自行測試修護,功能很多我就不一一解釋,大家可以去網上自行學習接下來我們回到系統去看看在系統裡面是否有提權或者進行了什麼操作
  • 深度解密系統架構背後的技術,雲+社區沙龍online「架構演進」乾貨整理
    在軟體發展的不同時期、階段,對技術的理解、選擇和應用都有著不一樣的訴求,架構的選型只有「合適與不合適」,永遠沒有「哪個更好」的說法,這也說明了在企業系統架構演進的過程中,實踐要比理論更能給開發者靈感。想知道億級用戶架構怎麼做?想觀摩百微秒延遲的架構套路?那就不要錯過這篇技術大咖分享的實踐乾貨。
  • 從百元牛股的眾生相中思考到的啟發
    688050.SH愛博醫療280.34醫藥生物-醫療器械服務專注眼科醫療器械的自主研發和生產,如人工晶狀體、角膜塑形鏡等000661.SZ長春高新278.04醫藥生物-生物製品主營業務以生物製藥、中成藥生產及銷售為主,輔以房地產開發、物業管理等688699.SH明微電子274.92半導體及元件-集成電路主營LED顯示和照明驅動類集成電路設計研發和生產688339.SH億華通274.5機械設備-電氣設備專注氫燃料電池發動機系統研發和產業化
  • 資料庫系統設計概述
    ,新的,細節的,二維的,分立的歷史的,聚集的,多維集成的,統一的存取讀寫數十上百條數據讀百萬級數據讀特徵基於鍵,返回少量數據基於大量數據匯總寫特徵隨機訪問,低延遲批量或數據流DB 大小100MB~~GB100GB~~TB時間要求實時性對時間的要求不嚴格主要應用資料庫數據倉庫業界有許多優秀的開源的 OLAP 系統,比如:Druid:Metamarkets
  • 系統級封裝SiP整合設計的優勢與挑戰
    應對系統級封裝SiP高速發展期,環旭電子先進位程研發中心暨微小化模塊事業處副總經理趙健先生在系統級封裝大會
  • app測試日誌如何獲取,logcat值得擁有
    的命令行選項1、日誌消息的標記是一個簡短的字符串,指示消息所源自的系統組件(例如,「View」表示視圖系統)。通過過濾器表達式,您可以向系統指明您感興趣的標記/優先級組合,系統會針對指定的標記抑制其他消息。過濾器表達式採用 tag:priority … 格式,其中tag指示您感興趣的標記,priority指示可針對該標記報告的最低優先級。不低於指定優先級的標記的消息會寫入日誌。您可以在一個過濾器表達式中提供任意數量的 tag:priority 規範。
  • 系統日誌20300329 | ​「2030:新冠紀元十年」徵文比賽獲獎作品
    北京德國文化中心·歌德學院(中國)近日以「2030:新冠紀元十年」為主題舉辦了徵文比賽。本文為此次比賽一等獎作品。更多優秀文章請關注我們日後的微信推送。連電話都接不通,還搞個啥,啥啥信箱。錢沒掙著幾個,倒挺像那麼回事。哎,是這樣啊,今天我和你爸就不回來了。我這幾天嗓子不舒服,總咳,你爸說帶我去醫院看看。菜在冰箱裡面有,中午剛炒的,別總點外賣。你這幾天不也不舒服嗎,少吃點辣的,啊。