Apache SkyWalking是一個開源的應(yīng)用程序性能監(jiān)控系統(tǒng),特別為微服務(wù)、云原生和容器化架構(gòu)設(shè)計。其啟動加載過程與數(shù)據(jù)處理存儲服務(wù)是整個系統(tǒng)的核心。本文將深入解析SkyWalking的啟動流程,以及其數(shù)據(jù)處理與存儲服務(wù)的工作原理。
一、SkyWalking啟動加載過程
SkyWalking的整體架構(gòu)分為OAP(Observability Analysis Platform)服務(wù)器、存儲后端和探針(Agent)三部分。啟動過程主要指OAP服務(wù)器的初始化。
1. 模塊化架構(gòu)初始化:
SkyWalking采用高度模塊化的設(shè)計。啟動時,核心容器(ModuleManager)會根據(jù)application.yml配置文件,加載并初始化所有啟用的模塊。每個模塊(如core、cluster、storage、receiver-*等)都通過SPI(Service Provider Interface)機(jī)制定義自己的提供者(Provider)。容器會解析模塊間的依賴關(guān)系,按正確順序進(jìn)行初始化。
- 核心服務(wù)啟動:
- 集群管理服務(wù):如果配置了集群模式(如Zookeeper、Kubernetes、Consul等),相應(yīng)的集群管理模塊會啟動,用于OAP節(jié)點間的服務(wù)發(fā)現(xiàn)與協(xié)調(diào)。
- GRPC/HTTP服務(wù)器啟動:接收來自各類探針(如Java、.NET、Node.js等Agent)上報的遙測數(shù)據(jù)(Trace、Metric、Log)的Receiver模塊會啟動其GRPC和/或HTTP服務(wù)器,監(jiān)聽特定端口。
- 查詢服務(wù)啟動:提供GraphQL查詢接口的模塊啟動,為UI前端提供數(shù)據(jù)查詢能力。
3. 存儲模塊初始化:
這是啟動的關(guān)鍵環(huán)節(jié)。Storage模塊的Provider(如elasticsearch、mysql、tidb、influxdb等)被加載。它會執(zhí)行以下操作:
- 根據(jù)配置連接指定的存儲后端。
- 檢查并創(chuàng)建必要的索引/表結(jié)構(gòu)(如果配置了自動創(chuàng)建)。
- 初始化各種DAO(Data Access Object)對象,這些DAO封裝了所有指標(biāo)、追蹤、服務(wù)等數(shù)據(jù)的增刪改查邏輯。
4. 流式處理拓?fù)錁?gòu)建:
SkyWalking的核心數(shù)據(jù)處理引擎是一個輕量級的流式處理系統(tǒng)。在啟動時:
- Receiver模塊將接收到的原始數(shù)據(jù)發(fā)布到不同的“流”(Stream)中。
- 聚合器(Aggregator) 模塊會為每一種指標(biāo)(如Service、Endpoint、Service Relation的指標(biāo))創(chuàng)建并啟動一個處理“窗口”。這些窗口定義了數(shù)據(jù)的聚合周期(如分鐘、小時、天等)。
- 系統(tǒng)構(gòu)建出一個完整的數(shù)據(jù)處理流水線,原始數(shù)據(jù)經(jīng)過解析、格式化、聚合后,最終由存儲模塊的DAO持久化到數(shù)據(jù)庫中。
5. 就緒與服務(wù)注冊:
所有核心服務(wù)初始化完畢后,OAP服務(wù)器標(biāo)記自身為就緒狀態(tài)。在集群模式下,會向集群管理器注冊自身實例,開始正常處理工作負(fù)載。
二、數(shù)據(jù)處理與存儲服務(wù)詳解
數(shù)據(jù)處理與存儲是SkyWalking將原始遙測數(shù)據(jù)轉(zhuǎn)化為可觀測性洞察的核心。
- 數(shù)據(jù)處理流程(流式處理模型):
- 數(shù)據(jù)接收:Agent通過GRPC將Trace、JVM Metrics、Service/Instance屬性等數(shù)據(jù)推送到OAP的相應(yīng)Receiver。
- 數(shù)據(jù)解析與流轉(zhuǎn):Receiver對數(shù)據(jù)進(jìn)行初步解碼和校驗,然后將其發(fā)送到內(nèi)部的消息隊列(實際上是基于Disruptor或其它隊列的流)。每個數(shù)據(jù)流(如Trace流、Meter流)都有明確的定義。
- 實時聚合:這是最關(guān)鍵的一步。聚合器(Aggregator)訂閱這些流。例如:
- Trace數(shù)據(jù):會被用于生成拓?fù)鋱D(Service Relation)、計算端點(Endpoint)的響應(yīng)時間和成功率。一條Trace會被拆解成多個服務(wù)間(Service Relation)的調(diào)用指標(biāo)。
- Metric數(shù)據(jù):如JVM數(shù)據(jù),會按照服務(wù)(Service)、服務(wù)實例(Instance)的維度進(jìn)行分鐘級的聚合,計算CPU使用率、堆內(nèi)存使用率等的平均值、最大值等。
- 窗口化處理:聚合以時間窗口(通常為1分鐘)為單位進(jìn)行。系統(tǒng)會為每個聚合指標(biāo)(如Service的每分鐘響應(yīng)時間)維護(hù)一個窗口。窗口關(guān)閉時(每分鐘的第59秒),窗口內(nèi)的數(shù)據(jù)會完成最終聚合,并觸發(fā)持久化。分鐘級的數(shù)據(jù)會進(jìn)一步向上聚合到小時級和天級窗口。
- 派生指標(biāo)生成:系統(tǒng)會根據(jù)原始指標(biāo)計算派生指標(biāo),如Apdex(應(yīng)用性能指數(shù))、百分位數(shù)(P50, P90, P99)等。
2. 存儲服務(wù)與設(shè)計:
SkyWalking的存儲設(shè)計是面向度量和拓?fù)浞治龅模⒎窃既罩镜拇鎯Α?/p>
- 存儲模型:
- 指標(biāo)存儲:以時間序列數(shù)據(jù)為核心。例如,
service<em>traffic表存儲服務(wù)元數(shù)據(jù),service</em>resp_time表存儲服務(wù)響應(yīng)時間的分鐘/小時/天指標(biāo)。存儲時包含時間桶(Time Bucket)、實體ID(如服務(wù)ID)、值等字段。
- 拓?fù)浯鎯?/strong>:服務(wù)間調(diào)用關(guān)系(Service Relation)和端點間調(diào)用關(guān)系(Endpoint Relation)也被建模為特殊的指標(biāo)進(jìn)行存儲,包含來源ID、目標(biāo)ID和調(diào)用指標(biāo)(如流量、延遲、成功率)。
- 軌跡存儲:Trace數(shù)據(jù)通常被采樣存儲。詳細(xì)軌跡(Segment)存儲在一個獨立的索引/表中,通過Trace ID進(jìn)行查詢。為了平衡性能和成本,SkyWalking支持慢查詢追蹤、僅存儲錯誤Trace等策略。
- 多存儲后端支持:通過Storage Provider抽象層,支持多種存儲:
- Elasticsearch:最常用的選擇,利用其強大的搜索和聚合能力,適合存儲Trace和明細(xì)數(shù)據(jù)。
- 關(guān)系型數(shù)據(jù)庫(MySQL, PostgreSQL, TiDB等):通過分表(按時間、按類型)存儲聚合后的指標(biāo)數(shù)據(jù),適合中等數(shù)據(jù)量級和成本敏感的場景。
- 其他時序數(shù)據(jù)庫:如InfluxDB等。
- 數(shù)據(jù)TTL(生存時間):存儲模塊支持為不同類型的數(shù)據(jù)(如詳細(xì)Trace、指標(biāo)數(shù)據(jù))配置不同的保留策略,自動清理過期數(shù)據(jù)以控制存儲成本。
###
SkyWalking的啟動是一個按依賴順序初始化模塊化服務(wù)的過程,最終構(gòu)建出一個完整的流式數(shù)據(jù)處理管道。其數(shù)據(jù)處理核心在于“實時接收、窗口化聚合、多級下鉆”,將海量的原始遙測數(shù)據(jù)高效地轉(zhuǎn)化為面向服務(wù)的指標(biāo)、拓?fù)浜蛙壽E信息。存儲層則通過靈活的Provider機(jī)制適配不同后端,以優(yōu)化的數(shù)據(jù)模型持久化這些分析結(jié)果,為上層UI提供快速查詢和分析的基礎(chǔ)。這種設(shè)計使得SkyWalking在微服務(wù)監(jiān)控場景下,既能保證處理性能,又能提供豐富的可觀測性能力。