APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

随着企业IT系统不断扩大,以及对内快速诊断效率和对外SLA(服务品质协议,service-level agreement)的追求,对于业务系统的掌控度的要求越来越高。

在这种情况下,一般都会引入APM(Application Performance Management & Monitoring)系统,通过各种探针采集数据,收集关键指标,同时搭配数据呈现和监控告警,能够解决上述的大部分问题。

同时,随着RPC框架、微服务框架的普及和发展,微服务架构在企业级应用开发中得到了大量的应用。一次业务调用,往往可能跨越多个服务或容器,依赖的中间件也越来越多,其中调用链上任何一个节点出现异常,都可以导致业务出现波动或异常,这就导致服务调用链的异常诊断和定位变得非常麻烦,于是当务之急是调用链跟踪(tracing)。

APM和调用链跟踪在很多公司已经有了大量的实践,开源的并且能够开箱即用的产品,主要有Skywalking、Pinpoint、Zipkin、CAT等等。

一、Skywalking

Skywalking 是一个国人开源分布式追踪系统,用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。本身支持OpenTracing规范,优秀的设计提供了良好的扩展性,支持Java、PHP、.Net、NodeJs探针,数据容器为ElasticSearch或MySQL。

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

Skywalking整体架构主要由四部分组成:collector、agent、web、storage,具体如下图所示。

  • skywalking-collector:链路数据归集器,数据可以落地Elasticsearch,单机也可以落地H2(不推荐),H2仅作为临时演示用。
  • skywalking-web:web可视化平台,用来展示落地的数据。
  • skywalking-agent:探针,使用Javaagent做字节码植入,无侵入式的收集,并通过HTTP或者gRPC方式发送数据到Skywalking Collector。
  • Storage:Skywalking的存储,时间更迭,skywalking已经开发迭代到了6.x版本,在6.x版本中支持以Elasticsearch、Mysql、TiDB、H2、作为存储介质进行数据存储。

关于Skywalking架构设计、单机安装和集群部署、以及和Spring Cloud微服务项目的集成等等,在前面的章节有详细的介绍。

二、Pinpoint

Pinpoint是一个比较早并且成熟度也非常高的APM+调用链监控的项目,在全世界范围内均有用户使用,支持Java和PHP的探针,数据容器为HBase。

Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。

最新UI界面如下所示:

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

架构图如下所示:

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

PinpointCollector收集来自应用的监控数据,写入到HBase中存储,然后通过PinPoint Web UI界面可视化呈现。

三、Zipkin+Sleuth

Zipkin是Twitter开源的调用链分析工具,目前基于Spring Cloud Sleuth得到了广泛的使用,特点是轻量,使用部署简单。

Spring Cloud Sleuth是对Zipkin的一个封装,对于Span、Trace等信息的生成、接入HTTP Request,以及向Zipkin Server发送采集信息等全部自动完成。

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

Zipkin Server主要包括四个模块:

(1)Collector 接收或收集各应用传输的数据。

(2)Storage 存储接受或收集过来的数据,当前支持Memory,MySQL,Cassandra,Elasticsearch等,默认存储在内存中。

(3)API(Query) 负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用。

(4)Web 提供简单的web界面。

四、CAT(Central Application Tracking)

CAT是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。拥有大量的企业级用户,对于监控和报警整合比较紧密,支持Java、C/C++、.Net、Python、Go、NodeJs。不过,CAT目前主要通过侵入性的方式接入,数据容器包括HDFS(存储原始数据)和MySQL(二次统计)。

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

在整个CAT从开发至今,一直秉承着简单的架构就是最好的架构原则,整个CAT主要分为三个模块,cat-client,cat-consumer,cat-home。

  • cat-client 提供给业务以及中间层埋点的底层sdk。
  • cat-consumer 用于实时分析从客户端提供的数据。
  • cat-home 作为提供给用户展示的控制端。

在实际开发和部署中,cat-consumer和cat-home是部署在一个jvm内部,每个CAT服务端都可以作为consumer也可以作为home,这样既能减少整个CAT层级结构,也可以增加整个系统稳定性。

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

五、Skywalking、Pinpoint、Zipkin和CAT分析比较

1. 基本实现原理

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

2.接入方式

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

3.监控和报警

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

4.页面UI可视化效果

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

5.监控数据存储

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT

6. 性能比较

在Skywalking、Pinpoint、Zipkin等三种链路监控组件中,Skywalking的探针对吞吐量的影响最小,Zipkin的吞吐量居中,Pinpoint的探针对吞吐量的影响较为明显。在500并发用户时,Pinpoint测试服务的吞吐量从1385降低到774,影响很大。然后再看下CPU和memory的影响,在内部服务器进行的压测,对CPU和memory的影响都差不多在10%之内。

六、小结

综上所述,在APM和分布式调用链产品选型时,我个人推荐Skywalking。当然,还需要结合企业现状以及团队情况,做出综合判断。

通过本技术专栏对Skywalking的剖析和实践,Skywalking确实是一个优秀的APM+调用链跟踪监控系统,能够覆盖大部分使用场景,让研发和运维能够更加实时/准实时的了解线上服务的运行情况。

APM和分布式调用链选型之Skywalking、Pinpoint、Zipkin和CAT