监控体系是稳定性建设的必备措施,它可以分为多个子系统:异常的智能监控系统、调用链路跟踪系统、端到端的链路染色系统、业务数据轨迹重现系统、业务数据对账系统等。
一个有效的监控体系可以帮助快速识别和响应问题,从而最小化服务中断的风险。
一、异常的智能监控系统
利用监控获取的基础数据,动态计算出实时异常指标范围。智能监控系统将系统内多个异常指标做关联、系统之间做关联、异常和系统变更事件做关联;用户可以给异常值反馈和打标,提供完整的异常特征如机房、事件段、历史上是否出现过以及异常堆栈等,如下图所示。
这个智能监控系统可以将数据很好地关联在一起,可以快速发现整个调用链路上的异常点。
二、调用链路跟踪系统
调用链路跟踪系统可以记录一次调用所涉及的所有系统和数据库,以及每个调用节点的 OPS、RT 等,如下图所示。
它的实现原理比较简单:每个请求中带有一个trace 信息,把 trace 一直携带到该请求的所有调用链路上,打印到日志中,并通过日志中的trace 关联信息形成一个调用栈。
链路跟踪系统还可以实现链路染色功能,可以根据用户ID或者商品 ID,记录用户端的所有操作,并上传(request、response),和服务端的整个调用链路做关联。
如下图所示,服务端把染色标记推送给 App,App将染色标记关联到某个用户然后 App 会记录下这个用户的所有操作记录日志(包括向服务端发送的请求 ),调用服务端的请求也会带上特定的标识,在服务端通过链路追踪系统,把这个请求的所有依赖都记录下来,同时 App 也会将端上用户的操作记录上传到服务端,这样染色系统就同时有了 App 用户的操作日志和服务端的链路调用日志,就可以知道被染色的用户的整个操作是否有异常了,便于排查疑难问题。
三、业务数据轨迹重现系统
所谓业务数据轨迹重现就是可以追踪数据的所有变更记录,了解是谁在哪台机器上调了哪个接口、在哪个时间点从某个数据变更成另一个数据的完整记录。它的逻辑结构如下图所示。
数据轨迹系统主要是记录写操作的操作日志,它是如何实现的呢?答案是依赖中间件。我们在中间件里可以添加一些钩子,把钩子封装在 Client 中,通过配置系统推送一些规则,要控制哪些请求需要记录日志,如在给更新商品信息这个接口需要记录下请求接口的参数信息,那么 RPC 中间件就会打印这些请求的日志,然后通过上面介绍的链路追踪系统把这次请求加上标记,一直追踪到数据库上,所经过的每个系统都会记录此数据的变更记录,在数据库上是数据的最终变化。这里需要另外一个中间件,它需要解析数据库的 binglog、感知数据的 update 以及 delete 的操作,并记录下变更之前和之后的数据,最终这些变更记录都会写到 HBase 里,便于查询和检索。例如可以按照商品维度去查询一段时间内对商品都做过哪些修改操作,这些操作都有详细的操作记录,如果发生错误也可以追溯原因。
按照这个思路,可以实现商品的快照功能。假如你购买的商品包含卖家的承诺在你下单后,卖家删除了该承诺,这会使订单关联一个商品的变更记录,通过它可以知道卖家在什么时间点修改了商品的描述信息。
四、数据对账系统
数据对账系统在很多场景下都很有用,例如在跨机房数据复制的场景下,可以分别采样一定时间内、两边数据库的数据进行比较,了解是否有超出预期的延迟、是否有丢失数据等问题;在需要跨系统状态同步的场景下也可以对账比较,例如确认打款和退款后,主订单打款金额和退款金额之和要等于总金额。
数据对账系统的原理如下图所示。首先需要对接各个数据源,采集实时数据( 数据采集一般是通过接受业务的异步消息以及监听数据库的变更消息等方式获取的)通过数据转换把原始数据转化成需要的数据格式以适配写好的规则,并匹配执行。执行规则一般就是对数据进行校验,如果发现校验结果错误就会触发报警或者转到数据订正系统去订正。
此系统有两个最关键的部分:一是数据的采集部分。这部分最好与业务系统解耦而且要便于扩展--便于实时增加新的数据采集源头;二是要能够比较方便地完成规则的编写和下发。规则一般用动态语言编写,用热加载的方式执行。如果需要比较的数据量较大或者较复杂,在执行规则部分还可以引入流式计算来完成。
五、以下是构建高效高可用监控体系的详细步骤
1. 确定监控目标与指标
定义关键性能指标(KPIs):如响应时间、吞吐量、错误率等。
设定服务水平目标(SLOs):明确可接受的服务水平,例如99.9%的可用性。
2. 架构设计与组件选择
分布式架构:采用分布式监控架构,以保证监控系统的高可用性和扩展性。
选择监控工具:
Prometheus:适用于收集和聚合时序数据,支持多种数据源。
Grafana:提供强大的可视化功能,可以创建自定义仪表盘。
Zabbix:集成度高,适合中小型企业,拥有广泛的插件支持。
Elastic Stack (ELK):包括Elasticsearch, Logstash, Kibana,用于日志管理和分析。
Datadog 或 New Relic:云原生监控解决方案,易于部署和管理。
3. 数据采集
基础设施监控:CPU、内存、磁盘I/O、网络流量等资源使用情况。
应用性能监控(APM):跟踪应用程序内部的行为,如方法调用次数、数据库查询性能等。
业务逻辑监控:关注核心业务流程的关键指标,如订单处理成功率。
用户行为监控:通过前端埋点等方式捕捉用户体验的数据,如页面加载速度、点击流等。
4. 实时告警机制
阈值设置:根据历史数据和业务需求合理配置告警阈值。
智能告警:利用机器学习算法自动调整告警策略,减少误报。
多渠道通知:通过邮件、短信、即时通讯工具等多种方式发送告警信息给相关人员。
5. 日志管理和异常检测
集中式日志存储:所有组件的日志统一收集到中心化的日志管理系统中。
日志解析:使用正则表达式或其他解析技术将非结构化日志转换为结构化数据。
异常模式识别:基于规则或机器学习模型检测日志中的异常模式,及时预警潜在问题。
6. 自动化与自我修复
自动化运维脚本:编写脚本来执行常见的维护任务,如重启服务、清理缓存等。
自我修复能力:结合容器编排平台(如Kubernetes),实现故障节点的自动替换和服务的滚动更新。
7. 用户体验与反馈
可视化展示:构建直观的监控界面,帮助团队成员快速理解系统状态。
报告生成:定期生成监控报告,总结系统的健康状况和改进点。
用户反馈机制:建立渠道让最终用户能够提交关于系统表现的意见和建议。
8. 安全与合规性
访问控制:严格限制对监控系统的访问权限,确保只有授权人员可以查看敏感信息。
数据加密:在传输和存储过程中对监控数据进行加密保护。
审计追踪:记录所有的操作日志,便于事后审查和责任追究。
9. 持续优化
迭代改进:根据实际运行情况不断调整和完善监控策略。
新技术引入:关注行业动态和技术发展趋势,适时引入新的监控技术和工具。
通过上述步骤,可以构建起一个全面且高效的高可用监控体系,不仅能够实时监测系统的健康状态,还能有效预防和快速响应可能出现的问题,保障大型系统的稳定性和可靠性。
原创 李峰 漫谈测试