写点什么

优步完成了主要 MySQL 集群组的升级,提升了性能和安全性

作者:Matt Saunders

  • 2024-11-05
    北京
  • 本文字数:1827 字

    阅读完需:约 6 分钟

优步完成了主要MySQL集群组的升级,提升了性能和安全性

优步(Uber)对其 MySQL 数据库集群组进行了重大的改进,版本从 5.7 升级到了 8.0。该团队希望利用 MySQL 新版本性能和并发性相关的改进,因为 MySQL 5.7 在 2023 年 10 月已经过保,不再维护。这项工作耗时一年多,涉及到升级三个地区 19 个生产区域的 2100 多个集群和 16000 个节点。


在优步(Uber)的博客文章中,Siddharth Singh 等人解释说,MySQL 基础设施包含数 PB 的数据,每秒处理超过 300 万次查询。因此,在升级过程中尽量减少中断是至关重要的。为了帮助实现这一点,优步(Uber)工程团队自动化了一个系统,以引导每个集群完成多阶段的升级过程,而无需人工干预。Singh 继续解释了他们是如何选择并行升级策略而不是选择就地升级策略的。这一决定是由于他们需要尽量最小化停机时间、降低风险,并进行更好的测试。



并行升级过程涉及几个阶段。首先,优步(Uber)为集群中的每个 MySQL 5.7 节点在同一区域或地区添加了相应的 MySQL 8.0 副本节点。随后进行了为期一周的监控,以观测系统的性能并检测任何问题。当这个“渗透期”结束之后,工程师们将流量从 5.7 版本的副本节点中转移出来,并将每个集群的 MySQL 8.0 节点提升为主节点。最后,将所有的 MySQL 5.7 节点从集群中删除,完成向 8.0 版本的转型。


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


这次升级也面临着挑战。升级到 MySQL 8.0 后,一些集群的查询执行计划发生了变化,从而导致了延迟和资源消耗的增加。通过与数据库软件公司 Percona 的合作,优步(Uber)确定并实施了受影响集群的修复程序。其他问题还包括:


  • 一些不兼容的查询和配置

  • 默认字符集和排序规则设置的更改

  • 需要升级客户端库以兼容 MySQL 8.0。


优步(Uber)并不是唯一一家分享如何更好地大规模启动这一重大升级的公司。正如 InfoQ 今年早些时候所报道的那样,GitHub 也进行了类似的升级,也从 5.7 升级到了 8.0,并分享了一些经验教训。在升级的众多发现中,GitHub 还遇到了一些问题,例如当使用的客户端中使用了不同的框架和语言时,从 8.0 到 5.7 的反向复制会中断,从而缩短了潜在的回滚窗口。它们还会触发复制缺陷,并在运行具有较大 WHERE IN 值的查询时遇到崩溃。


Percona 的 Przemysław 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(优步)

作者介绍


Matt Saunders 是 Adaptavist 首席技术官的 DevOps 主管。帮助团队使用 DevOps、平台工程和云原生工具和相关技术,以快速高效地交付可靠、高质量的软件,同时尽量减少压力。他曾与复杂的企业、小型初创企业、中小企业以及介于两者之间的所有企业合作过。还共同组织了伦敦的 DevOps 聚会小组,该小组拥有 10000 多名成员,每月举办一次非常受欢迎的行业活动。


原文链接:

https://www.infoq.com/news/2024/10/uber-mysql-80-upgrade/

2024-11-05 08:0011745

评论 1 条评论

发布
用户头像
感谢分享
2024-11-28 16:52 · 北京
回复
没有更多了
发现更多内容

80 行代码实现简易 RxJS

CRMEB

日志管理系统,多种方式总结

架构 日志 slf4j logback

基于STM32+ESP8266+华为云IoT设计的智能门锁

DS小龙哥

2月月更

如何写好一个Java类?

蜜糖的代码注释

Java 整洁代码 2月月更

7大迹象,表明你的DevOps 做对了!

飞算JavaAI开发助手

2022重磅:增长法则-巧用数字营销 突破企业困局

博文视点Broadview

互联网人的命运,就是活到30岁都难?

码农参上

人生 互联网人 打工人

理论+实践,带你掌握动态规划法

华为云开发者联盟

AI 算法 动态规划法 子问题

云原生训练营-Week02

jjn0703

云原生训练营

架构训练营模块八作业

沈益飞

架构训练营 架构师训练营 4 期

模块八作业-设计消息队列存储消息的MySQL表

CH

架构实战营 #架构实战营 「架构实战营」

【架构实战营】模块八:命题作业

wgl

「架构实战营」

消息队列基于Mysql存储表设计

tony

「架构实战营」

大数据培训:Flink的提交模式

@零度

大数据 flink

模块八作业

hunk

云原生训练营

模块八 - 消息队列存储数据表结构设计

圈圈gor

架构实战营 「架构实战营」

喜报!龙蜥操作系统&龙蜥社区双双荣登2021“科创中国”开源创新榜!

OpenAnolis小助手

开源 操作系统 创新

郑州轻工业大学——HarmonyOS宠物健康系统的开发分享

HarmonyOS开发者

HarmonyOS 健康检查

鉴机识变,面向未来|RocketMQ Summit 2022 即将来袭

阿里巴巴云原生

阿里云 开源 RocketMQ 云原生 开源消息队列

架构实战模块八作业

Anlumina

「架构实战营」

模块八作业

李晓笛

「架构实战营」

编写 Kubernetes 部署脚本将 httpserver 部署到 Kubernetes 集群

tom

分享两个常见的搜索算法:BFS和DFS

华为云开发者联盟

算法 DFS 深度优先搜索 BFS 搜索算法

Go 语言入门很简单:从 goroutine 出发到并发

宇宙之一粟

Go 语言 goroutine 2月月更

史上最强代码自测方法,没有之一!

万俊峰Kevin

微服务 单元测试 go-zero 测试工具 Go 语言

第八周作业

cqyanbo

不能Hook的人生不值得 jsHook和模拟执行

奋飞安全

安全 js hook jshook

架构实战营4期-模块八作业

木几丶

「架构实战营」

模块八作业

黄秀明

「架构实战营」

java培训:Java类加载机制的理解

@零度

JAVA开发 类加载机制

2022年中国智慧医疗行业洞察

易观分析

智慧医疗

优步完成了主要MySQL集群组的升级,提升了性能和安全性_数据集成_InfoQ精选文章