SkyWalking的工作原理和搭建过程

发布于:2025-05-17 ⋅ 阅读:(22) ⋅ 点赞:(0)

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_99
    op: ">"
    threshold: 1000
    period: 10
    count: 3
    silence-period: 5
2. 告警发送
  • 支持多种通知方式:邮件、Webhook、Slack、钉钉等。
  • 告警分组与聚合:合并同类告警,避免频繁通知。

六、性能优化与存储策略

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

七、多语言支持

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

八、与其他 APM 系统对比

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

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

二、SkyWalking 集群搭建

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

    组件 CPU 内存 存储(SSD) 网络
    OAP Server 4 核 + 8GB+ 50GB+ 千兆网卡
    Storage 按需 按需 按需 (如 ES 需高 IO)
    UI 2 核 + 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: true
      name: "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),避免数据泄露。

 

 

 

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到