Uber最近成功地将其数据库系统从MySQL 5.7升级到MySQL 8.0,以应对MySQL 5.7在2023年10月结束生命周期的问题,并充分利用新版本在性能和并发处理上的提升。这次升级历时一年多,涵盖了19个生产区域中的超过2100个集群和16000个节点,分布在3个不同的地区。
升级背景
在Uber的博客文章中,Siddharth Singh等人解释说,MySQL基础设施包含多个PB的数据,并处理超过300万次每秒的查询。因此,在升级过程中最小化中断至关重要。为此,Uber的工程团队自动化了一个系统,引导每个集群通过多阶段的升级过程,无需手动干预。
升级策略
Singh继续解释他们为何选择并排升级策略而不是就地升级。这一决定是出于他们需要最小化停机时间、降低风险并允许更好的测试。

并排升级过程
并排升级过程涉及几个阶段:
- 为集群中的每个MySQL 5.7节点在同一地区或区域添加了一个对应的MySQL 8.0副本节点。
- 随后是为期一周的监控期,以观察系统性能并发现任何问题。
- 当这个“浸泡期”结束时,工程师将流量从5.7副本节点转移,并提升每个集群的MySQL 8.0节点为主要状态。
- 最后,所有MySQL 5.7节点从集群中移除,完成了向版本8.0的过渡。
挑战与解决方案
升级带来了挑战。升级到MySQL 8.0后,一些集群的查询执行计划发生了变化,导致延迟和资源消耗增加。与数据库软件公司Percona合作,Uber的团队识别并实施了受影响集群的修复。
其他问题包括:
- 一些不兼容的查询和配置
- 默认字符集和排序设置的变化
- 需要升级客户端库以兼容MySQL 8.0
行业案例与建议
Uber并不是唯一分享如何在大规模上最好地进行这一重大升级的故事的公司。正如GitHub也从5.7升级到了8.0,其中一些经验也被分享。
Percona的Przemyslaw Malkowski也在一篇详细的文章中讨论了如何避免MySQL升级到8.0时的灾难,强调在升级前测试写入相关工作负载的难度,并强调了数据丢失、慢查询、潜在的停机时间和客户端应用程序不兼容的可能性。Malkowski 还解释了如何在必要时降级。
其他组织已从升级到 MySQL 8.0 中受益。来自 Arzooo 的 Jyoti Ranjan Parida 在 Medium 文章中解释了升级的一些好处:
- 新功能,如窗口函数、通用表表达式和 JSON 增强功能
- 更好的性能,改进的索引和查询执行
- 更好的密码过期策略
- 改进的资源管理并支持更高效的查询
- 组多源复制
Parida 还解释了升级时需要注意的一些事项,并列出了完整的先决条件操作,例如:
- 确保数据类型和函数不会过时
- 删除孤立文件和无效触发器
- 避免使用不受支持的分区表
- 解决关键字冲突
- 使用新数据字典消除命名冲突
- 更新过时的 SQL 模式
- 检查 ENUM/SET 列长度
- 从共享表空间重新定位表分区
- 使用 ASC 或 DESC 修订较旧的 GROUP BY 子句
- 缩短长外键名称
- 考虑将 utf8mb3 转换为 utf8mb4 以获得更好的 Unicode 支持
性能提升
尽管他们遇到了障碍,但Uber的升级带来了显著的性能提升。服务器端基准测试显示,在高并发水平下,插入的延迟提高了29%,读取提高了33%,更新提高了47%。在客户端,一些查询速度提高了78%,整体数据库锁定时间减少了94%。
“通过仔细考虑利弊和挑战,我们成功地导航了过渡,减轻了风险,并将对我们的服务的干扰降到最低。”
——Siddharth Singh, Sriram Rao Udupi, Raja Sriram Ganesan, Debadarsini Nayak(Uber)
原文作者:Matt Saunders
2024年10月14日




