【译】AWS RDS性能降低 - 复盘 - Honeycomb

简介: >原文:https://www.honeycomb.io/blog/rds-performance-degradation-postmortem/ >译:时序 # 概要 注:除非特别说明,所有时间都是UTC。 5月3号周四, 从00:39:08 UTC(周三 17:39 PDT)我们经历了一次Honeycomb服务的大约24分钟的彻底停机。大部分服务恢复时间是2018-05

原文:https://www.honeycomb.io/blog/rds-performance-degradation-postmortem/
译:时序

概要

注:除非特别说明,所有时间都是UTC。

5月3号周四, 从00:39:08 UTC(周三 17:39 PDT)我们经历了一次Honeycomb服务的大约24分钟的彻底停机。大部分服务恢复时间是2018-05-03 01:02:49,所有面向客户的服务恢复是在01:07:00。

影响

  • 在停机期间,客户不能登录或查看Honeycomb服务的图表。
  • 停机期间发送给Honeycomb API的事件被大量拒绝;大约86%的API不能服务,而且大约81%的应该已经提交的事件在停机期间没有被记录。(百分比的差距是由于一个单独的API可以处理不同的事件并且停机没有平均影响到所有数据集)
  • 由于Honeycomb API没有报告成功,一些仍存储在客户服务上的事件在Honeycomb API恢复正常后又被重新提交。
  • 停机期间大约有15%的事件成功保存

我们对这次停机影响的每一个客户都十分抱歉。我们对于数据的管理十分认真,并通过对系统的多项改进措施来确保未来这类的停机事件不会造成数据丢失,并确保我们在类似的失败中可以更快的恢复。

发生了什么?

事后看,故障链只有4点连通:

  1. 我们产品使用的RDS MySQL数据库实例经历了一次突然的和大规模的性能减低; P95(query_time)从11毫秒变成>1000毫秒,同时写操作吞吐在20秒内从 780/秒降到 5/秒。
  2. RDS没有识别到故障,所以 Mutil-AZ feature没有激活故障转移。
  3. 由于增加的query_time导致的延迟, Go的MySQL客户端连接池被等待慢查询结果的连接填满了并且作为补偿又打开了更多的连接。
  4. MySQL服务器的max_connections设置达到了上限,导致定时任务和新启动的后台进程不能连接到数据库并导致“Error 1040:Too many connections”的日志信息。

恢复部分很快:

  1. RDS数据库的延迟和吞吐突然出现改善;在20秒内P95(query_time)写从>600ms 掉到 <200ms, 同时总吞吐从<500OPS 变成>2500OPS。
  2. 排队的事件快速完成,数据库在70秒内的OPS大于3000, 并在回到正常状态时变成: 300-500OPS,<10ms 写。

我们如何得到答案的故事是一个如何使用Honeycomb来debug生产系统的有趣的例子。

根因分析

在之后第二天早上我们的复盘会议上,两个理论摆在桌上:

  1. 大量的连接数导致停机,并引起了数据库运行缓慢,或
  2. 数据库由于一些原因运行缓慢,导致大量的连接数。

我们担心一些bug隐藏在我们的应用里(或我们使用的其中一个Go库)导致我们的应用在不能连接数据库时关机,这样在同样情况再发生时又会导致一样的停机故障。
每个人都同意这很像是下层数据库的问题(存储,CPU或连接)是根因,但我们也同意如果我们以抱怨网络的方式忽略一个潜在应用级的bug会更有危险。

作为开发者的责任:这可能不是数据库,而可能是你的代码问题。

为了降低风险,我们决定在受控环境来重现Error 1040场景并观察系统表现。在我们的实验集群上重现连接池溢出清楚的表明了连接满确实会影响应用并导致定时任务失败,它不会导致失控的CPU或延迟升高。

我们现在有两个数据集:生产的停机和实验用的。由于我们使用Honeycomb来观察Honeycomb,所以在这个例子对比A和B很容易

实验生产停机
image.png
image.png

左边,实验集群从12:30到13:23(除了一些失败的定时任务很难看出证据)运行,而在右边,生产的停机很清楚地显示着。实验有个空结果:我们没有发现 Error 1040导致了停机。看起来像是系统的一些底层问题导致的。

有了这个信息,我们需要在生产数据上挖掘的更深入了。由于Honeycomb数据集是高保真的(我们不做任何聚合或预先的计算),可以将数据调整到每秒级别并调整数据来抽取模式。这里是从rdslogs里记录的性能数据。
image.png
有15秒没有活动,然后有一批query_time值达到了15秒的完成动作,看起来很明显。在结束时的性能异常也有一个有意思的热力图模式:
image.png
概括下,数据展示了高于23分钟的低吞吐,高延迟行为,并持续了少于30秒切换区域,之前是正常的高吞吐,低延迟,尖峰应用驱动的行为,接着是大量的追赶事件,最后切换到正常的高吞吐模式。

由于这不是一个全面的根因分析,但对于我们明确问题在数据库系统而不是我们的应用代码已经够了;我们的应用看起来运行正常。我们之后再SQL的normalized_query字符串上验证了我们的代码在恢复过程中工作符合预期。

得到这些信息后我们重新调查了我们的RDS配置并确认

  • Multi-AZ是打开的。
  • 实例监视面板没有显示任何健康事件。
  • AWS文档指出Multi-AZ不会考虑性能作为健康检查的内容

经验

  • 受管理的数据库很好,除非他们没托管。
  • 我们会优先考虑在“game day”运行我们的实验RDS做故障转移来重新验证在硬件故障时我们对于我们系统运行的理解。虽然我们不认为RDS会有很多硬件故障,但当我们需要处理RDS AZ故障转移时我们需要一个准备好的手册来执行。
  • 我们在改进我们的管道来保证在基础设施不能连接到数据库时接受的用户事件我们可以缓存它们而不是失败。硬件问题发生,这就是生活;丢失数据不需要发生。

时间线 (2018-05-03 UTC)

00:39 – outage starts

00:40 – first alert

00:42 – engineers start investigation

00:50 – escalation, multiple investigators looking at several potential avenues

00:55 – status.honeycomb.io updated to keep our customers informed

00:58 – first engineering interventions to attempt to heal system, minimal impact

01:03 – outage resolution starts

01:04:23 – resolution completes, system stabilized

01:15 – engineers conclude that outage is resolved, update status.honeycomb.io

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
722 158
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
853 156
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
891 161
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
|
缓存 关系型数据库 MySQL
MySQL数据库性能调优:实用技术与策略
通过秉持以上的策略实施具体的优化措施,可以确保MySQL数据库的高效稳定运行。务必结合具体情况,动态调整优化策略,才能充分发挥数据库的性能潜力。
914 0
|
缓存 关系型数据库 MySQL
ThinkPHP框架show columns引发mysql性能问题
ThinkPHP框架的show columns引发mysql性能问题,结尾有关闭方式。
638 13
|
关系型数据库 MySQL OLAP
无缝集成 MySQL,解锁秒级 OLAP 分析性能极限,完成任务可领取三合一数据线!
通过 AnalyticDB MySQL 版、DMS、DTS 和 RDS MySQL 版协同工作,解决大规模业务数据统计难题,参与活动完成任务即可领取三合一数据线(限量200个),还有机会抽取蓝牙音箱大奖!
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
2236 1

热门文章

最新文章

推荐镜像

更多