当监控遇上微服务

在过去数年里,微服务的落地一直都是业界重点关注的问题,其始终面临着部署、监控、配置和治理等方面的挑战。轻舟微服务平台是网易云为企业提供的一套微服务解决方案,其中微服务监控是其关注的重点问题之一。与传统监控相比,微服务监控面临着更多难点,包括:

  1. 监控对象动态可变,无法进行预先配置;

  2. 监控范围非常繁杂,各类监控难以互相融合;

  3. 微服务实例间的调用关系非常复杂,故障排查会很困难;

  4. 微服务架构仍在快速发展,难以抽象出稳定的通用监控模型。

在工程角度也面临着不少考验,如:

  1. 在微服务架构里,软件系统通常会被拆分为数十甚至数百个微服务,这种拆分会使得监控数据爆炸增长,监控系统必须具备处理和展示这些数据的能力;

  2. 监控系统必须要保证可靠性,具体而言:保证不会因为单点故障而全局失效,监控数据有备份机制,系统各服务的实例均可通过备份数据得到恢复;

  3. 监控系统必须支持云上部署及快速水平扩容,这既是云原生的基本要求,也符合企业系统微服务化演进的实际情况。

微服务监控的技术选型

微服务监控的诸多挑战使得我们不得不慎重地进行技术选型。选择开源还是再造轮子,这个问题在项目初期一直困扰着我们,经过一段时间的调研和论证,开源项目Prometheus成了最终的答案。

Prometheus是CNCF旗下的项目,该项目是一个用于系统和应用服务监控的软件,它能够以给定的时间间隔从给定目标中收集监控指标,并能够通过特定查询表达式获取查询结果。

选择Prometheus的主要原因是:

  • 灵活的数据模型:在Prometheus里,监控数据是由值、时间戳和标签表组成的,其中监控数据的源信息是完全记录在标签表里的;同时Prometheus支持在监控数据采集阶段对监控数据的标签表进行修改,这使其具备强大的扩展能力;

  • 强大的查询能力:Prometheus提供有数据查询语言PromQL。从表现上来看,PromQL提供了大量的数据计算函数,大部分情况下用户都可以直接通过PromQL从Prometheus里查询到需要的聚合数据;

  • 健全的生态: Prometheus能够直接对常见操作系统、中间件、数据库、硬件及编程语言进行监控;同时社区提供有Java/Golang/Ruby语言客户端SDK,用户能够快速实现自定义监控项及监控逻辑;

  • 良好的性能:在性能方面来看,Prometheus提供了PromBench基准测试,从最新测试结果来看,在硬件资源满足的情况下,Prometheus单实例在每秒采集10w条监控数据的情况下,在数据处理和查询方面依然有着不错的性能表现;

  • 更契合的架构:采用推模型的监控系统,客户端需要负责在服务端上进行注册及监控数据推送;而在Prometheus采用的拉模型架构里,具体的数据拉取行为是完全由服务端来决定的。服务端是可以基于某种服务发现机制来自动发现监控对象,多个服务端之间能够通过集群机制来实现数据分片。推模型想要实现相同的功能,通常需要客户端进行配合,这在微服务架构里是比较困难的;

  • 成熟的社区:Prometheus是CNCF组织第二个毕业的开源项目,拥有活跃的社区;成立至今,社区已经发布了一百多个P版本,项目在GitHub上获得的star数超过了2万。

Prometheus虽然在上述六方面拥有优势,但其仍然难以满足微服务监控的所有需求,具体而言:

  1. 仅适用于维度监控,不能用于日志监控、分布式追踪等范围;

  2. 告警规则和告警联系人仅支持通过静态文件配置;

  3. 原生支持的数据聚合函数有限且不支持扩展;

这些不足都说明了一个事实,Prometheus社区版并非微服务监控的最终答案。

我们的答案-轻舟微服务监控系统的设计

从大的方面来看,我们将微服务监控划分为维度监控、日志监控、分布式追踪等三部分。其中维度监控在整个微服务监控里最为重要,所占比例也最大,此类监控的层级有如下划分:

  • 基础设施监控:主要对各个微服务实例所在的基础设施进行监控,具体包括这些设施的运行状态、资源使用情况及系统日志进行监控,一般而言微服务应用实例会运行在容器里,因此这个维度的监控对象也通常包含有容器编排系统、持续构建系统、镜像仓库等,这些对象的具体监控指标的范围包括对象的健康状态、运行状态、资源使用情况等;

  • 微服务通用监控:主要针对微服务通用指标进行监控,包括服务实例处理请求的情况及实例调用其它服务的情况,具体而言包括请求总数、请求处理时延(中位数,包括有90、95和99值)、请求结果(成功、失败、熔断、限流、超时和拒绝)统计、调用其它服务的结果(成功、失败、熔断、限流、超时和拒绝)统计及时延(中位数,包括有90、95和99值);

  • 应用监控:主要对具体的微服务实例进行性能监控,通过数据自动化收集、数据可视化展示,使用户能够及时、全面地掌控各个实例的性能情况,定位性能瓶颈。这一维度重点在于提供丰富的应用性能展示及性能问题定位功能,包括应用响应时间、吞吐量和状态的展示,慢响应和错误明细的查询。

  • 通用中间件:我们没有预置这个维度的监控到系统里,不过得益于Prometheus完善的生态,系统保留有对常用数据库、消息队列及缓存进行监控的能力,具体包括MySQL、Redis、Memcached、Consul、RabbitMQ及Kafka等。

在工程实现方面,我们进行了如下设计:

  1. 用Prometheus原生的联邦集群部署模式,使得全部监控数据分片处理;分片处理机制使得只需要增加实例个数就能够应对海量监控数据问题;

  2. 多Prometheus实例作用于同一监控对象,使得单一实例失效也不会影响到此对象的监控,满足高可用的要求;

  3. 监控系统所有组件及配置均实现容器化并由Kubernetes编排;理论上,在任意Kubernetes集群里都能够一键部署;系统需要变更时,仅需修改相关编排文件,即可完成改变。

对上文提到的几个Prometheus不足之处,我们进行了如下设计:

  1. 引入ELK实现日志监控,Logstash负责采集日志,日志数据被保存到Elasticsearch里,用户则可以通过Kibana查询到具体应用的日志;

  2. 基于OpenTracing实现分布式追踪,最终完成了应用拓扑关系展示,调用链查询等功能;

  3. 对Netflix Turbine进行了二次开发,将微服务框架的秒级监控纳入到系统能力集里。

多场景多维度-轻舟监控系统的实现细节

从架构上来讲,轻舟微服务监控系统在设计时考虑到有多种用户场景,并为此设计了多种模式,包括精简模式、读写优化模式及多环境模式。

图1描述了精简模式的架构,精简模式的主要特点在于部署简单,容易维护。从整体上来看,我们使用了Prometheus经典的联邦集群部署方案,处于叶子节点的Prometheus分片采集处理监控数据;处于根节点的Prometheus则直接从各个叶子节点上拉取处理后的监控数据并负责处理外部的查询请求;告警服务则定期从位于根节点的Prometheus里查询监控数据,在发现数据达到阈值时发送告警通知至对应联系人。这个模式基本上解决了微服务监控的数据分片处理、多维度及系统可靠性问题,同时ELK系统及轻舟APM服务在日志监控和分布式追踪方面进行功能补充,在规模不大的时候是能够满足用户需求的。

在精简模式下,所有的维度监控数据都保存在本地磁盘里面,当本地磁盘发生问题时,数据会有丢失的风险;同时精简模式的可靠性主要靠多个Prometheus实例执行相同的监控任务来保证,多个实例之间实际上是没有数据同步的,这使得数据有不一致的风险。为了解决上述问题,我们在读写优化模式里加入了网易自研的分布式时序数据库NTSDB,利用Prometheus的Remote Write/Read机制将监控数据存取操作实际交由NTSDB来处理。由于NTSDB自带数据同步机制,所以采用这种模式的数据安全性要高于第一种。

对于规模较大的用户而言,还会存在多个物理隔离的机房。这些机房之间通常仅能够通过网络专线通信。针对这种情况,我们设计了多环境模式,在这个模式里,每个环境的监控数据都保存在对应环境的NTSDB集群里,仅当需要进行数据查询时才会跨环境通信。这个模式在前两个模式之外,解决了微服务监控的多数据中心及多AZ问题。

维度监控是轻舟微服务监控系统的主要部分,其实现细节如下所述:

  • 基础设施监控:就轻舟微服务平台的具体情况来看,主要指的是容器监控。轻舟微服务的容器编排系统是Kubernetes,Prometheus则原生支持Kubernetes服务发现机制,这使得我们解决了监控对象发现问题;同时Kubernetes各组件原生支持Prometheus,开源社区也提供了Node exporter、kube-state-metrics exporter及Ceph Exporter,这些组件已经能够满足全部功能需求,所以在基础设施监控上,系统完全采用了开源方案。

  • 微服务框架监控:图4显示了这一维度监控的实现。在这一维度里,我们自研了两个组件,nsf-agent和nsf-turbine。nsf-agent主要负责从服务实例里收集并上报原始监控数据;nsf-turbine则主要负责接收nsf-agnet推送的监控数据,同时对原始监控数据进行聚合及通过暴露这些监控数据给Prometheus;Prometheus定期拉取nsf-turbine暴露的监控数据并为这些数据提供持久化及数据查询能力。另外,nsf-turbine也提供了相对简单的监控数据查询接口,用户能够通过这个接口查询到当日的实时统计数据及秒级监控数据。

  • 应用监控:从总的结构上来讲,应用监控分为客户端、Collector及WEB服务端部分;其中客户端收集并上报应用的监控数据,这部分支持使用网易云自研的APM客户端或者开源的Zipkin及Jaeger客户端,自研的APM客户端能够以无代码侵入的方式进行数据采集,采集到的数据是满足OpenTracing规范的,各个客户端采集的监控数据将被上报到Collector里进行处理,处理后的数据将被保存到MySQL、ElasticSearch或Redis里;WEB服务端部分则负责提供标准接口给Prometheus拉取数据。

当然,在基于Prometheus实现轻舟微服务监控系统的过程里,我们也踩了一些坑,如:

  1. Prometheus的各种计算函数都会对结果进行一定预估处理,其返回值通常都不是精确值。例如当聚合规则为获取过去一小时的监控值之和,但实际只收集到十五分钟监控数据时,这时候聚合出来的数据就是预估的值。如果需求非常精确的结果,需要通过客户端来聚合计算。

  2. Prometheus不支持定时整点进行聚合计算,只能计算过去一段时间的值;无法获取到诸如当天零点到次日零点这种规则的聚合数据。如有类似于这种的需求,需要通过客户端直接聚合。

  3. Prometheus预定义的计算规则、查询表达式是非常多的,而且会根据具体需求进行变动,如果不采用版本管理工具来维护,是非常容易出错的。

新的起点-我们的进展以及未来

目前轻舟微服务监控系统已经具备了下面的特性:

  • 高可用:在精简模式里,同一份监控数据至少由两个Prometheus实例来采集;在读写优化和多环境模式里,监控数据保存在分布式时序数据库NTSDB里;任意一个Prometheus失效都不会影响到系统的整体功能。

  • 全局立体化:系统已经集成了基础设施、微服务及应用等三个维度的监控告警;在日志监控和分布式追踪等方面也提供了相应的日志及调用链查询审计功能;这些已经基本上涵盖了微服务监控的全部功能需求。

  • 可动态调整:在前文提到的各种部署模式里,我们对监控数据的采集和处理进行了分片。目前系统支持通过调整数据分片配置及Prometheus实例数,来满足各种规模的微服务系统的监控需求。

另外,在不远的将来,我们还会在下面几个方面持续改进轻舟微服务监控系统:

  1. 系统自监控、智能监控及分布式追踪能力强化;

  2. 结合Thanos、Druid等组件,扩充部署模式及增强聚合能力;

  3. 增强监控及告警响应速度。

通过这些优化,轻舟微服务监控系统能够更好地为企业的微服务系统保驾护航。


作者简介

王添,网易云高级服务端开发工程师,毕业于华中科技大学。毕业后一直就职于网易杭州研究院云计算技术部,主要负责网易云轻舟微服务、容器服务等研发工作,目前对微服务监控、智能告警及分布式健康检查等方向非常感兴趣。

陈咨余,网易云资深平台开发工程师,毕业于浙江大学。目前就职于网易杭州研究院云计算技术部,主要负责网易云轻舟应用性能监控以及管理、日志服务等研发工作。

相关推荐


12 月 7 日北京 ArchSummit 全球架构师峰会上,来自网易严选的技术专家邱似峰,将分享“数据驱动下的严选仓储供应链智能优化”内容,重点介绍“工程+大数据+人工智能算法”的应用。详情点击 https://bj2018.archsummit.com/schedule

网易云基于Prometheus的微服务监控实践相关推荐

  1. 爱奇艺号基于Prometheus的微服务应用监控实践

    前 言 微服务架构是目前各大互联网公司普遍采用的软件架构方式.在微服务架构中,系统被拆分为多个小的.相互独立的服务,这些服务运行在自己的进程中,可以独立的开发和部署.在业务快速变化时,微服务单一职责. ...

  2. 基于Prometheus的微服务应用监控

    基于Prometheus的微服务应用监控 北京易观智库网络科技有限公司 作者:李泰庆 导语: Prometheus是一套开源的系统监控报警框架.它启发于Google的borgmon 监控系统,由工作在 ...

  3. InfoQ专访网易云陈谔:用微服务体系满足企业数字化转型需求

    现在的公有云市场,国外有AWS,Google Cloud和微软的Azure三足鼎立,国内则是阿里云一家独大,即便如此,在数字化浪潮下,云计算市场依然有很多玩家进场,各家竞争也相当激烈.在这样的环境下, ...

  4. 基于CSE的微服务架构实践-轻量级架构技术选型

    [摘要] 本文在前一篇"基于CSE的微服务架构实践-基础架构"基础上,介绍了使用CSE进行轻量级架构的技术选型参考.文末提供了基于JWT的微服务认证鉴权方案. 轻量级架构模式下,可 ...

  5. 基于CSE的微服务架构实践-Spring Boot技术栈选型

    [摘要] 本文在前一篇"基于CSE的微服务架构实践-基础架构"基础上,介绍了在Spring Boot中集成CSE的技术选型参考.本文介绍了Spring Boot集成CSE的基本原理 ...

  6. 基于CSE的微服务架构实践-Spring Cloud技术栈选型

    [摘要] 本文介绍了CSE和Spring Cloud的关系,在技术选型上的差异.介绍了Spring Cloud用户使用Spring Cloud物理多租和进行CSE开发的两种策略. 当Spring Cl ...

  7. 2018中国云原生用户大会:网易云爆料完整微服务的研发过程

    近日,由才云科技.K8sMeetup 中国社区.Kubeflow 中国社区联合主办的 2018 中国云原生用户大会在杭州白马湖建国饭店举办,来自各个行业领域的云原生技术专家.云原生技术落地企业代表.以 ...

  8. 基于 Docker 的微服务架构实践

    http://dockone.io/article/4887 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 DevOps,也见证了 Do ...

  9. 一个基于 Dubbo 的微服务改造实践

    微服务的理论已经够多,今天不妨看一个实战案例. 基于微服务或者 SOA 的自动化测试系统每个公司都有自己的特有的,我今天就主要介绍一下,我们研发的一套 mock 测试系统. 目前面临的问题 1.测试人 ...

最新文章

  1. 求一棵二叉树根到所有叶子节点的路径
  2. Linux下安装二进制版mysql-8.0.15
  3. 计算机的c盘是硬盘吗,c盘是硬盘吗
  4. Dataset之IRIS:莺尾(Iris)数据集的简介、安装、使用方法之详细攻略
  5. MATLAB机器学习系列-4函数篇
  6. SAP UI5 初学者教程之四:XML 视图初探试读版
  7. 领域应用 | 2020 年中国知识图谱行业分析报告
  8. 如何证明CPU缓存行cacheline的存在?
  9. Linux编译和下载嵌入式实验,嵌入式实验6交叉编译及Linux简单程序设计实验
  10. 数学建模1:lingo软件求解优化模型
  11. Android EditText 不得不说的InputFilter、TextWatcher、ActionMode.Callback、OnEditorActionListener
  12. 即时通讯源码|IM源码PHP
  13. element el-table表头添加背景图片
  14. 20级逍遥装备材料汇总及出处
  15. 华为手机拍照那么厉害,为什么你却总拍不好?肯定是没调整这些设置
  16. c语言 自动计时的秒表,c语言实现的简单秒表计时器
  17. 毕业设计 : 基于深度学习的口罩佩戴检测【全网最详细】 - opencv 卷积神经网络 机器视觉 深度学习
  18. Dashgo D1使用手册
  19. 二十二.jmeter在linux下运行
  20. GPM数据批量下载教程

热门文章

  1. 扫地机器人的特点描写_描写扫地机器人五年级作文500字
  2. c调用按钮点击事件_Unity3d---对UI事件接口的一些测试和机制(坑)的总结
  3. redhat 添加ssh端口_RHEL 7修改ssh默认端口号
  4. c语言学生成绩删除功能,c语言学生成绩管理系统程序设计,有添加,查找,删除,输出,修改,排序等功能!!!...
  5. python树形_Python处理树形数组
  6. java web sqlmapapi,深入了解SQLMAP API
  7. 如何搭建一个打印荣誉证书的网站_如何搭建一个免费的作品集网站
  8. requests 可以 scrapy 不行_python学习教程,B站博人传评论数据抓取 scrapy
  9. python回测工具_Python爬虫回测股票的实例讲解
  10. linux上离线安装bcp,无法在Linux上安装Pyodbc