【转载请注明出处】:https://segmentfault.com/a/1190000023079914
随着企业经营规模的扩大,以及对内快速诊断效率和对外 SLA(服务品质协议,service-level agreement) 的追求,对于业务系统的掌控度的要求越来越高,主要体现在:
- 对于第三方依赖的监控,实时 / 准实时了解第三方的健康状况 / 服务品质,降低第三方依赖对于自身系统的扰动(服务降级、故障转移)
- 对于容器的监控,实时 / 准实时的了解应用部署环境(CPU、内存、进程、线程、网络、带宽)情况,以便快速扩容 / 缩容、流量控制、业务迁移
- 业务方对于自己的调用情况,方便作容量规划,同时对于突发的请求也能进行异常告警和应急准备
- 自己业务的健康、性能监控,实时 / 准实时的了解自身的业务运行情况,排查业务瓶颈,快速诊断和定位异常,增加对自己业务的掌控力
同时,对于企业来说,能够更精确的了解资源的使用情况,对于成本核算和控制也有非常大的裨益。
在这种情况下,一般都会引入 APM(Application Performance Management & Monitoring)系统,通过各种探针采集数据,收集关键指标,同时搭配数据呈现和监控告警,能够解决上述的大部分问题。
然而随着 RPC 框架、微服务、云计算、大数据的发展,同时业务的规模和深度相比过往也都增加了很多,一次业务可能横跨多个模块 / 服务 / 容器,依赖的中间件也越来越多,其中任何一个节点出现异常,都可能导致业务出现波动或者异常,这就导致服务质量监控和异常诊断 / 定位变得异常复杂,于是催生了新的业务监控模式:调用链跟踪 – 能够分布式的抓取多个节点的业务记录,并且通过统一的业务 id(traceId,messageId,requestId 等)将一次业务在各个节点的记录串联起来,方便排查业务的瓶颈或者异常点
产品对比
APM 和调用链跟踪均不是新诞生事务,很多公司已经有了大量的实践,不过开源的并且能够开箱即用的产品并不多,这里主要选取了 Pinpoint,Skywalking,CAT 来进行对比(当然也有其他的例如 Zipkin,Jaeger 等产品,不过总体来说不如前面选取的 3 个完成度高),了解一下 APM 和调用链跟踪在开源方面的发展状态。
Pinpoint
Pinpoint 是一个比较早并且成熟度也非常高的 APM+ 调用链监控的项目,在全世界范围内均有用户使用,支持 Java 和 PHP 的探针,数据容器为 HBase,其界面参考:
Skywalking
Skywalking 是一个新晋的项目,最近一两年发展非常迅猛,本身支持 OpenTracing 规范,优秀的设计提供了良好的扩展性,支持 Java、PHP、.Net、NodeJs 探针,数据容器为 ElasticSearch,其界面参考:
CAT
CAT 是由美团开源的一个 APM 项目,也历经了多年的迭代升级,拥有大量的企业级用户,对于监控和报警整合比较紧密,支持 Java、C/C++、.Net、Python、Go、NodeJs,不过 CAT 目前主要通过侵入性的方式接入,数据容器包括 HDFS(存储原始数据)和 mysql(二次统计),其界面参考:
横向对比
上面只是做了一个简介,那这三个项目各自有什么特色或者优势 / 劣势呢(三者的主要产品均针对 Java,这里也主要针对 Java 的特性)
Pinpoint
优势:
- 大企业 / 长时间验证,稳定性和完成度高
- 探针收集的数据粒度比较细
- HBase 的数据密度较大,支持 PB 级别下的数据查询
- 代码设计考虑的扩展性较弱,二次开发难度较大(探针为插件式,开发比较简单)
- 拥有完整的 APM 和调用链跟踪功能
劣势:
- 代码针对性强,扩展较难
- 容器为 HBase,查询功能较弱(主要为时间维度)
- 探针的额外消耗较多(探针采集粒度细,大概 10%~20%)
- 项目趋于成熟,而扩展难度较大,目前社区活跃度偏低,基本只进行探针的增加或者升级
- 缺少自定义指标的设计
Skywalking
优势:
- 数据容器为 ES,查询支持的维度较多并且扩展潜力大
- 项目设计采用微内核 + 插件,易读性和扩展性都比较强
- 主要的研发人员为华人并且均比较活跃,能够进行更加直接的沟通
- 拥有完整的 APM 和调用链跟踪功能
劣势:
- 项目发展非常快,稳定性有待验证
- ES 数据密度较小,在 PB 级别可能会有性能压力
- 缺少自定义指标的设计
CAT
优势:
- 大企业 / 长时间验证,稳定性和完成度高
- 采用手动数据埋点而不是探针,数据采集的灵活性更强
- 支持自定义指标
- 代码设计考虑的扩展性较弱,并且数据结构复杂,二次开发难度较大
- 拥有完善的监控告警机制
劣势:
- 代码针对性强,扩展较难
- 需要手动接入埋点,代码侵入性强
- APM 功能完善,但是不支持调用链跟踪
基本组件
如果分别去看 Pinpoint/Skywalking/CAT 的整体设计,我们会发现三者更像是一个规范的三种实现,虽然各自有不同的机制和特性,但是从模块划分和功能基本是一致的:
当然也有一些微小的区别:
- Pinpoint 基本没有 aggregator,同时 query 和 alarm 集成在了 web 中,只有 agent,collector 和 web
- Skywalking 则是把 collector、aggregator、alarm 集成为 OAP(Observability Analysis Platform),并且可以通过集群部署,不同的实例可以分别承担 collector 或者 aggregator+alarm 的角色
- CAT 则和 Skywalking 类似,把 collector、aggregator、alarm 集成为 cat-consumer,而由于 CAT 有比较复杂的配置管理,所以 query 和配置一起集成为 cat-home
- 当然最大的区别是 Pinpoint 和 Skywalking 均是通过 javaagent 做字节码的扩展,通过切面编程采集数据,类似于探针,而 CAT 的 agent 则更像是一个工具集,用于手动埋点
【转载请注明出处】:https://segmentfault.com/a/1190000023079914