在这一部分我们主要了解2个问题:
APM(Application Performance Management),即应用性能管理系统,是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理,主要指对企业的关键业务应用进行监控、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低 IT 总拥有成本。
APM 系统可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。
随着分布式系统和微服务架构的出现,一次用户的请求会经过多个系统,不同服务之间的调用关系十分复杂,任何一个系统出错都可能影响整个请求的处理结果。以往的监控系统往往只能知道单个系统的健康状况、一次请求的成功失败,无法快速定位失败的根本原因。
除此之外,复杂的分布式系统也面临这几个问题:
性能分析:一个服务依赖很多服务,被依赖的服务也依赖了其它服务。如果某个接口耗时突然变长了,那未必是直接调动的下游服务慢了,也可能是下游的下游慢了造成的,如何快速定位耗时变长的根本原因呢?
链路梳理:需求迭代很快,系统之间调用关系变化频繁,靠人工很难梳理清楚系统链路拓扑(系统之外的调用关系)
为了解决这些问题,Google 推出了一个分布式链路追踪系统 Dapper,之后各个互联网公司都参照 Dapper 的思想推出了自己的分布式链路追踪系统,而这些系统就是分布式系统下的 APM 系统。
分布式链路追踪最先由 Google 的 Dapper 论文中提出,而 OpenTracing 通过提供与平台无关、厂商无关的 API,使得开发人员能够方便添加(或更换)追踪系统的实现。
下图是一个分布式调用的例子,客户端发起请求,请求首先到达负载均衡器,接着经过认证服务,订单服务,然后请求资源,最后返回结果。
虽然这种图对于看清各组件的组合关系是很有用的,但是存在下面两个问题:
它不能很好显示组件的调用时间,是串行调用还是并行调用,如果展现更复杂的调用关系,会更加复杂,甚至无法画出这样的图。
这种图也无法显示调用间的时间间隔,以及是否通过定时调用来启动调用。
一种更有效的展现一个调用过程的图:
基于 OpenTracing 我们就可以很轻松的构建出上面这幅图。
Pinpoint 是由一个韩国团队实现并开源,针对 Java 编写的大规模分布式系统设计,通过 JavaAgent 的机制做字节代码植入,实现加入 traceid 和获取性能数据的目的,对应用代码零侵入。
官方网站:
https://github.com/naver/pinpoint
缺点:收集数据多,导致整体性能相对比较差。
Skywalking 是 Apache 基金会下面的一个开源 APM 项目,为微服务架构和云原生架构系统设计。它通过探针自动收集所需的指标,并进行分布式追踪。通过这些调用链路以及指标,Skywalking APM 会感知应用间关系和服务间关系,并进行相应的指标统计。Skywalking 支持链路追踪和监控应用组件,基本涵盖主流框架和容器,如国产 RPC Dubbo和motan等,国际化的 Spring Boot、Spring Cloud。
官方网站:
http://skywalking.apache.org/
Zipkin 是由 Twitter 开源,是分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控追踪。Zipkin 基于 Google 的 Dapper 论文实现,主要完成数据的收集、存储、搜索与界面展示。
官方网站:
https://zipkin.io/
注:Zipkin 自身与 Spring Cloud 有良好的集成,Spring Cloud 也推荐我们使用 Zipkin 作为分布式链路追踪。
CAT 是由大众点评开源的项目,基于 Java 开发的实时应用监控平台,包括实时应用监控、业务监控,可以提供十几张报表展示。
官方网站:
https://github.com/dianping/cat
缺点:代码具有倾入性,要使用 CAT,必须进行代码的更改,对一些框架的使用,需要进行埋点,埋点之后才能进行数据的上报。
根据官方的解释,Skywalking 是一个可观测性分析平台(Observability Analysis Platform,简称 OAP)和应用性能管理系统(Application Performance Management 简称 APM)。
提供分布式链路追踪、服务网格(Service Mesh)、遥测分析、度量(Metric)、聚合和可视化等一体化解决方案。
几大特点:
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
整体架构包含如下三个组成部分:
Skywalking 相比较其它的分布式链路监控工具,具有以下特点:
使用如下案例来进行 Skywalking 主要概念的介绍,Skywalking 主要概念包含:
上图中,我们编写了用户服务,这是一个 Web 项目,在生产中部署了两个节点:192.168.1.100 和 192.168.1.101。
接下来我们在虚拟机 Cent OS 中搭建 Skywalking 的可观测性分析平台 OAP 环境。Skywalking 默认使用 H2 内存中进行数据的存储,我们可以替换存储源为 Elasticsearch 保证其数据的高效及可用性。
具体的安装步骤可以在 Skywalking 的官方 github 上找到:https://github.com/apache/skywalking/blob/master/docs/en/setup/README.md
1、创建目录
mkdir /usr/local/skywalking
建议将虚拟机内存设置为 3G 并且将 CPU 设置成 2 核,防止资源不足。
2、将资源目录中的 elasticsearch 和 skywalking 安装包上传到虚拟机 /usr/local/skywalking 目录下。
elasticsearch-6.4.0.tar.gz --elasticsearch 6.4 的安装包,Skywalking 对 es 版本号有一定要求,最好使用 6.3.2 以上版本,如果是 7.x 版本需要额外进行配置。
apache-skywalking-apm-6.5.0.tar.gz --Skywalking 最新的安装包
3、首先安装 elasticsearch,将压缩包解压。
tar -zxvf ./elasticsearch-.6.4.0.tar.gz
修改系统中允许应用最多创建多少文件等的限制权限。Linux 默认来说,一般限制应用最多创建的文件是 65535 个。但是 ES 至少需要 65536 的文件创建数的权限。
修改系统中允许用户启动的进程开启多少个线程。默认的 Linux 限制 root 用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启 1024 个线程。必须修改限制数为 4096+。因为 ES 至少需要 4096 的线程池预备。
修改 Linux 系统的限制配置,将文件创建数修改为 65536 个。
vi /etc/security/limits.conf# 新增如下内容在 limit.conf 文件中es soft nofile 65536es hard nofile 65536es soft nproc 4096es 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 进程才可以。
# 创建用户useradd es# 修改上述用户的密码passwd es# 修改 elasticsearch 目录的拥有者chown -R es elasticsearch-6.4.0
使用 es 用户启动 elasticsearch
# 切换用户su es# 到 elasticsearch 的 bin 目录下cd bin/# 后台启动./elasticsearch -d
默认 Elasticsearch 是不支持跨域访问的,所以在不修改配置文件的情况下我们只能从虚拟机内部进行访问测试 Elasticsearch 是否安装成功,使用 curl 命令访问 9200 端口:
curl http://localhost:9200
如果显示出如下信息,就证明 Elasticsearch 安装成功:
{
"name" : "NCP0n0f", "cluster_name" : "elasticsearch", "cluster_uuid" : "CTHVhOc1R8uMK-jdN7G3sg", "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"}
4、安装 Skywalking,分为两个步骤:
安装 Backend 后端服务
安装 UI
首先切回到 root 用户,切换到目录下,解压 Skywalking 压缩包。
# 切换到 root 用户su root# 切换到 Skywalking 目录cd /usr/local/skywalking# 解压压缩包tar -zxvf apache-skywalking-apm-6.4.0.tar.gz
修改 Skywalking 存储的数据源配置:
cd apache-skywalking-apm-binvi config/application.yml
我们可以看到默认配置中,使用了 H2 作为数据源。我们将其全部注释。
storage:# elasticsearch:# nameSpace: ${SW_NAMESPACE:""}# clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}# protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}# trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}# trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}# user: ${SW_ES_USER:""}# password: ${SW_ES_PASSWORD:""}#