文章目录
- 前言
- 基础架构和概念
- 部署使用
- 准备
- 部署
- 单机部署
- 集群部署
- 总结
前言
由于之前项目的业务需求而使用了微服务的架构体系,而微服务架构中对于服务的监控治理能力甚为重要,所以在分析了市面上常见的一些链路追踪框架之后,最终选择了国产开源框架SkyWalking,同时它也是Apache基金会中的孵化项目,项目VP为吴晟大佬。
最初使用它的本意仅仅是因为其服务之间链路追踪的功能,了解使用之后,发现其功能强大远不止如此,正如官方文档中所说的那样,SkyWalking是一个开源的可观测平台,用于从服务和云原生基础设施收集, 分析, 聚合及可视化数据的应用程序性能监控系统(Application Performance Monitoring)。
基础架构和概念
我们先来看看SkyWalking官网上的基础架构图,
乍一下看可能有点似懂非懂,但细看可以发现,图中的架构体系所表现的功能还是非常全面强大的。大概总结下,从逻辑组成上,它的架构可以分为四个部分:
- 探针:主要是用来收集各个应用服务资源的数据,像图中的GUI/CLI、一些metrics系统、不同语言的应用系统(包括前后端),然后通过Http或gRPC的方式来上报系统中需要被监控的数据指标。
- 平台后端:用来对收集的系统监控数据进行处理、分析和聚合,同时支撑上游用户界面数据展示的API的观测分析平台(Observability Analysis Platform),简称为OAP平台。
- 存储:用来保存那些从各个服务资源收集的数据,默认是使用H2用来存储,也支持其他数据库,像Mysql、Elasticsearch、TiDB等等,同时官方也发布了更贴合SkyWalking的自研数据库BanyanDB,现在处于完善迭代中。但是目前实际项目中使用Elasticsearch作为存储可能更为常见。
- 用户界面:这是一套官方开源的UI平台,相信这对于开发运维来说是极其友好方便的,同时其UI风格也是非常简洁美观的,很符合程序员的高级审美。
那说完它的架构体系,我们再来看看它其中定义的一些基础概念,首先既然要监控应用系统数据,那肯定得知道需要监控的系统资源是什么,所以SkyWalking中将其定义划分为三种:
- 服务:官言是对请求提供相同行为的一组工作负载,其实就是服务的提供者,只不过通常这些服务是以集群的方式部署存在。
- 服务实例:就是服务集群中的某一个服务的实例,比如A机器上的服务A,B机器上的服务B。
- 端点:服务中的请求路径,可以理解为接口API,注意的是它不仅仅是Http的接口,还包括rpc中的调用方法。
部署使用
准备
目前SkyWalking的官方最新版本为v8.8.1,本文就先以当前版本的上一个版本,也就是v8.7.0为例部署使用,存储我们用的是Elasticsearch 7.x的版本(后面的SkyWalking都会选择es7的版本)。这里我们有两种选择去准备SkyWalking软件包:
源码构建:
# 下载源码,二选一
# git pull
$ git clone -b v8.7.0 --recurse-submodules https://github.com/apache/skywalking.git
cd skywalking/
# 官方下载
$ wget https://archive.apache.org/dist/skywalking/8.7.0/apache-skywalking-apm-8.7.0-src.tgz
# 解压
$ tar -zxvf apache-skywalking-apm-8.7.0-src.tgz
$ cd apache-skywalking-apm-8.7.0-src/
$
# maven构建
$ ./mvnw clean package -Dmaven.test.skip
$
# 查看编译结果
$ cd apm-dist-es7/target
$ tar -zxvf apache-skywalking-apm-es7-8.7.0.tar.gz
$ cd apache-skywalking-apm-bin-es7
$ ls -ls
total 92
0 drwxrwxr-x 9 1001 1002 176 Jul 30 21:15 agent # agent插件包
0 drwxr-xr-x 2 root root 241 Nov 5 10:49 bin # 启动脚本文件
4 drwxr-xr-x 11 root root 4096 Nov 5 10:49 config # SkyWalking OAP Server 配置文件
0 drwxr-xr-x 2 root root 68 Nov 5 10:49 config-examples
32 -rwxrwxr-x 1 1001 1002 31480 Jul 30 20:32 LICENSE
4 drwxrwxr-x 3 1001 1002 4096 Nov 5 10:49 licenses
32 -rwxrwxr-x 1 1001 1002 32519 Jul 30 20:32 NOTICE
16 drwxrwxr-x 2 1001 1002 12288 Jul 30 21:34 oap-libs # SkyWalking OAP Server 依赖包
4 -rw-rw-r-- 1 1001 1002 1951 Jul 30 20:32 README.txt
0 drwxr-xr-x 3 root root 30 Nov 5 10:49 tools
0 drwxr-xr-x 2 root root 53 Nov 5 10:49 webapp # SkyWalking UI
自己通过源码编译虽然稍微麻烦点,但是可以对当前版本的源码中一些未修复的issue,特别是当前项目中已经产生的问题进行修改并应用。
官方安装包: 官网下载页面下载操作系统对应的发布版,
$ mkdir skywalking
$ cd skywalking
# 下载
$ wget https://archive.apache.org/dist/skywalking/8.7.0/apache-skywalking-apm-es7-8.7.0.tar.gz
$ tar -zxvf apache-skywalking-apm-es7-8.7.0.tar.gz
$ cd apache-skywalking-apm-bin-es7
$ ls -ls
total 92
0 drwxrwxr-x 9 1001 1002 176 Jul 30 21:15 agent # agent插件包
0 drwxr-xr-x 2 root root 241 Nov 5 10:49 bin # 启动脚本文件
4 drwxr-xr-x 11 root root 4096 Nov 5 10:49 config # SkyWalking OAP Server 配置文件
0 drwxr-xr-x 2 root root 68 Nov 5 10:49 config-examples
32 -rwxrwxr-x 1 1001 1002 31480 Jul 30 20:32 LICENSE
4 drwxrwxr-x 3 1001 1002 4096 Nov 5 10:49 licenses
32 -rwxrwxr-x 1 1001 1002 32519 Jul 30 20:32 NOTICE
16 drwxrwxr-x 2 1001 1002 12288 Jul 30 21:34 oap-libs # SkyWalking OAP Server 依赖包
4 -rw-rw-r-- 1 1001 1002 1951 Jul 30 20:32 README.txt
0 drwxr-xr-x 3 root root 30 Nov 5 10:49 tools
0 drwxr-xr-x 2 root root 53 Nov 5 10:49 webapp # SkyWalking UI
其中SkyWalking OAP 服务的配置文件位置是config/application.yml
( 配置参数说明文档) ,大部分配置是通过application.yml OS系统环境变量设置的,其中一些支持上游管理系统的动态设置(动态配置文档)。
SkyWalking UI服务的配置文件位置:webapp/webapp.yml。
部署
单机部署
首先我们需要准备好Elasticsearch 服务,如果项目中已经有现成的,直接拿来用即可。部署流程如下:
1.搭建SkyWalking OAP服务:先修改OAP的配置文件,以设置Elasticsearch作为存储的数据库,
$ vi config/application.yml
storage:
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch7:
nameSpace: ${SW_NAMESPACE:"elasticsearch"}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
# trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
# trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}
dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index.
user: ${SW_ES_USER:""}
password: ${SW_ES_PASSWORD:""}
secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""}
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:1} # Shard number of new indexes
superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5}
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200}
advanced: ${SW_STORAGE_ES_ADVANCED:""}
这里面storage.selector
配置项用来设置具体的存储器,默认为{SW_STORAGE:elasticsearch7}。然后storage.elasticsearch7
配置项中修改nameSpace
、clusterNodes
,如果eleasticsearch开启了认证,需要修改user
、password
。更多参数的意义和设置参考官方参数文档,这里不在细说。
2.启动 SkyWalking OAP服务:
$ bin/oapServiceInit.sh
SkyWalking OAP started successfully!
打开logs/skywalking-oap-server.log日志文件,查看是否有错误日志,是否真正启动成功。首次启动时,因为 SkyWalking OAP 会创建大量的 Elasticsearch 的索引,所以可能会比较慢。SkyWalking后端支持多个存储实现器。它们中的大多数可以在后端启动时自动初始化存储,例如Elasticsearch 、Database。但是根据存储情况,会发生一些意外情况,例如 When create Elastic Search indexes concurrently, because of several backend instances startup at the same time.,发生了变化,Elastic Search的API会毫无例外地被阻止,而且这在k8s之类的容器管理平台中更有可能发生,那就需要启动Init模式。
2021-11-14 23:04:39,465 - org.apache.skywalking.oap.server.starter.OAPServerStartUp -2214 [main] INFO [] - OAP starts up in init mode successfully, exit now...
3.启动SkyWalking UI 服务:
$ bin/webappService.sh
SkyWalking Web Application started successfully!
打开 logs/logs/webapp.log 日志文件,查看是否有错误日志,是否真正启动成功。如果需要修改 SkyWalking UI 服务的参数,可以编辑 webapp/webapp.yml 配置文件。例如说:
-
server.port
:SkyWalking UI 服务端口。 -
spring.cloud.discovery.client.simple.instances.oap-service
:SkyWalking OAP 服务地址数组,因为 SkyWalking UI 界面的数据,是通过请求 SkyWalking OAP 服务来获得的。注意的是,8.7.0版本的UI后台由于引入了zuul对静态资源的代理,所以OAP地址不再是通过collector.ribbon.listOfServers
来设置的。
4.访问UI界面:
浏览器打开http://127.0.0.1:8080,如下图
当然跟图中不同的是这时候打开的界面是没有任何数据的,那是因为我们还没启动需要监控的应用系统,并将探针挂载上去收集数据。
5.启动 jar 应用,并配置 SkyWalking Agent:
启动项目的 Shell 脚本上,通过-javaagent参数进行配置SkyWalking Agent:agent/skywalking-agent.jar,在启动日志中可以看到SkyWalking Agent 被加载的日志。
$ java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=application_name -Dskywalking.collector.backend_service=ip:11800 -jar yourApp.jar
这当中更多的变量,可以在agent/config/agent.config查询看配置。
集群部署
生产项目中,通常为了保证服务的高可用性,都是通过集群来部署的,部署流程如下:
1.搭建Elasticsearch 服务集群,或者项目中已有的集群。
2.搭建注册中心的集群,目前 SkyWalking 支持 Zookeeper、Kubernetes、Consul、Nacos 作为注册中心,由于本身项目中用的Nacos,所以这里我选择Nacos 作为注册中心。
3.搭建SkyWalking OAP服务集群,集群模式下OAP服务的配置和启动基本与单机模式相差不多,但是集群模式下我们需要将 SkyWalking OAP 服务注册到注册中心上,所以我们需要修改以下配置,
$ vi config/application.yml
cluster:
selector: ${SW_CLUSTER:nacos}
nacos:
serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848}
# Nacos Configuration namespace
namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"}
-
cluster.selector
配置项用来设置具体的注册中心,默认为${SW_CLUDTER:standalone}
,这里修改为${SW_CLUDTER:nacos}
。 -
cluster.nacos
配置项修改hostPort
、namespace
。
4.搭建SkyWalking UI 服务集群,配置和启动基本与单机模式相差不多,同时使用 Nginx 进行负载均衡。另外在设置 SkyWalking UI 的spring.cloud.discovery.client.simple.instances.oap-service
地址时,也需要设置多个 SkyWalking OAP 服务的地址数组。
- 启动jar应用,并配置 SkyWalking Agent,配置基本与单机模式相差不多,但在设置 SkyWaling Agent 的
SW_AGENT_COLLECTOR_BACKEND_SERVICES
地址时,需要设置多个 SkyWalking OAP 服务的地址数组。
总结
我们先了解了SkyWalking的基本架构,然后又示例进行安装部署使用,但是这只是基础,相信在UI界面中,你会看到很多的监控指标,而这些指标的意义你肯定是需要去查阅了解的,除此之外,SkyWalking还有很多强大的功能和扩展也是需要在使用中慢慢摸索的。
最重要的是这么厉害的一个开源框架,难道你不对它的源码垂涎三尺吗?
身未动,心已远。
把一件事做到极致就是天分!