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