1. Skywalking 概述
1.1 什么是APM系统 ?
1.1.1 APM系统概述
APM (Application Performance Management)
即应用性能管理系统,是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。
应用性能管理,主要指对企业的关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本。
APM系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。
1.1.2 分布式链路追踪
随着分布式系统和微服务架构的出现,一次用户的请求会经过多个系统,不同服务之间的调用关系十分复杂,任何一个系统出错都可能影响整个请求的处理结果。以往的监控系统往往只能知道单个系统的健康状况、一次请求的成功失败,无法快速定位失败的根本原因。
除此之外,复杂的分布式系统也面临这下面这些问题:
-
性能分析
:
一个服务依赖很多服务,被依赖的服务也依赖了其他服务。如果某个接口耗时突然变长了,那未必是直接调用的下游服务慢了,也可能是下游的下游慢了造成的,如何快速定位耗时变长的根本原因呢? -
链路梳理
:
需求迭代很快,系统之间调用关系变化频繁,靠人工很难梳理清楚系统链路拓扑(系统之间的调用关系)。
为了解决这些问题,Google 推出了一个分布式链路跟踪系统 Dapper ,之后各个互联网公司都参照Dapper 的思想推出了自己的分布式链路跟踪系统,而这些系统就是分布式系统下的APM系统。
1.1.3 什么是OpenTracing
分布式链路跟踪最先由Google在Dapper论文中提出,而OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现。
下图是一个分布式调用的例子,客户端发起请求,请求首先到达负载均衡器,接着经过认证服务,订单服务,然后请求资源,最后返回结果。
虽然这种图对于看清各组件的组合关系是很有用的,但是存在下面两个问题:
- 它不能很好显示组件的调用时间,是串行调用还是并行调用,如果展现更复杂的调用关系,会更加复杂,甚至无法画出这样的图。
- 这种图也无法显示调用间的时间间隔以及是否通过定时调用来启动调用。
一种更有效的展现一个调用过程的图:
基于OpenTracing我们就可以很轻松的构建出上面这幅图。
1.1.4 主流的开源APM产品
PinPoint
Pinpoint是由一个韩国团队实现并开源,针对Java编写的大规模分布式系统设计,通过JavaAgent的机制做字节代码植入,实现加入traceid和获取性能数据的目的,对应用代码零侵入。
官方网站: https://github.com/naver/pinpointSkyWalking
SkyWalking是apache基金会下面的一个开源APM项目,为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM会感知应用间关系和服务间关系,并进行相应的指标统计。Skywalking支持链路追踪和监控应用组件基本涵盖主流框架和容器,如国产RPC Dubbo和motan等,国际化的spring boot,spring cloud。
官方网站:http://skywalking.apache.org/Zipkin
Zipkin是由Twitter开源,是分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。Zipkin基于Google的Dapper论文实现,主要完成数据的收集、存储、搜索与界面展示。
官方网站:https://zipkin.io/CAT
CAT是由大众点评开源的项目,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控,可以提供十几张报表展示。
官方网站: https://github.com/dianping/cat
1.2 什么是Skywalking ?
1.2.1 Skywalking概述
根据官方的解释,Skywalking是一个可观测性分析平台(Observability Analysis Platform简称OAP
)和应用性能管理系统(Application Performance Management简称APM
)。
提供分布式链路追踪、服务网格(Service Mesh)遥测分析、度量(Metric)聚合和可视化一体化解决方案。
下面是Skywalking的几大特点:
- 多语言自动探针,Java,.NET Core和Node.JS。
- 多种监控手段,语言探针和service mesh。
- 轻量高效。不需要额外搭建大数据平台。
- 模块化架构。UI、存储、集群管理多种机制可选。
- 支持告警。
- 优秀的可视化效果。
Skywalking整体架构如下:
Skywalking提供Tracing和Metrics数据的获取和聚合。
Metric
的特点是,它是可累加的:他们具有原子性,每个都是一个逻辑计量单元,或者一个时间段内的柱状图。 例如:队列的当前深度可以被定义为一个计量单元,在写入或读取时被更新统计; 输入HTTP请求的数量可以被定义为一个计数器,用于简单累加; 请求的执行时间可以被定义为一个柱状图,在指定时间片上更新和统计汇总。Tracing
的最大特点就是,它在单次请求的范围内,处理信息。 任何的数据、元数据信息都被绑定到系统中的单个事务上。 例如:一次调用远程服务的RPC执行过程;一次实际的SQL查询语句;一次HTTP请求的业务性ID。总结
:
- Metric主要用来进行数据的统计,比如HTTP请求数的计算。
- Tracing主要包含了某一次请求的链路数据。
详细的内容可以查看Skywalking开发者吴晟翻译的文章,Metrics, tracing 和 logging 的关系 : http://blog.oneapm.com/apm-tech/811.html
整体架构包含如下三个组成部分:
- 探针(agent)负责进行数据的收集,包含了Tracing和Metrics的数据,
agent会被安装到服务所在的服务器上
,以方便数据的获取。 - 可观测性分析平台OAP(Observability Analysis Platform),接收探针发送的数据,并在内存中使用分析引擎(Analysis Core)进行数据的整合运算,然后将数据存储到对应的存储介质上,比如 Elasticsearch、MySQL数据库、H2数据库等。同时OAP还使用查询引擎(Query Core)提供HTTP查询接口。
skywalking默认是H2数据库
- Skywalking提供单独的UI进行数据的查看,此时UI会调用OAP提供的接口,获取对应的数据然后进行展示。
1.2.2 Skywalking优势
Skywalking相比较其他的分布式链路监控工具,具有以下特点:
- 社区相当活跃。Skywalking已经进入apache孵化,目前的start数已经超过11K,最新版本6.5.0已经发布。开发者是国人,可以直接和项目发起人交流进行问题的解决。
- Skywalking支持Java,.NET Core和Node.JS语言。相对于其他平台:比如Pinpoint支持Java和PHP,具有较大的优势。
- 探针无倾入性。对比CAT具有倾入性的探针,优势较大。不修改原有项目一行代码就可以进行集成。
- 探针性能优秀。有网友对Pinpoint和Skywalking进行过测试,由于Pinpoint收集的数据过多,所以对性能损耗较大,而Skywalking探针性能十分出色。
- 支持组件较多。特别是对Rpc框架的支持,这是其他框架所不具备的。Skywalking对Dubbo、gRpc等有原生的支持,甚至连小众的motan和sofarpc都支持。
1.2.3 Skywalking主要概念介绍
使用如下案例来进行Skywalking主要概念的介绍,Skywalking主要概念包含:
- 服务(Service)
- 端点(Endpoint)
- 实例(Instance)
- 用户服务就是Skywalking的服务(Service),用户服务其实就是一个独立的应用(Application),在6.0之后的Skywalking将应用更名为服务(Service)。
- 用户服务对外提供的HTTP接口/usr/queryAll就是一个端点,
端点就是对外提供的接口
。 - 192.168.1.100和192.168.1.101这两个相同服务部署的
节点就是实例
,实例指同一服务可以部署多个。
1.3 环境搭建
1.3.1 安装es
- 到 /usr/local/ 目录下新建一个文件夹
mkdir /usr/local/skywalking
- 将资源目录中的elasticsearch和skywalking安装包上传到虚拟机/usr/local/skywalking目录下
- 首先安装elasticsearch,将压缩包解压。
tar -zxvf ./elasticsearch-6.4.0.tar.gz
- 修改Linux系统的限制配置,将文件创建数修改为65536个。
- 修改系统中允许应用最多创建多少文件等的限制权限。Linux默认来说,一般限制应用最多创建的文件是65535个。但是ES至少需要65536的文件创建数的权限。
- 修改系统中允许用户启动的进程开启多少个线程。默认的Linux限制root用户开启的进程可
以开启任意数量的线程,其他用户开启的进程可以开启1024个线程。必须修改限制数为4096+。因为ES至少需要4096的线程池预备。
- vi /etc/security/limits.conf 新增下面几个数据
es soft nofile 65536
es hard nofile 65536
es soft nproc 4096
es hard nproc 4096
- 修改系统控制权限,ElasticSearch需要开辟一个65536字节以上空间的虚拟内存。Linux默认不允许任何用户和应用程序直接开辟这么大的虚拟内存。
vi /etc/sysctl.conf
#新增如下内容在sysctl.conf文件中,当前用户拥有的内存权限大小
vm.max_map_count=262144
#让系统控制权限配置生效
sysctl -p
- 建一个用户, 用于ElasticSearch启动。
ES在5.x版本之后,强制要求在linux中不能使用root用户启动ES进程。所以必须使用其他用户启动ES进程才可以。
# 创建一个用户组,组id设置为520 组名叫es
groupadd -g 520 es
# 创建一个用户 指定目录为/home/es 加入es用户组,用户id设置为520 指定用户目录为es
useradd -d /home/es -g es -u 520 -m es
然后设置一下密码 ,方便后面使用;
- 将es的目录授权给es用户
chown -R es:es elasticsearch-6.4.0
- 使用es用户启动elasticsearch
#切换用户
su es
#到ElasticSearch的bin目录下
cd bin/
#后台启动
./elasticsearch -d
默认ElasticSearch是不支持跨域访问的,所以在不修改配置文件的情况下我们只能从虚拟机内部进行访问测试ElasticSearch是否安装成功,使用curl命令访问9200端口:
curl http://localhost:9200
如果显示出如下信息,就证明ElasticSearch安装成功:
[es@Centos-root473791 logs]$ curl http://localhost:9200
{
"name" : "HHZSe68",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "pVgiAh6iQV2BWAJF3RKmdw",
"version" : {
"number" : "6.4.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "595516e",
"build_date" : "2018-08-17T23:18:47.308994Z",
"build_snapshot" : false,
"lucene_version" : "7.4.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
1.3.2 安装Skywalking
安装Skywalking,分为两个步骤:
- 安装 Backend后端服务
- 安装UI
- 首先切回到root用户,切换到目录下,解压Skywalking压缩包。
#切换到root用户
su root
#切换到skywalking目录
cd /usr/local/skywalking
#解压压缩包
tar -zxvf apache-skywalking-apm-6.4.0.tar.gz
解压完之后会得到下面文件
2. 修改Skywalking存储的数据源配置:
cd apache-skywalking-apm-bin
vi config/application.yml
- 我们可以看到默认配置中,使用了H2作为数据源。我们将其全部注释。
# h2:
# driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
# url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
# user: ${SW_STORAGE_H2_USER:sa}
# metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
# mysql: # metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
将ElasticSearch对应的配置取消注释:
默认使用了localhost下的ES,所以我们可以不做任何处理,直接进行使用。启动OAP程序:
bin/oapService.sh
出现下面信息表示启动成功:
这样安装Backend后端服务就已经完毕了,接下来我们安装UI。先来看一下UI的配置文件:
为了避免8080端口被占用,将8080端口改成8088端口,启动UI程序:
/bin/webappService.sh
出现下面情况表示启动成功
然后我们就可以通过浏览器访问Skywalking的可视化页面了,访问地址:http://虚拟机IP地址:8088,如果出现下面的图,就代表安装成功了。
/bin/startup.sh可以同时启动backend和ui,后续可以执行该文件进行重启。