SkyWalking 分布式追踪系统
随着微服务架构的流行,一些微服务架构下的问题也会越来越突出,比如一个请求会涉及多个服务,而服务本身可能也会依赖其他服务,整个请求路径就构成了一个网状的调用链,而在整个调用链中一旦某个节点发生异常,整个调用链的稳定性就会受到影响,所以会深深的感受到 “银弹” 这个词是不存在的,每种架构都有其优缺点 。
SkyWalking是一个开源监控平台,用于从服务和云原生基础设施收集、分析、聚合和可视化数据。
SkyWalking提供了一种简单的方法来维护分布式系统的清晰视图,甚至可以跨云查看。它是一种现代APM,专门为云原生、基于容器的分布式系统设计。
SkyWalking从三个维度对应用进行监视:service(服务), service instance(实例), endpoint(端点)
service: 一个服务
Service Instance: 服务的实例(1个服务会启动多个节点)
Endpoint: 一个服务中的其中一个接口
服务和实例就不多说了,端点是服务中的某个路径或者说URI
SkyWalking允许用户了解服务和端点之间的拓扑关系,查看每个服务/服务实例/端点的度量,并设置警报规则。
1.架构
SkyWalking逻辑上分为四个部分:Probes(探针), Platform backend(平台后端), Storage(存储), UI
可以看到主要由四部分组成:
- Agent(也叫Probe):代理或者探针,集成在被监测的应用中(SDK形式或者动态注入),采集应用的数据发送给后端(OAP)。
- UI:自带的Web页面。
- OAP:后端,接收Agent的数据并进行分析。Agent和OAP通信走的是gRPC,端口号默认为11800;UI和OAP通信走的是HTTP接口,端口号默认为12800。
- Storage:后端存储,OAP处理后的数据存储在这里。生产比较常用的是MySQL和ES。
这个结构就很清晰了,探针就是Agent负责采集数据并上报给服务端,服务端对数据进行处理和存储,UI负责展示
SkyWalking 的核心是数据分析和度量结果的存储平台,通过 HTTP 或 gRPC 方式向 SkyWalking Collecter 提交分析和度量数据,SkyWalking Collecter 对数据进行分析和聚合,存储到 Elasticsearch、H2、MySQL、TiDB 等其一即可,最后我们可以通过 SkyWalking UI 的可视化界面对最终的结果进行查看。Skywalking 支持从多个来源和多种格式收集数据:多种语言的 Skywalking Agent 、Zipkin v1/v2 、Istio 勘测、Envoy 度量等数据格式。
整体架构看似模块有点多,但在实际上还是比较清晰的,主要就是通过收集各种格式的数据进行存储,然后展示。所以搭建 Skywalking 服务我们需要关注的是 SkyWalking Collecter、SkyWalking UI 和 存储设备,SkyWalking Collecter、SkyWalking UI 官方下载安装包内已包含,最终我们只需考虑存储设备即可。
Backend的gRPC相关的API可访问0.0.0.0/11800,rest相关的API可访问0.0.0.0/12800。
在Java,.NetCore,Node.js, Istio agents/probe中,设置gRPC服务地址为ip/host:11800。 (ip/host填写Backend暴露的)
UI 监听8080 端口,同时请求127.0.0.1/12800来做GraphQL查询。
2.下载与安装
SkyWalking有两种版本,ES版本和非ES版。
如果我们决定采用ElasticSearch作为存储,那么就下载es版本。(老版本区分,新版本不区分)
https://skywalking.apache.org/downloads/
https://archive.apache.org/dist/skywalking/
agent目录将来要拷贝到各服务所在机器上用作探针
bin目录是服务启动脚本
config目录是配置文件
oap-libs目录是oap服务运行所需的jar包
webapp目录是web服务运行所需的jar包
SkyWalking 个人建议直接下载官方编译好的,下载地址:https://skywalking.apache.org/downloads/
然后在解压后的目录执行bin/startup.sh即可启动(Windows下执行startup.bat),这样默认启动了两个模块:
- Skywalking UI,默认端口为8080。
- Skywalking OAP,即后端。默认存储使用的是H2数据库,对于测试和体验来说,够用了。
config/application.yml 的默认数据存储开启是的 h2,可以修改数据存储为 Elasticsearch(在启动 SkyWalking 之前,确保 Elasticsearch 已启动)
SkyWalking 的启动包括两部分,一个是 SkyWalking Collector(oapService) ,一个是 SkyWalking UI(webappService)
可以分别启动 oapService 和 webappService,也可以通过 startup 一次性全部启动,从 startup 中的命令可以知道其实就是分别启动 oapService 和 webappService。
如果一切顺利,这时候就可以通过 http://localhost:8080 来查看 SkyWalking UI 了(默认全是0,截图是测试效果),默认账号/密码:admin/admin。
3.后端存储用es
修改skywalking下config/application.yml 中配置es地址即可
storage:
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch7:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.100.14:9200,192.168.100.15:9200,192.168.100.19:9200}
4.安装Agent
将agent目录拷贝至各服务所在的机器上
plugins是探针用到各种插件,SkyWalking插件都是即插即用的,可以把optional-plugins中的插件放到plugins中
修改 agent/config/agent.config
配置文件,也可以通过命令行参数指定
主要是配置服务名称和后端服务地址
agent.service_name=${SW_AGENT_NAME:user-center}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.100.17:11800}
在服务启动的时候用命令行参数 -javaagent 来指定探针
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar
例如:
java -javaagent:./agent/skywalking-agent.jar -Dspring.profiles.active=dev -Xms512m -Xmx1024m -jar demo-0.0.1-SNAPSHOT.jar
5.启动服务
修改 webapp/webapp.yml
文件,更改端口号及后端服务地址
server:
port: 9000
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
# Point to all backend's restHost:restPort, split by ,
listOfServers: 127.0.0.1:12800
# 启动服务
bin/startup.sh
# 或者分别依次启动
bin/oapService.sh
bin/webappService.sh
查看logs目录下的日志文件,看是否启动成功
浏览器访问 http://127.0.0.1:9000
6.告警
编辑 alarm-settings.yml 设置告警规则和通知:
https://github.com/apache/skywalking/blob/v8.2.0/docs/en/setup/backend/backend-alarm.md