SkyWalking架构深度解析:分布式系统监控的利器
一、SkyWalking概述
SkyWalking是一款开源的APM(应用性能监控)系统,专门为微服务、云原生和容器化架构设计。它由Apache软件基金会孵化并毕业,已成为分布式系统监控领域的明星项目。
核心特性
- 分布式追踪:跨服务调用链路的完整追踪
- 服务拓扑分析:自动绘制服务间依赖关系图
- 性能指标监控:JVM、CLR、线程池等运行时指标
- 告警系统:基于规则的实时告警机制
- 日志集成:与分布式日志系统无缝对接
二、整体架构设计
SkyWalking采用模块化设计,主要分为以下几个核心组件:
1. Agent/探针层
架构角色:数据采集端
实现机制:
- 基于Java Agent技术实现无侵入式埋点
- 支持多种语言的探针(Java, .NET, NodeJS等)
- 采用插件化架构,可按需扩展监控能力
核心功能:
- 方法级追踪数据采集
- JVM指标收集
- 上下文传播(跨进程/跨线程)
- 自适应采样控制
2. OAP(Observability Analysis Platform)服务层
架构角色:数据处理中枢
模块组成:
1. 接收层(Receiver)
- 协议支持:
- Agent上报:gRPC(SkyWalking原生协议)
- 第三方集成:HTTP/JSON(如OpenTelemetry)、Kafka(日志流)
- 关键组件:
- Receiver-Trace:调用链数据解析
- Receiver-Meter:Prometheus格式指标解析
- Receiver-JVM:Java探针性能数据接收
2. 数据总线(Data Bus)
- 作用:异步解耦接收层与分析层
- 实现:
- 内存队列(默认):基于Disruptor高性能环形队列
- 扩展支持:Kafka(集群部署时启用)
3. 分析引擎(Analyzer)
- 实时计算:
- OAL脚本:定义指标计算规则(如service_resp_time = avg(endpoint.latency))
- MAL引擎:数学告警表达式(如error_rate = sum(error)/sum(total))
- 拓扑构建:自动识别服务依赖关系(基于Trace的上下游分析)
4. 聚合器(Aggregator)
- 多级聚合:
- L1聚合:分钟级指标(原始精度)
- L2聚合:小时/天级指标(降精度存储)
- 优化策略:时间窗口滚动计算(减少重复扫描)
5. 告警引擎(Alert Engine)
- 规则触发:
- 流式检测(如service_sla < 99%持续5分钟)
- 支持动态加载规则(无需重启服务)
- 输出事件:通过gRPC/Kafka推送至Alarm Service
6. 存储适配层(Storage Adapter)
- 多存储支持:
- 时序数据:Elasticsearch(默认)、TiDB
- 元数据:H2(嵌入式)、MySQL
- 分片策略:按时间分片(如metrics-202306)
7. 查询引擎(Query Engine)
- 统一接口:
- GraphQL:拓扑/追踪查询
- PromQL:指标查询(兼容Prometheus)
- 缓存优化:热点数据LRU缓存
核心价值:
- 实时流式分析(Analyzer + Aggregator)
- 可插拔架构(通过Storage Adapter对接不同存储)
- 一体化观测能力(Metrics/Tracing/Logging联动)
3. UI层
架构特点:
- 基于React+Ant Design实现
- 动态仪表盘配置
- 拓扑图自动布局算法
- 多租户支持
三、核心架构设计亮点
1. 混合探针模型
/*** Java Agent的入口方法,由JVM在应用主程序启动前自动调用* * @param args 从-javaagent参数传入的配置字符串(如agent.jar=config.properties)* @param inst JVM提供的Instrumentation实例,用于类加载拦截和字节码修改*/
public static void premain(String args, Instrumentation inst) {// 1. 创建插件扫描器// PluginConfig会加载plugins/目录下的所有插件定义文件(如apm-dubbo-plugin.xml)// PluginFinder根据这些配置建立"类名->对应插件"的映射关系PluginFinder finder = new PluginFinder(new PluginConfig());// 2. 安装字节码增强器// 将Instrumentation实例与插件扫描器绑定,后续所有类加载时都会触发扫描器检查// ByteBuddyAgent内部通过java.lang.instrument.ClassFileTransformer实现字节码注入ByteBuddyAgent.install(inst, finder);
}
支持三种数据采集模式:
- 自动探针:零代码修改
- 手动埋点:通过@Trace注解等
- 服务网格集成:Istio/Envoy数据适配
2. 高性能数据处理流水线
关键优化点:
- 异步非阻塞IO模型
- 多级缓冲队列
- 批处理写优化
- 压缩传输
3. 可扩展存储架构
# 存储模块配置(支持动态扩展)
storage:# 1. 存储类型选择器 - 核心扩展点# 通过环境变量SW_STORAGE动态指定存储类型(默认elasticsearch)# 可扩展值:elasticsearch/h2/mysql/tidb/influxdb等selector: ${SW_STORAGE:elasticsearch} # 2. Elasticsearch配置组 - 插件化实现案例elasticsearch:# 命名空间隔离(多租户支持)nameSpace: ${SW_NAMESPACE:""}# 集群节点动态配置 - 支持水平扩展# 格式:ip1:port,ip2:port 可通过SW_STORAGE_ES_CLUSTER_NODES覆盖clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}# 其他可扩展参数示例:# - indexShardsNumber: 分片数扩展# - bulkActions: 批量写入规模调整
支持存储类型:
- Elasticsearch(生产推荐)
- H2(开发测试)
- TiDB/MySQL(关系型方案)
- BanyanDB(SkyWalking自研时序数据库)
四、分布式协调与一致性保障机制
该架构通过分片路由、多级聚合和一致性协议的组合,在分布式环境下实现数据有序处理。
1. 数据分片路由机制
- 哈希分片策略:Agent根据TraceID/ServiceID等关键字段计算哈希值,确定目标OAP节点,确保相同业务链路的请求始终路由到同一节点处理
- 动态负载均衡:OAP集群通过心跳检测实时同步节点负载状态,Agent侧动态调整路由权重(如基于CPU/内存使用率)
- 混合角色设计:默认所有OAP节点均为Mixed角色(同时承担接收和聚合),大规模部署时可分离为Receiver和Aggregator两类专用节点
2. 分布式计算协同
处理阶段 | 协调机制 |
初次聚合 | Receiver节点完成本地指标计算,需跨节点聚合的数据通过Data Bus分发 |
二次聚合 | Aggregator节点按分片规则接收数据,完成全局聚合后写入存储 |
冲突解决 | 采用时间戳+版本号机制,对重复数据执行去重(如选择时间戳最新的记录) |
3. 一致性保障技术
- 最终一致性模型:通过异步批处理实现指标聚合,容忍秒级延迟但保证最终结果准确
- 向量时钟(Vector Clock):记录数据版本演化路径,解决跨节点时钟不同步导致的分歧
- 幂等设计:所有数据处理操作支持重复执行,避免网络重传导致的数据重复计算
4. 容错与恢复
- 检查点(Checkpoint):定期持久化处理进度,故障恢复时从最近检查点继续处理
- 冗余副本:关键数据在多个OAP节点保留副本,主节点故障时自动切换
- 补偿机制:对超时/失败任务启动重试或回滚,确保数据不丢失
五、性能优化实践
1. Agent端优化:
- 适当调整采样率
- 过滤非关键Span
- 启用压缩传输
2. 服务端优化:
core:default:# 调整工作线程数restThreads: ${SW_CORE_REST_THREADS:2}# 增大处理队列restQueueSize: ${SW_CORE_QUEUE_SIZE:10000}
3. 存储层优化:
a. ES分片策略优化
b. 冷热数据分离
c. 索引生命周期管理
六、与其他APM系统架构对比
特性 | SkyWalking | Zipkin | Pinpoint |
代码侵入性 | 低 | 中 | 低 |
扩展性 | 高(模块化) | 一般 | 一般 |
存储多样性 | 支持多种 | 有限 | HBase为主 |
语言支持 | 多语言 | 多语言 | Java为主 |
云原生支持 | 优秀 | 一般 | 有限 |
结语
SkyWalking通过其模块化、可扩展的架构设计,在分布式系统监控领域展现出强大的适应能力。其架构演进始终围绕三个核心原则:
- 对业务透明:最小化侵入性
- 高性能处理:应对大规模部署
- 开放生态:多语言多协议支持
相关文章:

SkyWalking架构深度解析:分布式系统监控的利器
一、SkyWalking概述 SkyWalking是一款开源的APM(应用性能监控)系统,专门为微服务、云原生和容器化架构设计。它由Apache软件基金会孵化并毕业,已成为分布式系统监控领域的明星项目。 核心特性 分布式追踪:跨服务调用链路的完整追踪服务…...

vue2中的render函数
<script> export default {components: {},name: "renderElems",render (h, context) {return this.$attrs.vnode;},updated() {} } </script> <style scoped> </style>分析一下上面.vue组件: 组件结构: 这是一个非…...
逆向工程开篇(连载中)
项目特点 这个专栏专门设计用于汇编逆向工程研究,包含: ✅ 18个测试模块,覆盖所有主要C语言特性✅ 1200行工具类代码,400行主程序代码✅ 完整的Visual Studio 2017项目支持✅ Debug和Release两种构建配置✅ 静态库和可执行文件分…...
this.$set() 的用法详解(Vue响应式系统相关)
1. 什么是 this.$set()? this.$set(target, key, value) 是 Vue 2 中提供的一个方法,用于向响应式对象中动态添加属性,确保新加的属性同样是响应式的。 2. 为什么需要它? Vue 2 的响应式系统基于 Object.defineProperty&#…...

PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法|文献速递-深度学习医疗AI最新文献
Title 题目 PARADISE: Personalized and regional adaptation for HIE disease identification and segmentation PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法 1 文献速递介绍 缺氧缺血性脑病&…...
RabbitMQ 监控与调优实战指南(二)
五、调优策略与实战:对症下药提升性能 5.1 配置参数调优 在 RabbitMQ 的性能优化中,合理调整配置参数是关键的一环,这些参数涉及内存、磁盘、网络等多个资源层面,对 RabbitMQ 的整体性能有着深远的影响。 内存相关配置…...

WordPress子主题RiPro-V5van无授权全开源版(源码下载)
WordPress子主题RiPro-V5van无授权全开源版,直接上使用方法:WordPress后台上传就行 这个主题是1.0版本开源的,有能力的可以二次开发一下加一些自己喜欢的功能。 源码下载:https://download.csdn.net/download/m0_66047725/90952148 更多资…...
保姆级Elasticsearch集群部署指导
一、环境准备 1. 硬件要求(单节点建议) CPU:至少2核(生产环境4核)内存:至少4GB(生产环境建议16GB,且为偶数,如8GB、16GB)磁盘:至少50GB SSD&…...
PyQt实现3维数组与界面TableWidget双向绑定
以下是一个使用PyQt实现3维数组与界面TableWidget双向绑定的示例代码。该程序包含一个下拉菜单选择第0维索引,表格展示第1维和第2维的数据,并支持双向数据同步: import sys import numpy as np from PyQt5.QtWidgets import (QApplication, …...

StoreView SQL,让数据分析不受地域限制
作者:章建(处知) 引言 日志服务 SLS 是云原生观测和分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持【1】,方便用户可以根据数据源就近接入 SLS 服务,…...
护网面试题目2025
护网基础试题 一、描述外网打点的流程? 靶标确认、信息收集、漏洞探测、漏洞利用、权限获取。最终的目的是获取靶标的系统权限/关键数据。在这个过程中,信息收集最为重要。掌握靶标情报越多,后续就会有更多的攻击方式去打点。比如ÿ…...
Figma 与 Cursor 深度集成的完整解决方案
以下是 Figma 与 Cursor 深度集成的完整解决方案,实现设计-开发无缝协作: 一、集成架构设计 #mermaid-svg-NdvcKTZAZfX9DiUO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NdvcKTZAZfX9DiUO…...

UCRT 和 MSVC 的区别(Windows 平台上 C/C++ 开发相关)
UCRT 和 MSVC 是与 Windows 平台上 C/C 开发相关的两个重要概念,它们都属于 Microsoft 的开发工具链的一部分。下面详细解释它们的含义、区别以及用途。 一、UCRT(Universal C Runtime) 1. 含义: UCRT(Universal C …...

rabbitmq Fanout交换机简介
给每个服务创建一个队列,然后每个业务订阅一个队列,进行消费。 如订单服务起个多个服务,代码是一样的,消费的也是同一个队列。加快了队列中的消息的消费速度。 可以看到两个消费者已经在消费了...
【机器学习】集成学习与梯度提升决策树
目录 一、引言 二、自举聚合与随机森林 三、集成学习器 四、提升算法 五、Python代码实现集成学习与梯度提升决策树的实验 六、总结 一、引言 在机器学习的广阔领域中,集成学习(Ensemble Learning)犹如一座闪耀的明星,它通过组合多个基本学习器的力量,创造出…...
Palo Alto Networks Expedition存在命令注入漏洞(CVE-2025-0107)
免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...
WebFuture:Ubuntu 系统上在线安装.NET Core 8 的步骤
方法一:使用官方二进制包安装 下载.NET Core 8 SDK 二进制包:访问 .NET Core 8 SDK 官方下载页面,根据你的系统架构选择对应的 Linux x64 版本等下载链接,将其下载到本地4. 创建安装目录:在终端中执行以下命令创建用于…...

JAVA-springboot JUnit单元测试
SpringBoot从入门到精通-第9章 JUnit单元测试 一、JUnit与单元测试 JUnit是一个开源的测试框架,虽然可以用于测试大多数编程语言的应用程序,但特别适合用于测试Java语言的应用程序。 软件测试一般分为4个阶段,即单元测试、集成测试、系统测…...
hot100 -- 6.矩阵系列
1.矩阵置零 问题:给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 方法:记录行列 置0 # 记录行列,分别置0 def set_zero(matrix):row, col [], []# 统计0元素…...

PyCharm中运行.py脚本程序
1.最近在弄一个python脚本程序,记录下运行过程。 2.编写的python程序如下 # # Copyright 2017 Pixar # # Licensed under the terms set forth in the LICENSE.txt file available at # https://openusd.org/license. # # Check whether this script is being run …...
吴恩达MCP课程(5):research_server_prompt_resource.py
代码 import arxiv import json import os from typing import List from mcp.server.fastmcp import FastMCPPAPER_DIR "papers"# Initialize FastMCP server mcp FastMCP("research")mcp.tool() def search_papers(topic: str, max_results: int 5) …...

[论文阅读] 人工智能+项目管理 | 当 PMBOK 遇见 AI:传统项目管理框架的破局之路
当PMBOK遇见AI:传统项目管理框架的“AI适配指南” 论文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …...

Gateway 搭建
1.创建 moudle 命名为 gateway 2,pom中引入依赖 网关依赖;注册中心依赖等 <!-- 网关依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></d…...

pytorch基本运算-导数和f-string
引言 在前序对机器学习的探究过程中,我们已经深刻体会到人工智能到处都有微分求导运算,相关文章链接包括且不限于: BP神经网络 逻辑回归 对于pytorch张量,求导运算必不可少,所以本次就专门来学习一下。 f-string的用…...
impala中更改公网ip为内网ip
实际有时候需求中需要将公网的impala监听ip改为内网的ip 步骤 1,更改配置文件中的ip 1,更改/etc/default/impala中的ip配置重启服务即可在hive元数据同一个节点上要启动sudo service impala-state-store restartsudo service impala-catalog restart所有…...

5.RV1126-OPENCV 图形计算面积
一.图形面积、弧长计算介绍 前面我们已经把图形轮廓的检测、画框等功能讲解了一遍。这次主要结合轮廓检测的 API 去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的 API 如 contourArea…...
一键净化Excel数据:高性能Python脚本实现多核并行清理
摘要 本文分享两个基于Python的Excel数据净化脚本,通过多进程并行技术清除工作表内不可见字符、批注、单元格样式等冗余内容,利用OpenPyXL实现底层操作,结合tqdm进度条和进程级任务分配,可快速处理百万级单元格数据。适用于数据分…...

【Android基础回顾】一:Binder机制是什么?有什么用?
Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)? 众所周知,Android系统基于Linux开发,Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…...

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上
题目:1731. 每位经理的下属员工数量 题解: select employee_id,name,reports_count,average_age from Employees t1,(select reports_to,count(*) reports_count,round(avg(age)) average_agefrom Employeeswhere reports_to is not nullgroup by repor…...

资产智慧管理安全监测中心
在数字经济高速发展的今天,资产管理的智能化已成为企业降本增效的核心竞争力。从智慧园区到古建筑群,从交通枢纽到城市电网,资产智慧管理安全监测中心正以物联网、人工智能、数字孪生等技术为支撑,构建起资产全生命周期的“智慧大…...