SkyWalking的工作原理和搭建过程

SkyWalking 是一个开源的 应用性能监控系统(APM),专为云原生、微服务架构设计。其核心原理基于 分布式追踪(Distributed Tracing)指标收集(Metrics Collection) 和 日志关联(Log Correlation),通过无侵入或轻量级的方式实现全链路监控。

一、整体架构与组件原理

SkyWalking 采用 四层架构 设计,各组件分工明确:

1. Agent(数据采集层)
  • 功能
    • 无侵入式监控:通过字节码增强技术(如 Java Agent)自动收集应用性能数据。
    • 轻量级 SDK:为非 Java 语言(如 Node.js、Python)提供手动埋点 SDK。
  • 采集内容
    • 请求链路数据(Trace):记录请求在各服务间的调用路径和耗时。
    • 指标数据(Metrics):如响应时间、吞吐量、错误率。
    • 环境元数据:服务拓扑关系、实例信息。
2. OAP Server(数据分析层)
  • 接收核心服务(Receiver)
    • 支持多种协议接收数据:如 gRPC、HTTP、Kafka、Zipkin 等。
    • 数据格式转换:将不同来源的数据统一为内部格式。
  • 分析引擎(Analysis)
    • 流处理:实时分析数据流,计算指标(如 P99 响应时间)。
    • 关联分析:将 Trace、Metrics 和日志关联,构建服务拓扑图。
    • 告警引擎:基于规则触发告警(如响应时间超过阈值)。
  • 存储服务(Storage)
    • 支持多种存储后端:Elasticsearch、H2、MySQL、TiDB 等。
3. UI(用户交互层)
  • 提供可视化界面,展示:
    • 服务拓扑图:直观呈现服务间依赖关系。
    • 性能指标面板:如 QPS、响应时间趋势。
    • 分布式追踪详情:查看完整调用链和瓶颈点。
    • 告警历史:查看和管理触发的告警。

二、分布式追踪原理

1. 基本概念
  • Span(跨度)
    • 表示调用链中的一个操作单元(如一次方法调用、SQL 查询)。
    • 包含元数据:操作名称、开始 / 结束时间、标签(如错误信息)。
  • Trace(追踪)
    • 由多个 Span 组成的有向无环图(DAG),表示一次完整请求的路径。
  • 上下文传递
    • 通过 HTTP Header 或消息队列传递 TraceID 和 SpanID,跨服务追踪。
2. 追踪流程

plaintext

 

  1. 客户端发起请求:生成全局唯一的 TraceID 和根 SpanID。
  2. 服务 A 处理请求
    • 记录自身 Span 信息(如处理时间)。
    • 将 TraceID 和 SpanID 通过 HTTP Header 传递给服务 B。
  3. 服务 B 接收请求
    • 提取 TraceID 和 SpanID,创建子 Span。
    • 继续传递上下文到服务 C。
  4. 数据聚合
    • 各服务将 Span 数据发送给 OAP Server。
    • OAP Server 根据 TraceID 关联所有 Span,还原完整调用链。

三、指标收集与分析

1. 指标类型
  • 服务级指标:如 QPS、平均响应时间、错误率。
  • 实例级指标:如 CPU / 内存使用率、线程数。
  • 端点级指标:如特定 URL 或方法的性能。
2. 指标计算
  • 原生指标:直接从 Agent 采集,如请求数、响应时间。
  • 派生指标:通过计算得到,如:
    • P99 响应时间:排序后 99% 位置的值,反映系统最差性能。
    • 吞吐量:单位时间内的请求数。
    • 错误率:失败请求数占比。
3. 聚合与降维
  • 时间窗口聚合:按分钟 / 小时 / 天聚合指标,减少存储压力。
  • TopN 算法:只保留最耗时或最频繁的操作,忽略噪声数据。

四、服务发现与拓扑构建

1. 自动服务发现
  • 基于流量分析:通过分析请求路径,自动识别服务间调用关系。
  • 元数据上报:Agent 主动上报服务名称、实例信息。
2. 拓扑图生成
  • 节点:表示服务或组件(如数据库、消息队列)。
  • :表示调用关系,边的粗细表示调用频率,颜色表示健康状态。
  • 动态更新:实时刷新拓扑图,反映服务关系变化。

五、告警机制

1. 告警规则配置
  • 内置规则:如响应时间超过阈值、错误率突增。
  • 自定义规则:通过 YAML 配置,支持 PromQL 表达式:
rules:service_resp_time_rule:metrics-name: service_resp_time_percentile_99op: ">"threshold: 1000period: 10count: 3silence-period: 5
2. 告警发送
  • 支持多种通知方式:邮件、Webhook、Slack、钉钉等。
  • 告警分组与聚合:合并同类告警,避免频繁通知。

六、性能优化与存储策略

1. 数据采样
  • 固定比例采样:如每 100 个请求采集 1 个(配置agent.sample_n_per_3_secs)。
  • 智能采样:对异常请求(如错误请求)全量采集,正常请求降采样。
2. 存储优化
  • 冷热分离
    • 热数据(最近 7 天)存储在高性能节点(如 ES 热节点)。
    • 冷数据(历史数据)迁移到低成本存储(如 ES 冷节点)。
  • TTL 配置:自动删除过期数据,避免存储爆炸。

七、多语言支持

语言支持方式特点
Java无侵入 Agent通过字节码增强,无需修改代码
PythonSkywalking-Python SDK需少量埋点,支持 Django、Flask 等框架
Node.jsSkywalking-NodeJS SDK支持 Express、Koa 等框架
GoSkywalking-Go SDK手动埋点为主,提供 HTTP、gRPC 等中间件
C++Skywalking-C++ SDK适用于高性能场景,需手动集成
.NETSkyAPM-dotnet支持ASP.NET Core 等框架

八、与其他 APM 系统对比

特性SkyWalkingJaegerZipkin
分布式追踪
自动服务发现❌(需手动配置)❌(需手动配置)
服务拓扑可视化
告警机制❌(需依赖 Prometheus)❌(需依赖外部系统)
存储支持ES/H2/MySQL/TiDB 等ES/Cassandra 等ES/MySQL 等
社区活跃度高(Apache 顶级项目)

通过以上机制,SkyWalking 实现了对分布式系统的全链路监控,帮助开发者快速定位性能瓶颈、故障根因,优化系统架构。其核心优势在于无侵入式采集、高性能分析引擎和强大的可视化能力,特别适合云原生微服务环境。

二、SkyWalking 集群搭建

1. 环境准备
  • 硬件要求(单节点参考,根据数据量调整):

    组件CPU内存存储(SSD)网络
    OAP Server4 核 +8GB+50GB+千兆网卡
    Storage按需按需按需(如 ES 需高 IO)
    UI2 核 +4GB+20GB+公网可达
  • 软件依赖

    • Java 11+(OAP 和 UI 均需)
    • 存储组件(可选,推荐 Elasticsearch 7.x/8.x 或 Apache H2)
    • ZooKeeper(用于集群管理,可选,适用于多 OAP 节点)
2. 部署流程(以 Elasticsearch 存储为例)
步骤 1:下载安装包
# 官网下载最新版(如9.4.0)
wget https://archive.apache.org/dist/skywalking/9.4.0/apache-skywalking-apm-9.4.0.tar.gz
tar -zxvf apache-skywalking-apm-9.4.0.tar.gz
cd apache-skywalking-apm-bin
步骤 2:配置 OAP Server
  • 修改配置文件config/application.yml

# 存储配置(以 Elasticsearch 为例)
storage:selector: ${SW_STORAGE:elasticsearch7}elasticsearch7:namespaces: ${SW_NAMESPACE:""}clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.1.100:9200,192.168.1.101:9200}  # ES集群地址protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}user: ${SW_STORAGE_ES_USER:""}  # 如有认证password: ${SW_STORAGE_ES_PASSWORD:""}compression: ${SW_STORAGE_ES_COMPRESSION:"false"}trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}# 集群配置(多OAP节点时启用ZooKeeper)
cluster:selector: ${SW_CLUSTER:zookeeper}zookeeper:namespace: ${SW_NAMESPACE:""}servers: ${SW_CLUSTER_ZK_SERVERS:192.168.1.102:2181,192.168.1.103:2181}  # ZooKeeper地址
步骤 3:配置 UI
  • 修改配置文件webapp/application.yml
  • server:port: 8080  # UI端口
    management:port: 8081  # 管理端口
    oapServer:# OAP集群地址(逗号分隔)hosts: ${SW_OAP_ADDRESS:http://192.168.1.104:12800,http://192.168.1.105:12800}
步骤 4:启动集群
  • 单节点启动(测试环境)
  • # 启动OAP(后台运行)
    ./bin/oapService.sh start
    # 启动UI
    ./bin/webappService.sh start
  • 多节点集群(生产环境)
    1. 在所有 OAP 节点重复步骤 2(确保 ZooKeeper 和 ES 配置一致)。
    2. 依次启动各节点的 OAP 服务,通过 ZooKeeper 实现节点发现。
    3. 启动 UI 服务,指向任意 OAP 节点地址。
3. 数据采集配置(以 Java 应用为例)
  1. 下载 Agent
cd agents
# 或从官网下载对应语言的Agent(如Java、Python等)

配置 Agent

vi config/agent.config
agent.name=your-application-name  # 应用名称
collector.backend_service=192.168.1.104:11800,192.168.1.105:11800  # OAP集群地址

启动应用

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=your-app -jar your-app.jar

二、SkyWalking 集群维护

1. 日常监控与巡检
  • 核心指标
    • OAP 节点状态:CPU / 内存利用率、GC 频率、线程数。
    • 存储性能:ES 集群健康度、索引写入延迟、磁盘利用率。
    • UI 响应时间:页面加载速度、接口调用成功率。
  • 工具推荐
    • 用 Prometheus+Grafana 监控 SkyWalking 自身指标(需开启 OAP 的 Prometheus exporter)。
    • ES 内置监控工具(如 Dev Tools、Kibana)。
2. 数据管理
  • 索引生命周期管理(ILM)
# 在OAP配置中启用ILM(ES 7.x+推荐)
elasticsearch7:index:prefix: ${SW_NAMESPACE:"skywalking"}suffix: ${SW_DATAFLOW_SUFFIX:""}lifecycle:enable: truename: "skywalking-lifecycle"  # ES中需提前创建生命周期策略rollover:max_docs: 5000000  # 单个索引最大文档数max_size: 50gb     # 单个索引最大存储大小
  • 数据清理
    • 定期删除历史索引(如保留 7 天数据),避免存储爆炸。
    • 对低频查询数据归档到冷存储(如 ES Cold 节点)。
3. 集群扩展与升级
  • 横向扩展 OAP 节点

    1. 新增服务器,复制 OAP 配置(保持 ZooKeeper 和 ES 地址一致)。
    2. 启动新节点,自动加入集群(通过 ZooKeeper 协调)。
    3. 更新 UI 配置中的 OAP 地址列表。
  • 版本升级

    1. 停止所有 OAP 节点和 UI 服务。
    2. 备份存储数据(如 ES 快照)。
    3. 替换新版本安装包,更新配置(注意版本兼容性)。
    4. 按顺序启动 OAP 集群和 UI,验证数据采集正常。

三、常见问题与处理

1. 数据采集失败
  • 可能原因
    • Agent 配置错误(如 OAP 地址错误、端口被防火墙拦截)。
    • OAP 存储连接失败(ES 集群不可用、认证信息错误)。
  • 解决方法
    1. 检查 Agent 日志(logs/skywalking-agent.log),确认是否连接到 OAP。
    2. 测试 OAP 节点与存储组件的网络连通性(如telnet ES_IP 9200)。
    3. 重启 OAP 服务,查看启动日志(logs/oap-server.log)中的错误信息。
2. UI 界面无数据
  • 可能原因
    • 应用未正确关联 Agent(服务名重复或未配置)。
    • OAP 集群节点间数据同步失败(ZooKeeper 故障)。
  • 解决方法
    1. 确认 Agent 的agent.name唯一且与 UI 中展示的服务名一致。
    2. 检查 ZooKeeper 集群状态,确保 OAP 节点正常注册。
    3. 手动触发一次数据采集(如调用应用接口),观察 ES 中是否生成新索引。
3. 存储性能瓶颈
  • 可能原因
    • ES 集群分片数不合理,导致写入压力集中。
    • OAP 数据采集频率过高,超过存储处理能力。
  • 解决方法
    • 调整 ES 索引分片数(如PUT /skywalking-*/_settings?preserve_existing=true {"index.number_of_shards": 5})。
    • 在 OAP 配置中降低采样率(sampling: ${SW_SAMPLING:1000},值越大采样率越低)。
4. 集群节点失联
  • 可能原因
    • 节点间网络中断(如交换机故障、防火墙策略变更)。
    • ZooKeeper 会话超时(配置cluster.zookeeper.sessionTimeout过小)。
  • 解决方法
    1. 检查服务器间网络连通性,修复中断链路。
    2. 增大 ZooKeeper 会话超时时间(建议设置为 30 秒以上):
  • cluster:zookeeper:sessionTimeout: 30000  # 单位毫秒

 

四、最佳实践

  1. 高可用架构

    • OAP 节点至少部署 3 个,通过 ZooKeeper 实现故障自动切换。
    • 存储组件(如 ES)采用多节点集群,启用副本机制。
  2. 日志与告警

    • 配置 SkyWalking 自身告警(如通过 Webhook 发送到钉钉 / 邮件)。
    • 对 OAP 和存储组件的关键指标设置阈值(如 ES 磁盘利用率 > 80% 时告警)。
  3. 安全加固

    • 限制 UI 端口的公网访问,通过 Nginx+SSL 代理。
    • 对 ES 集群启用认证(如 X-Pack),避免数据泄露。

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考 系统架构设计师系列知识点之杂项集萃(57)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(56) 第93题 美国著名的卡内基梅隆大学软件工程学研究所针对软件工程的工程管理能力与水平进行了充分研究,提出了5级管理能力的模式,包括临时凑合阶段、简单模仿…

Java 泛型与类型擦除:为什么解析对象时能保留泛型信息?

引言&#xff1a;泛型的“魔术”与类型擦除的困境 在 Java 中&#xff0c;泛型为开发者提供了类型安全的集合操作&#xff0c;但其背后的**类型擦除&#xff08;Type Erasure&#xff09;**机制却常常让人困惑。你是否遇到过这样的场景&#xff1f; List<String> list …

【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总

HTTP/2协议特点 gRPC基于HTTP/2协议&#xff0c;原因&#xff1a; 多路复用&#xff1a;允许在同一个TCP连接上并行传输多个请求和响应&#xff0c;即多个gRPC调用可以通过同一个连接同时进行&#xff0c;避免了HTTP/1.x中常见的线头阻塞问题&#xff0c;减少了连接建立和关闭…

PCIe Switch 问题点

系列文章目录 文章目录 系列文章目录完善PCIe Retimer Overview Document OutlineSwitch 维度BroadComMicroChipAsmedia 祥硕Cyan其他 完善 Functional block diagram&#xff0c;功能框图Key Features and Benefits&#xff0c;主要功能和优点Fabric 链路Multi-root PCIe Re…

vue复杂数据类型多层嵌套的监听

vue复杂数据类型多层嵌套的监听 本来看前辈的做法是watch的嵌套&#xff0c;遇到这种复杂的数据结构还是不多&#xff0c;分享一下前辈的做法 let stopChildWatchList [] // 用于存放每个子监听器watch(() > data,(val) > {// 清除旧监听stopChildWatchList.forEach(…

来一个复古的技术FTP

背景 10年前的老代码&#xff0c;需要升级springboot框架&#xff0c;在升级过程中&#xff0c;测试业务流程里&#xff0c;有FTP的下载业务&#xff0c;不管测试环境如何测试&#xff0c;都没有成功&#xff0c;最后只能自己搭建一个FTP服务器&#xff0c;写一个ftp-demo来测试…

MyBatis-Flex配置Druid(德鲁伊数据库连接池):Spring Boot 3 集成 MyBatis-Flex 配置 Druid 连接池指南

Spring Boot 3 集成 MyBatis-Flex 配置 Druid 连接池指南 前言 本文详细讲解在 Spring Boot 3 项目中集成 MyBatis-Flex 框架后&#xff0c;如何正确配置 Druid 数据库连接池。针对开发者常见的配置缺失导致启动失败的场景&#xff0c;提供完整的解决方案和原理分析。 前置知识…

安全生产调度管理系统的核心功能模块

安全生产调度管理系统是运用现代信息技术构建的智能化管理平台&#xff0c;旨在实现生产安全风险的全面管控和应急资源的优化调度。该系统通过整合物联网、大数据、人工智能等前沿技术&#xff0c;建立起覆盖风险监测、预警预测、指挥调度、决策支持的全链条安全管理体系。 一…

桃芯ingchips——windows HID键盘例程无法同时连接两个,但是安卓手机可以的问题

目录 环境 现象 原理及解决办法 环境 PC&#xff1a;windows11 安卓&#xff1a;Android14 例程使用的是HID Keyboard&#xff0c;板子使用的是91870CQ的开发板&#xff0c;DB870CC1A 现象 连接安卓手机时并不会出现该现象&#xff0c;两个开发板都可以当做键盘给手机发按…

JavaScript - JavaScript 运算符之圆括号运算符与方括号运算符(圆括号运算符概述、圆括号运算符用法、方括号运算符概述、方括号运算符用法)

一、圆括号运算符概述 圆括号运算符&#xff08;()&#xff09;主要用于函数调用、表达式分组、多种语法结构登 二、圆括号运算符用法 调用函数 function greet() {console.log("Hello!"); }greet();# 输出结果Hello!当箭头函数有多个参数或零个参数时需要括号 c…

AG-UI 协议:重构多模态交互,开启智能应用新纪元

一、协议诞生的时代背景&#xff1a;填补 AI 生态最后一块拼图 在人工智能技术飞速发展的今天&#xff0c;AI 代理&#xff08;Agent&#xff09;作为能够主动执行复杂任务的智能实体&#xff0c;正从实验室走向生产环境&#xff0c;重塑各个行业的工作流程。然而&#xff0c;…

嵌入式学习的第二十天-数据结构-调试+链表的一般操作

一、调试 1.一般调试 2.找段错误 二、链表的一般操作 1.单链表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.单链表的销毁 int D…

如何同时管理不同平台的多个账号?

在当今数字营销、电商运营、跨境贸易盛行的时代&#xff0c;同时管理多个平台的账号几乎成了从业者的标配。无论是做社媒营销的广告主&#xff0c;还是操作亚马逊、eBay、Shopee 等平台的跨境卖家&#xff0c;多账号运营都是提升曝光、分散风险、扩大收益的重要方式。 然而&am…

STM32外设AD/DA-基础及CubeMX配置

STM32外设AD/DA-基础及CubeMX配置 一&#xff0c;什么是AD/DA二&#xff0c;基础概念1&#xff0c;模拟 vs 数字2&#xff0c;AD转换1&#xff0c;分辨率 (Resolution)2&#xff0c;参考电压 (Reference Voltage, Vref)3&#xff0c;采样率 (Sampling Rate) 3&#xff0c;DA转换…

【软考 霍夫曼编码的文档压缩比】

霍夫曼编码的文档压缩比计算基于字符频率的最优编码分配&#xff0c;以下是详细步骤及相关案例&#xff1a; 一、压缩比计算公式 [ \text{压缩比} \frac{\text{压缩前总比特数}}{\text{压缩后总比特数 编码表存储开销}} ] 通常以 比率&#xff08;如 3:1&#xff09; 或 百分…

关闭VSCode 自动更新

参考&#xff1a;关闭VSCode 自动更新_vscode关闭自动更新-CSDN博客 vscode的设置 Update: Mode Update: Enable Windows Background Updates Extensions: Auto Check Updates Extensions: Auto Update

Flask框架搭建

1、安装Flask 打开终端运行以下命令&#xff1a; pip install Flask 2、创建项目目录 在Windows上&#xff1a; venv\Scripts\activate 执行 3、创建 app.py 文件 可以在windows终端上创建app.py文件 &#xff08;1&#xff09;终端中创建 使用echo命令 echo "fr…

5G-A和未来6G技术下的操作系统与移动设备变革:云端化与轻量化的发展趋势

目录 5G技术带来的革命性变革 云端化操作系统的实现路径 完全云端化模式 过渡性解决方案 未来操作系统的发展方向 功能架构演进 安全机制强化 移动设备的形态变革 终端设备轻量化 物联网设备简化 实施挑战与应对策略 技术挑战 商业模式创新 总结与展望 5G技术作为…

【漫话机器学习系列】261.工具变量(Instrumental Variables)

工具变量&#xff08;Instrumental Variables&#xff09;通俗图解&#xff1a;破解内生性困境的利器 在数据建模与因果推断过程中&#xff0c;我们经常遇到一个棘手问题&#xff1a;内生性&#xff08;Endogeneity&#xff09;。它会导致模型估计产生偏差&#xff0c;进而误导…

CSS:颜色的三种表示方式

文章目录 一、rgb和rgba方式二、HEX和HEXA方式&#xff08;推荐&#xff09;三、hsl和hsla方式四、颜色名方式 一、rgb和rgba方式 10进制表示方法 二、HEX和HEXA方式&#xff08;推荐&#xff09; 就是16进制表示法 三、hsl和hsla方式 语法&#xff1a;hsl(hue, satura…