uber是如何不停机升级MySQL数据库

date
Nov 11, 2024
slug
How-uber-upgraded-the-MySQL-database-without-downtime
status
Published
tags
数据库
后台开发
summary
你作为一个后台开发正在负责维护一个网站或者APP,某一天运维突然告诉你我们要升级数据库的版本,你上报Leader后,此时Leader让你给出一个升级的技术方案。于是你脑袋一拍说我们可以夜间停机升级,此时的用户访问量低。如果是小应用,这样做倒是无妨,如果你运行的是一个大型应用,即使在夜间用户的访问基数也相当大,停机升级则肯定不是个能让领导们接受的方案。如果你的应用还是像uber这样一个需要跨全球多个时区,那几乎24小时都有大量的用户在使用。 这次就来看看uber是如何解决这个线上不停机无损升级的。
type
Post
你作为一个后台开发正在负责维护一个网站或者APP,某一天运维突然告诉你我们要升级数据库的版本,你上报Leader后,此时Leader让你给出一个升级的技术方案。于是你脑袋一拍说我们可以夜间停机升级,此时的用户访问量低。如果是小应用,这样做倒是无妨,如果你运行的是一个大型应用,即使在夜间用户的访问基数也相当大,停机升级则肯定不是个能让领导们接受的方案。如果你的应用还是像uber这样一个需要跨全球多个时区,那几乎24小时都有大量的用户在使用。
这次就来看看uber是如何解决这个线上不停机无损升级的,原文链接如下。

升级流程

uber将整个MySQL的升级分为了四个阶段,确保最小的服务中断。
预维护(Pre-Maintenance)阶段
notion image
在这个阶段中,8.0版本的MySQL会作为副本(replicas)加入到MySQL的集群中,这个副本只拥有数据读取的权限。此时整个MySQL集群中,主节点依旧是5.7的版本,而副本节点则会包含5.7和8.0两个版本,并且8.0版本的副本将会接受来自生产环境的数据读取流量。
浸泡阶段(Soak Period)
这个过程是系统监控的阶段,需要监控上线的8.0版本的MySQL副本是否出现性能异常、错误等问题,持续大约一周,因此也被称为浸泡期。这个过程也至关重要,很多潜在的问题都能在这个阶段被发现。
维护(Maintenance)阶段
notion image
在这个阶段,会将8.0版本的MySQL作为主库,将写操作切换到这个主库,同时副本中5.7版本的MySQL节点也会被逐步降级和关闭,流量会逐步从5.7切换到8.0。文中关于这一步骤说的比较少,但我认为这个步骤应该是所有阶段里最难的一步。在切换写流量前会出现两个版本的主库,流量也是逐步的切换过去,既然是无损切换,那就可能同时有两个版本主库在接受写操作,如何确保数据一致,这点文中并没有给出说明。
可以将两个主库进行双主复制,写流量在进入两个版本的主库后,也会复制到另一个版本的主库。接下来再逐步减少旧版本的写流量,增加新版本的写流量。
后维护(Post-Maintenance)阶段
notion image
维护期结束后,所有的5.7版本的MySQL节点都被移除,所有流量都进入了8.0版本的MySQL,完成了升级的所有流程。

升级过程会出现的问题

这么大版本的变更,升级的过程势必也会存在问题,uber也总结了几个他们出现的问题供我们参考:
  1. 查询执行计划更改。查询执行计划是数据库用于检索数据的路径,8.0版本的MySQL在查询的路径上与5.7存在一些差别,导致uber出现了更高的延迟和资源消耗。后来是通过与合作伙伴Percona开发补丁的方式得到解决。
  1. 不支持的查询和配置。MySQL 8.0 引入了新的语法规则和更严格的配置设置,这导致一些在 MySQL 5.7 中可以运行的查询在升级后失败。此时只能在业务代码中去修改查询语句,去适应8.0的规则。
  1. 排序和字符集的改变。MySQL 8.0 也带来了默认字符集和排序规则的更改。字符集控制文本的存储方式,而排序规则决定了文本的比较方式。默认字符集和排序规则的更改会导致不同集群之间排序和比较文本数据的问题,尤其是在处理不同语言或特殊字符时。系统需要在排序设置上保持一致性才能正常运行。
  1. 客户端库不兼容。一些过时的MySQL客户端库可能会存在8.0的兼容问题,也可能会无法使用一些8.0的特性,需要即使升级。

其他值得学习的事项

文中也提到了一些非常值得学习的点:
  1. 自动化至关重要。整个升级的过程自动化,尽可能的减少人为操作可能带来的错误,并保证效率。
  1. 全方面的测试。在进行全面生产部署之前,必须进行广泛的测试,包括回归检查和系统验证,以识别和解决问题,确保现有应用程序保持兼容性。
  1. 回滚机制。建立自动回滚机制对于保持服务连续性和在升级过程中遇到意外问题时防止数据丢失至关重要。
  1. 协作。与合作伙伴如 Percona 的合作帮助 Uber 迅速解决了特定问题,例如查询执行计划的更改和性能瓶颈。