概述
与单体应用相比,微服务架构下的一次用户调用会拆分成多个不同服务之间的相互调用,因此需要对每个拆分后的服务进行监控。在讲述如何监控微服务调用前,我们需要先弄清楚三个问题:监控的对象是什么?具体要监控哪些指标?从哪些维度进行监控?接下来,我们就从这三个问题开始,探讨如何监控微服务调用。
监控对象
要监控微服务系统,需要关注哪些对象呢?根据我的经验,监控对象可以分为四个层次:
用户端监控:指对直接提供给用户的功能的监控。例如,微博首页 Feed 提供用户关注的微博浏览功能,监控此功能属于用户端监控。
接口监控:指对业务功能所依赖的具体 RPC 接口的监控。例如,微博首页 Feed 功能依赖于关系服务、微博列表服务和内容服务,监控这些服务的调用情况属于接口监控。
资源监控:指对接口所依赖的资源的监控。例如,关系服务使用 Redis 存储关注列表,对 Redis 的监控属于资源监控。
基础监控:指对服务器本身健康状况的监控,包括 CPU 利用率、内存使用量、I/O 读写量和网卡带宽等。服务器健康状况是影响服务的重要因素,如网络交换机带宽满载会影响所有业务。
监控指标
确定监控对象后,需要监控哪些具体指标呢?通常有以下几个重要业务指标:
请求量:分为实时请求量(QPS,Queries Per Second)和统计请求量(PV,Page View)。QPS 反映服务调用的实时变化,PV 反映一段时间内的请求总量。
响应时间:用平均耗时和慢请求数量来衡量。将响应时间划分为多个区间(如 0~10ms、10ms~50ms、50ms~100ms、100ms~500ms、500ms 以上),监控每个区间内的请求数。还可以用 P90、P95、P99、P999 等指标,如 P99 = 500ms,表示 99% 的请求在 500ms 内完成。
错误率:用调用失败的次数占总调用次数的比率衡量,例如接口返回错误码 503 的比率。
监控维度
需要从多个维度对业务进行监控:
全局维度:从整体角度监控请求量、平均耗时和错误率,提供全局视角。
分机房维度:服务通常部署在多个机房,不同机房的指标可能差异很大,需要分别监控。
单机维度:即便在同一机房,不同机器的性能也可能差异较大,需要监控每台机器的指标。
时间维度:同一监控对象在不同时间点的指标可能不同,需与过去数据对比。
核心维度:根据业务重要性分级,核心业务和非核心业务需分别监控,确保核心业务优先保障。
搭建监控系统
搭建监控系统需要完成以下四个环节:数据采集、数据传输、数据处理和数据展示。
数据采集:有两种方式:
服务主动上报:在业务代码中加入数据收集逻辑,主动上报调用信息。
代理收集:记录调用信息到本地日志文件,由代理解析日志后上报。
数据传输:有两种方式:
UDP 传输:通过 UDP 协议将数据发送到服务器。
Kafka 传输:将数据发送到 Kafka 的指定 Topic,数据处理单元订阅 Topic 获取数据。
数据处理:对收集的数据进行聚合并存储,有两个维度:
接口维度:按接口名聚合,得到每个接口的实时请求量和平均耗时。
机器维度:按节点聚合,查看每个节点的实时请求量和平均耗时。数据持久化存储常用数据库有:
索引数据库:如 Elasticsearch,用于倒排索引结构存储。
时序数据库:如 OpenTSDB,用于按时序存储。
数据展示:通过 Dashboard 以多种图表形式展示数据:
曲线图:监控变化趋势。
饼状图:监控占比分布。
格子图:细粒度监控不同机器的请求量和耗时情况。
总结
在微服务改造过程中,服务监控至关重要。没有强大的监控能力,无法掌控各个服务的运行情况,出现调用失败时不能快速发现问题,会对业务造成严重影响。搭建监控系统涉及数据采集、数据传输、数据处理和数据展示等多个环节,每个环节都需根据业务特点选择合适的解决方案。
思考题:
请思考,你所在技术团队目前采用的监控系统监控了哪些业务数据?包含哪些业务指标?有哪些监控维度?你认为这些设置是否合理?
我们的监控系统目前主要监控了以下业务数据:
用户端监控:包括首页加载时间、用户操作响应时间、用户登录成功和失败次数。
接口监控:涵盖各主要接口的调用次数、平均响应时间和错误率。
资源监控:涉及数据库查询时间、缓存命中率和外部 API 调用时间。
基础监控:监控服务器的 CPU 使用率、内存使用情况、磁盘 I/O 读写速度和网络带宽使用情况。
我们重点监控以下业务指标:
请求量:包括实时请求量(QPS)和统计请求量(PV)。
响应时间:通过平均响应时间和时间区间内的请求数量(如 0-10ms,10-50ms,50-100ms 等)以及 P90、P95、P99 响应时间来衡量。
错误率:监控各接口返回错误码的次数和比率(如 HTTP 503 错误率)。
系统资源:包括 CPU 使用率、内存使用情况、磁盘 I/O 和网络带宽。
我们从以下多个维度进行监控:
全局维度:提供整体服务运行情况的视图,包括全局请求量、响应时间和错误率。
分机房维度:监控不同机房的服务性能和健康状况,确保跨地域部署的高可用性。
单机维度:监控每台机器的性能指标,识别个别机器的瓶颈或异常。
时间维度:对比不同时间段的监控数据,分析业务变化和运营活动的影响。
核心维度:区分核心业务和非核心业务,重点保障核心业务的稳定性和性能。
通过这些监控措施,我们可以全面了解系统的运行状态,及时发现和处理问题,保障服务的稳定性和高可用性。我认为这些设置是合理的,因为它们确保了我们能够快速响应问题,并有效地保障系统的整体性能和用户。

