当前位置: 首页 > news >正文

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),避免数据泄露。

 

 

 

 

 

 

相关文章:

  • pcie phy-电气层-gen1/2(TX)
  • 无人机减震模块运行与技术要点分析!
  • 关于如何本地启动xxl-job,并且整合SpringBoot
  • 华三H3C交换机配置NTP时钟步骤 示例
  • Oc语言学习 —— 重点内容总结与拓展(上)
  • 【Linux】Shell脚本中向文件中写日志,以及日志文件大小、数量管理
  • Spring 框架中适配器模式的五大典型应用场景
  • 职业院校物联网安装调试员(工业数智技术)实训解决方案
  • LeetCode 746 使用最小花费爬楼梯
  • matlab求解问题
  • Java注解详解:从入门到实战应用篇
  • Redisson分布式锁-锁的可重入、可重试、WatchDog超时续约、multLock联锁(一文全讲透,超详细!!!)
  • Qt窗口中消除边框的解决方法
  • HarmonyOS 开发之 —— 合理使用动画与转场
  • 【第七节】ESP32-S3 霍尔传感器应用实战:磁场检测与蜂鸣器控制
  • 消息扩散--tarjan缩点
  • 反转链表链表数据结构oj题(206)
  • 【未完】【GNN笔记】EvolveGCN:Evolving Graph Convolutional Networks for Dynamics Graphs
  • 测试:TestCafe - 判断按钮是否活性化
  • 【Elasticsearch】flattened`类型在查询嵌套数组时可能返回不准确结果的情况
  • 坚决打好产业生态培育攻坚战!陈吉宁调研奉贤区
  • 上海国际珠宝时尚功能区未来三年如何建设?六大行动将开展
  • 博物馆日|为一个展奔赴一座城!上海171家博物馆等你来
  • “多规合一”改革7年成效如何?自然资源部总规划师亮成绩单
  • 娃哈哈:调整产销布局致部分工厂停工,布局新产线可实现自主生产,不排除推新品牌
  • 中哥两国元首共同见证签署《中华人民共和国政府与哥伦比亚共和国政府关于共同推进丝绸之路经济带和21世纪海上丝绸之路建设的合作规划》