优步完成重大MySQL车队升级,提升性能与安全性

Uber升级MySQL数据库至8.0版本

Uber最近将其MySQL数据库从5.7版本升级到8.0版本,以利用新版本的性能和并发性改进,并应对MySQL 5.7在2023年10月停止支持的问题。这一升级过程耗时一年多,涉及三个地区的19个生产区域中的2100多个集群和16000多个节点。

升级背景与动机

Uber的MySQL基础设施处理着数PB的数据,每秒处理超过300万次查询。因此,在升级过程中最小化服务中断至关重要。Uber的工程团队开发了一套自动化系统,引导每个集群通过多阶段的升级过程,无需手动干预。

升级策略

Uber选择了并排升级策略,而不是原地升级。这种策略旨在最小化停机时间、降低风险,并允许更好的测试。升级过程包括以下几个阶段:

  1. 为每个MySQL 5.7节点在同一区域或区域中添加相应的MySQL 8.0副本节点。
  2. 进行为期一周的监控,观察系统性能并检测任何问题。
  3. 监控期结束后,将流量从5.7副本节点转移,并将MySQL 8.0节点提升为每个集群的主节点。
  4. 最后,从集群中移除所有MySQL 5.7节点,完成向8.0版本的过渡。

系统稳定性与数据完整性

在升级过程中,系统稳定性和数据完整性是主要的关注点。团队计划如果检测到任何服务降级,立即回滚到MySQL 5.7,直到他们有足够信心将MySQL 8.0节点提升为主节点。此后,回滚到5.7将不再支持,因此需要避免。

升级中的挑战

升级到MySQL 8.0后,一些集群的查询执行计划发生了变化,导致更高的延迟和资源消耗。Uber团队与数据库软件公司Percona合作,识别并实施了受影响集群的修复措施。其他问题包括:

  • 一些不兼容的查询和配置
  • 默认字符集和排序设置的变更
  • 需要升级客户端库以兼容MySQL 8.0

其他组织的经验

GitHub也进行了类似的从5.7到8.0的升级,并分享了一些经验教训。他们遇到了从8.0到5.7的向后复制问题,以及在使用大WHERE IN值时触发的复制错误和崩溃。

Percona的Przemysław Malkowski详细介绍了如何避免MySQL升级到8.0时可能发生的灾难,强调在升级前测试写相关工作负载的困难,并指出了数据丢失、慢查询、潜在停机时间和客户端应用程序不兼容的可能性。

Arzooo的Jyoti Ranjan Parida在Medium文章中解释了升级到MySQL 8.0的一些好处,包括新功能(如窗口函数、通用表表达式和JSON增强)、更好的性能、密码过期策略改进、资源管理改进以及组多源复制。

升级后的性能改进

尽管遇到了障碍,Uber的升级带来了显著的性能改进。服务器端基准测试显示,在高并发水平下,插入的延迟提高了29%,读取提高了33%,更新提高了47%。在客户端,一些查询速度提高了78%,整体数据库锁定时间减少了94%。

结论

Uber通过仔细考虑升级的好处和挑战,成功完成了向MySQL 8.0的过渡,降低了风险并最小化了服务中断。

阅读 48
0 条评论