服务化的发展,以及容器化编排、微服务框架、Service Mesh 等各项技术的持续进化,为分布式服务化提供了技术层面的支持。但是,仅仅构建微服务是不够的,对于一套完整的技术体系而言,除了开发,还需要运维给予强力支持。随着微服务架构的持续演进,应用和服务数量不断增加,调用关系越来越复杂。所以,从运维的角度来看,首要任务便是保持可观察性(Observability)。
CNCF 赋予了可观察性极高的地位,可观察性和由操作系统、底层网络提供商构成的平台层(Platform)一样,贯穿整个云原生体系。
变化是微服务的本质,也是应用系统设计和开发中唯一不变的准则。因此,无法通过一张静态的架构图来描述微服务架构下的系统部署情况。微服务集群的组成元素、依赖关系、流量分布以及外部边界等都会随着时间发生变化,虽然微服务技术降低了应对变化的难度,但运维团队却依然需要明确地了解系统的运行情况,这就是微服务系统对可观察性的诉求。
可观察性提供了穿越微服务边界的能力,它先对应用数据或管理平台数据进行观测及后台分析,然后通过高度可视化系统,直观地将系统当前的状态展现出来。
1.层次划分
根据观察层次的不同,谈论可观察性时一般涉及基础设施层、工具层和应用环境层。
基础设施层:对云主机、操作系统、云服务进行包括可用性在内的基础指标监控,提供云服务商的基础运维支撑能力。
工具层:编排工具的可观察性是微服务体系中的重要一环,随着容器化的不断推进,对Kubernetes和Mesos等容器编排生态工具的监控也越来越多样化。另外,由于DevOps体系的发展,相关工具链(如Git、SVN、CI/CD等)的可观察性也成为当今的关注焦点。
应用环境层:应用环境层的可观察性是指对应用服务器、数据库、消息队列、缓存等中间件组件进行观察。
由于基础设施层的监控和系统健康度观察大多由平台提供商直接负责,而工具层的解决方案基本是由其核心产品以及周边生态提供的,因此对于微服务和云原生应用开发者来说,关注点应集中在应用环境层。应用环境层因为涉及业务系统,所以场景变化也是最多的。下面我们将具体讲解如何进行应用环境层系统观察。
2.核心概念
日志(Logging)、指标(Metrics)和追踪(Tracing)是紧密相关的三个核心概念。通过图 5-2 所示的韦恩图,我们能够很清楚地了解这三者之间的关系。
图 5-2 日志、指标和追踪的关系
日志描述的是一些不连续的离散事件。例如,有些业务系统采用ELK(Elasticsearch + Logstash + Kinaba)或类似技术栈的日志收集系统,它们是分布式监控系统的早期形态,借鉴了传统应用解决问题的方式,是最容易理解的解决方案。
指标是可累加的,它具有原子性。每个指标都是一个逻辑计量单元,体现了一段时间之内相关指标的状态。
例如,队列当前的深度可以被定义为一个计量单元,在写入或读取时更新;输入 HTTP 请求的数量可以被定义为一个计数器,用于进行简单累加;请求的执行时间可以被定义为一个柱状图,在指定时间片上更新和汇总。
CNCF 生态中的 Prometheus 监控系统正是基于指标的典型系统,它通过定义和收集不同的指标数据,以及提供基于时间维度的查询能力,为分布式服务指标提供基础数据保障。
追踪在监控领域通常被称为分布式追踪,是指在单次请求范围内处理信息。任何的数据和元数据信息都被绑定到了系统中的单个事务上。追踪能力是近几年技术人员最为关注的需求,由Twitter开源的ZipKin是目前运用最为广泛的分布式追踪系统。
上面介绍的三个概念并不是相互独立的,往往会有一定的重叠,复杂和完善的监控系统一般是跨越多个维度的,下面我们具体来介绍一下。
追踪+日志:这是多数分布式追踪系统的早期形态,通过简单的上下文传递,可以将请求的上下文ID输出到日志,让日志具备时间维度之外的另一个关键维度——上下文关联。通过时间和上下文关联这两个维度的组合,用户可以快速感受到分布式追踪带来的强大优势。
日志+指标:这是日志分析系统的常规架构,可通过解析系统现有的业务日志获取相关的指标数据。
追踪+指标:用于指明基于分布式追踪的数据分析指标、应用间的关系以及数据流向等。
日志、指标、追踪可以看作功能全集中的元素,一些商业级别的 APM(Application Performance Management,应用性能管理)系统便采用“追踪+指标”的方式提供一体化的解决方案。充分理解这三个概念,能够更好定位目前市面上的各种开源和商业监控体系工具,理解它们的核心优势。
下面我们重点介绍一下与分布式追踪系统相关的内容。
3.分布式追踪
分布式追踪的概念源自最早面对超大规模分布式场景的 Google 公司于 2010 年发表的论文——Dapper, a Large-Scale Distributed Systems Tracing Infrastructure。论文中详细地介绍了 Google 的 Dapper 系统及其实现原理,此处我们不再介绍论文中的内容,感兴趣的读者可以自行阅读、学习。
Dapper 的核心实现方法是在分布式请求的上下文中加入 span id 以及 parent id,用于记录请求的上下级关系。分布式追踪的示意图如图 5-3 所示。
阿里巴巴公司曾经分享过鹰眼系统的实现方案,也是国内早期的分布式追踪系统实现方案。鹰眼系统使用类似书签索引的方法,简化了 parent id 和 span id 的表达方式,其请求流程如图 5-4 所示。
图 5-3 分布式追踪的示意图
图 5-4 鹰眼系统的请求流程
鹰眼系统与 Dapper 在原理上没有本质区别。之所以在此刻意提及,是因为鹰眼系统的编码方案可以帮助读者理解 Trace 树形结构。但是,需要强调的是,Trace 并非只有树形结构,对于消息消费、异步处理等批量模型,会出现一条 Trace 关联多个 TraceId 的情况。
4.常见的分布是追踪开源解决方案
Apache ZipKin 是起步最早、社区体系最为完备的分布式追踪解决方案。它借助稳定的 API 库及广泛的集成,几乎覆盖了从开源到商业级的分布式系统的各个角落。其覆盖的语言包括 Java、C#、Go、JavaScript、Ruby、Scala、C++、PHP、Elixir、Lua 等,甚至为每种语言都提供了不止一种 API 库,更好地适应了各种不同的应用场景。
OpenTracing 是 CNCF 托管的分布式追踪项目,它的官方定位是针对分布式系统追踪的 API 标准库,与厂商无关,旨在为不同的分布式追踪系统提供统一的对外 API 接入层。所以 OpenTracing 并不包含任何实现,可以将它理解为接口协议,类似于 Java 的数据库访问接口 JDBC。
这里要强调的是,OpenTracing 只是一套可选的接口 API 库,并非分布式追踪的实现标准,其原生支持者同样是 CNCF 托管的项目——Jaeger。另外,前面提到的运用最为广泛的分布式追踪系统 ZipKin 并不是 OpenTracing 的主要支持者,ZipKin 具有完全独立的规范、协议和 API 接口。所以截止到目前,还不能承认 OpenTracing 是分布式追踪领域的 API 标准。
OpenCensus 来自于 Google,是 2017 年才崭露头角的新兴项目。它的定位介于 OpenTracing 和 ZipKin 之间,提供了统一的 API 层,同时提供了部分实现逻辑。工程师只需在 OpenCensus 的基础上自定义实现最小范围的逻辑(如上下文传递和数据格式上行)即可。OpenCensus 目前支持发送 ZipKin、Jeager、Stackdriver 和 SignalFx 格式的数据。OpenCensus 在 Google 的大力支持下,已经成了 OpenTracing 的有力竞争者,同时,它很有可能在不久的将来开源部分后端功能,成为 ZipKin 的挑战者。
总之,分布式追踪的 API 之间竞争十分激烈,而且会愈加激烈。因此,在选择和使用 API 时,需要特别注意。如果团队需要自创一套 API,也可以从现有方案中学到不少的设计理念。
相关文章:
本文节选自图书《未来架构:从服务化到云原生》。本书对快速演进中的云原生数据架构、典型分布式数据库中间件进行了剖析,重点介绍 Service Mesh 等新兴概念,创新性地提出了 Database Mesh 的理念,深度揭秘 Apache 项目——ShardingSphere。
购买链接: https://u.jd.com/sbmG4Y
作者简介:
张亮
京东数科数据研发负责人,Apache ShardingSphere 发起人兼 PPMC 成员。热爱分享,拥抱开源,主张代码优雅化,擅长以 Java 为主的分布式架构以及以 Kubernetes 和 Mesos 为主的云平台的构建。ShardingSphere 已进入 Apache 软件基金会,是京东集团首个进入 Apache 的开源项目,也是 Apache 首个分布式数据库中间件。
吴晟
Apache SkyWalking 创始人及 PPMC 成员,Apache ShardingSphere 原型作者及 PPMC 成员,Apache Zipkin 贡献者,Apache 孵化器导师,CNCF 基金会 OpenTracing 标准化委员会成员,W3C Trace Context 规范贡献者。擅长分布式架构、性能监控与诊断、分布式追踪、云原生监控等领域。
敖小剑
具有十七年软件开发经验,资深码农,微服务专家,Cloud Native 拥护者,敏捷实践者,Service Mesh 布道师,ServiceMesher 中文社区联合创始人。专注于基础架构建设,对微服务、云计算等相关技术有着深入研究和独到见解。
宋净超
蚂蚁金服云原生布道师,ServiceMesher 中文社区联合创始人,Kubernetes 社区成员,Istio 社区成员,《Cloud Native Go》《Python 云原生》《云原生 Java》等图书译者。
评论