日誌服務SLS是一款飛天團隊自研產品,服務雲上雲下3W+客戶,並在阿里經濟體中做爲日誌數據的基礎設施,在過去幾年中經歷屢次雙11、雙12、新春紅包錘鍊。前端
在2019雙十一中:算法
可以服務這個體量和用戶規模,對產品的功能、體驗、系統的穩定性和可靠性的要求是很高的。感謝阿里經濟體獨一無二的環境與挑戰,使得咱們過去五年中持續不斷地對產品與技術進行考驗與磨鍊。數據庫
數據管道是什麼?
數據管道概念誕生在2009年,提出的是LinkedIn工程師Jay Krep,Jay也是Apache Kafka做者+Confluent公司CEO。2012年他在文章《The Log: What every software engineer should know about real-time data's unifying abstraction》中提到設計管道設施的兩個初衷:後端
這兩個核心痛點的解決+實時系統的興起使得Kafka類產品在幾年間有了一個量的飛躍,成了膾炙人口的基礎軟件。隨着數據分析系統成爲企業標配,各大廠商也逐步將數據管道產品化成服務互聯網的服務,比較有表明性的有:緩存
數據管道(Data Pipeline)是實現系統之間數據遷移的載體,所以包括數據的採集、傳輸鏈路、存儲隊列、消費/轉儲等都屬於數據管道的範疇。在SLS這裏,咱們專爲數據管道相關的功能集合起了一個單獨的名稱:LogHub,LogHub提供數30+種數據接入方式、提供實時數據管道、對接各種下游系統等功能。
然而數據管道因足夠底層,在企業數字化過程當中擔任重要的業務,必須足夠可靠、足夠穩定、確保數據的通暢,而且可以彈性知足流量變化需求。咱們把過去5年來咱們遇到的挑戰展開,和你們回顧下。網絡
管道這個概念很是簡單,以致於每一個開發者都能用20行代碼寫一個原型出來:架構
但在現實過程當中,維護一個天天讀寫百億次,幾十PB數據流量,而且被萬級用戶依賴的管道是一件頗有挑戰的事情,舉幾個例子:併發
這樣例子天天都在發生,如何把簡單的管道作得不簡單,須要大量的工做,在下面篇幅中咱們娓娓道來。負載均衡
SLS 初版本支持一類數據源-- 飛天格式的日誌文件,在五年中逐步擴展到各語言SDK,移動端,嵌入式芯片,物聯網和雲原生等環境:less
SLS起源與阿里雲的飛天項目,當時咱們飛天有一個基礎的日誌模塊,幾乎全部的系統都會使用這個模塊打印日誌,因此最開始咱們開發了Logtail用於採集飛天日誌,當時的Logtail還只是一個阿里雲飛天系統內部使用的工具。
隨着非阿里雲團隊使用,因此咱們擴展了Logtail,支持通用的日誌格式,好比正則、Json、分隔符等等。同時還有不少應用不但願落盤,所以咱們提供了各類語言的SDK用於日誌上傳的代碼集成。
隨着移動互聯網興起,咱們專門針對移動端開發了Android、IOS的SDK,便於用戶快速接入日誌;這個時間點阿里也開始了微服務改造、pouch開始上線,Logtail開始兼容pouch,同時咱們還專門爲Java微服務提供Log4J、LogBack的Appender,提供數據直傳的服務。
對ARM平臺、嵌入式系統、國產化系統也定製適配客戶端進行接入。
在2018年初,爲了應對多樣化的需求,咱們爲Logtail增長了插件功能,有自定義需求的用戶能夠經過開發插件的方式擴展Logtail,實現各類豐富的功能;同時咱們也緊跟時代步伐,支持雲原生、智能設備、IoT等新興領域的數據採集
隨着雲原生落地,Logtail的數據採集在18年初就開始全面支持Kubernetes,並提供了CRD(CustomResourceDefinition)用於日誌和Kubernetes系統的集成,目前這套方案已經應用在了集團內、公有云幾千個集羣中。
在阿里高度虛擬化的場景中,一臺物理機可能運行上百個容器,傳統的日誌落盤採集方式對物理機磁盤的競爭很大,會影響日誌寫入性能,間接影響應用的RT;同時天天物理機須要爲各個容器準備日誌的磁盤空間,形成巨大的資源冗餘。
所以咱們和螞蟻系統部合做開展了日誌無盤化項目,基於用戶態文件系統,爲應用虛擬出一個日誌盤,而日誌盤的背後直接經過用戶態文件系統對接Logtail並直傳到SLS,以最快的方式實現日誌可看、可查。
SLS服務端支持HTTP協議寫入,也提供了衆多SDK和Agent,但在不少場景下仍是和數據源間有巨大鴻溝,例如:
爲此SLS開展了通用協議適配計劃,除HTTP外還兼容Syslog,Kafka、Promethous和JDBC四種協議來兼容開源生態。用戶現有系統只須要修改寫入源便可實現快速接入;已有的路由器、交換機等能夠直接配置寫入,無需代理轉發;支持衆多開源採集組件,例如Logstash、Fluentd、Telegraf等。
在2017年先後,咱們遇到了另一個挑戰:單機Agent的多租戶流控,舉一個例子:
咱們對Agent(Logtail)進行了一系列多租戶隔離優化:
該功能上線後,通過不斷調優,較好解決了單機上多個數據源(租戶)公平分配的問題。
除了客戶端流控外,咱們在服務端也支持兩種不一樣的流控方式(Project級、Shard級反壓),防止單實例異常在接入層、或後端服務層影響其餘租戶。咱們專門開發QuotaServer模塊,提供了Project全局流控和Shard級流控兩層流控機制,在百萬級的規模下也能實現秒級的流控同步,保證租戶之間的隔離性以及防止流量穿透致使集羣不可用。
Project全局流控最主要的目的是限制用戶總體資源用量,在前端就拒絕掉請求,防止用戶實例的流量穿透後端把整個集羣打爆。真正作到流控更加精細、語義更加明確、可控性更強的是Shard級別流控。
經過shard級別流控,好處很是明顯:
解決日誌消費問題仍是須要從應用場景出發,SLS做爲實時管道,絕大部分消費場景都是實時消費,SLS針對消費場景提供了一層Cache,但Cache策略單一,隨着消費客戶端增多、數據量膨脹等問題而致使命中率愈來愈低,消費延遲愈來愈高。後來咱們從新設計了緩存模塊:
上述優化上線後,集羣日誌平均消費延遲從5ms下降到了1ms之內,有效緩解雙十一數據消費壓力。
在以微服務、雲原生爲主導的大背景下,應用被切分的愈來愈細、整個鏈路也愈來愈複雜,其中產生的日誌種類和數量也愈來愈多;同時日誌的重要性也愈來愈強,同一個日誌可能會有好幾個甚至數十個業務方須要消費。
傳統的方式粗暴簡單,須要日誌的人本身去機器上採集,最終一份日誌可能被重複採集幾十遍,嚴重浪費客戶端、網絡、服務端的資源。
SLS從源頭上禁止同一文件的重複採集,日誌統一採集到SLS後,咱們爲用戶提供ConsumerGroup用於實時消費。但伴隨着日誌的細分化以及日誌應用場景的豐富化,SLS的數據消費逐漸暴露出了兩個問題:
針對日誌細分場景下的資源映射和權限歸屬管理等問題,咱們和螞蟻日誌平臺團隊合做開發了View消費模式(思路來源於數據庫中View),可以將不一樣用戶、不一樣logstore的資源虛擬成一個大的logstore,用戶只須要消費虛擬的logstore便可,虛擬logstore的實現以及維護對用戶徹底透明。該項目已經在螞蟻集羣正式上線,目前已經有數千個View消費實例在工做中。
針對單消費者能力不足的問題,咱們對ConsumerGroup進一步加強,開發了Fanout消費模式,在Fanout模式下,一個Shard中的數據可交由多個消費者處理,將Shard與消費者解耦,完全解生產者消費者能力不匹配的問題。同時消費端無需關心Checkpoint管理、Failover等細節,Fanout消費組內部所有接管。
SLS對外SLA承諾99.9%服務可用性(實際99.95%+),剛開始的時候咱們很難達到這樣的指標,天天收到不少告警,常常夜裏被電話Call醒,疲於處理各類問題。總結下來主要的緣由有2點:
針對熱點問題,咱們在系統中增長了調度角色,經過實時數據收集和統計後,自動作出調整,來消除系統中存在的熱點,主要有如下兩個手段:
自動負載均衡
自動分裂
實際場景下有不少狀況須要特殊考慮,例如顛簸狀況、異構機型、併發調度、遷移的負面影響等,這裏就再也不展開。
目前SLS線上收集了數千種實時指標,天天的訪問日誌有上千億,出現問題時純粹手工調查難度很是大。爲此咱們專門開發了根因分析相關算法,經過頻繁集和差別集的方式,快速定位和異常最相關的數據集合。
如樣例中,將出現錯誤(status >= 500)的訪問數據集,定義爲異常集合A,在這個集合發現90%的請求,都是由ID=1002引發,因此值得懷疑,當前的錯誤和ID=1002有關,同時爲了減小誤判,再從正常的數據集合B(status <500)中,查看ID=1002的比例,發如今集合B中的該ID比例較低,因此更增強系統判斷,當前異常和這個ID=1002有很是高的相關性。
藉助此種方法大大縮短了咱們問題調查的時間,在報警時咱們會自動帶上根因分析結果,不少時候收到告警時就已經可以定位具體是哪一個用戶、哪臺機器仍是哪一個模塊引起的問題。
爲了便於水平擴展咱們引入了Shard的概念(相似Kafka Partition),用戶能夠經過分裂Shard、合併Shard來實現資源的伸縮,但這些概念也會爲用戶帶來不少使用上的困擾,用戶須要去了解Shard的概念、須要去預估流量分配Shard數、有些時候由於Quota限制還須要手動分裂...
優秀的產品應該對用戶暴露儘量少的概念,將來咱們會弱化甚至去除Shard概念,對於用戶而言,SLS的數據管道只須要聲明必定的Quota,咱們就會按照對應的Quota服務,內部的分片邏輯對用戶完全透明,作到管道能力真正彈性。
和Kafka同樣,SLS目前支持At Least Once寫入和消費方式,但不少核心場景(交易、結算、對帳、核心事件等)必需要求Exactly Once,如今不少業務只能經過在上層包裝一層去重邏輯來Work around,但實現代價以及資源消耗巨大。
立刻咱們會支持寫入和消費的Exactly Once語義,且Exactly Once語義場景下也將支持超大流量和高併發。
和Kafka相似,SLS支持的消費是Logstore級別的全量消費方式,若是業務只須要其中的一部分數據,也必須將這段時間的全部數據全量消費才能獲得。全部的數據都要從服務端傳輸到計算節點再進行處理,這種方式對於資源的浪費極其巨大。
所以將來咱們會支持計算下推到隊列內部,能夠直接在隊列內進行無效數據過濾,大大下降無效的網絡傳輸和上層計算代價。
雙12來襲!500元淘寶紅包、iPhone11等你拿https://www.aliyun.com/1212/2019/home?utm_content=g_1000092611
本文做者:元乙
本文爲雲棲社區原創內容,未經容許不得轉載。