GitHub 的底层数据库从 MySQL 5.7 无缝升级到 MySQL 8.0 的实践经验
提到 MySQL 这个数据库软件,相信大家再熟悉不过了,不论是市场流行度还是占有率一直一来都非常靠前。
那再提到 MySQL 5.7 这个具体的版本,大家是不是也同样感到非常熟悉?
相信不少个人或者团队的生产环境所用的 MySQL 数据库也曾经是 5.7 这一版。
然而大家也知道,MySQL 5.7这个版本在大半年前就已经EOL(End of Life)了,也就是说 MySQL 5.7 版本已经达到终止生命周期状态。

MySQL 系列发布及EOL时间 图源:Oracle

当然,这里的终止并不是说这个版本不能用了,而是说这个版本自EOL之后,就不会再有来自社区官方的更新或者说补丁升级了。
这其实就和之前所谓的CentOS停止维护有点像,产品一旦EOL之后,不仅功能性bug没人修复,而且后续可能会出现的安全漏洞也没人管了。
虽然产品本身当然还可以接着用,但是产品后续的兼容性、安全性、稳定性方面都是潜在问题,最起码生产环境里没人敢用了。
那 MySQL 5.7 版本EOL之后,后续该用什么版本呢?
没错,不少企业或者团队开始向 MySQL 8.0 版本进行迁移。
比如不少云服务在 MySQL 这块默认也是给勾选的 8.0 版了。

除此之外,这里还有一个把数据库从MySQL 5.7迁移到 MySQL 8.0的实际公司案例,这个公司就是GitHub。
之前,GitHub 团队曾在官博中分享了他们将 GitHub 的底层数据库从 MySQL 5.7 无缝升级到 MySQL 8.0 的实践经验,我们正好可以借这个实际案例来看一看他们是怎么迁移的。
众做周知,GitHub发展至今,其数据量不是一个小数目。根据官博的介绍,GitHub 正是使用的 MySQL 来存储大量的关系型数据。
这里我们也可以来盘点一下 GitHub 现有的 MySQL 基础设施部署情况:
-
系统包含1200多台主机,其中包括数据中心内的Azure虚拟机和裸机主机。
-
存储超 300+TB 的数据,并在50多个数据库集群上提供550万次查询/秒的服务。
-
每个集群都配置了高可用,采用了主备集群配置。
-
采用了数据分区,利用水平分片和垂直分片来扩展MySQL集群,以及使用特定的MySQL集群来为特定产品领域存储数据。除此之外,还设置有水平分片的Vitess集群来服务于特定的领域。
-
具备庞大的工具生态系统,包括像 Percona Toolkit、gh-ost、orchestrator、freno 以及相关的内部自动化工具。
所有这些加在一起,就构成了一个庞大且复杂的数据库系统。
而对这样一个系统进行版本升级,并且还要保证系统平稳,不影响后台数据以及网站提供的服务,所以其难度可想而知了。
GitHub团队表示,为了升级到MySQL 8.0,升级准备工作其实早在2022年7月就开始了,团队前前后后搞了一年多才完成。
所以在正式的迁移工作之前,GitHub 团队做了三个方面的工作,包括:
1、准备升级所需的基础设施
首先需要为MySQL 8.0确定适当的默认值,并执行一些基准性能测试。
另外由于需要操作新老两个版本的 MySQL,其内部所用的工具和自动化设施需要能够支持处理两个混合版本,并了解5.7和8.0之间新的、不同的或者已经弃用的语法。
2、确保软件的兼容性
这一步主要是利用CI系统来完成。
通过借助CI系统来检测各种错误和不兼容性,以帮助他们来移除任何不支持的配置或功能。
团队将MySQL 8.0添加到所有使用MySQL应用程序的CI系统中,并在CI系统中并行运行MySQL 5.7和8.0两个版本,以确保在后续漫长的升级过程中不会出现问题。
3、团队沟通和透明度
为了准备这次MySQL版本升级计划,其团队使用GitHub Projects创建了一个升级日历,以便内部沟通和跟踪具体的升级计划。
同时其也为软件团队和数据库团队创建了跟踪清单的问题模板,以便于协调升级。
具体的项目看板类似于下图,以便于跟踪问题。

而实际的升级过程中,团队则采用的是渐进的升级策略,以满足在升级过程中所需要的 checkpoint 和回滚需求。
具体步骤如下:
Step 1、滚动副本升级
从单个副本开始,逐步监控并升级,然后放入生产流量同时观察各项指标,最终逐渐将MySQL 8.0的副本上线,直至升级到整个数据中心。
下图展示了每个数据中心DC内的副本升级策略。

Step 2、备份拓扑升级
一旦所有只读流量都通过 MySQL 8.0 副本来提供服务,团队则调整复制拓扑为如下逻辑:
-
一个8.0主系统被配置为直接从当前5.7主系统下来进行复制
-
在该8.0副本的下游创建两条复制链
-
一组只有5.7副本(不提供流量,但可以用于回滚)
-
一组只有8.0的副本(服务流量)
-
在进行下一步骤之前,这种拓扑只会在很短的一段时间内(最多几个小时)处于这种状态。
Step 3、将 MySQL 8.0 主机升级为主用
这一步也采取了一种谨慎的升级策略,通过先提升一个8.0版本的副本为新的主用库,来逐步进行数据库的升级,并确保在升级过程中有足够的回滚能力和服务能力。
Step 4、内部实例类型升级
由于内部还存在用于备份或非生产性的辅助数据库服务器,为保持一致性,这些辅助机器也进行了版本升级。
Step 5、清理工作
最后一步就是清理工作。
即在确认集群不需要回滚,并且已经成功升级到8.0版本之后,这时候就可以删除老的5.7服务器了。
同时验证工作需要包括至少一个完整的24小时流量周期,以确保后续不会出现问题。
所以从上述内容可以看出,不管是升级之前所做的准备工作,还是具体升级所制定的计划,GitHub都做了大量备份、冗余、验证的工作,从而保证系统能够顺利切换至新版本机器。
对于一个公司或者团队来说,数据库都是一个非常重要且关键的组件,因此涉及数据库相关的升级或者迁移,企业和团队都会比较慎重,毕竟会涉及到数据安全和业务稳定。
从上面GitHub迁移MySQL版本的实际案例中多少也能隐约感受到,MySQL旧版本逐渐开始退场,全面拥抱MySQL新版的阶段或许也已经正在路上了。
相关文章:
GitHub 的底层数据库从 MySQL 5.7 无缝升级到 MySQL 8.0 的实践经验
提到 MySQL 这个数据库软件,相信大家再熟悉不过了,不论是市场流行度还是占有率一直一来都非常靠前。 那再提到 MySQL 5.7 这个具体的版本,大家是不是也同样感到非常熟悉? 相信不少个人或者团队的生产环境所用的 MySQL 数据库也曾…...
概率图模型在自然语言处理中的应用
概率图模型在自然语言处理(NLP)中的应用广泛且重要,它结合了概率论和图论,为处理复杂系统中变量之间的概率依赖关系提供了有效的建模方法。以下是概率图模型在NLP中的几个主要应用,结合参考文章中的相关信息进行详细说明: 核心概念与分类: 概率图模型的核心思想是利用图…...
AI网络爬虫:对网页指定区域批量截图
对网页指定区域批量截图,可以在deepseek的代码助手中输入提示词: 你是一个Python编程专家,一步一步的思考,完成一个对网页指定区域截图的python脚本的任务,具体步骤如下: 设置User-Agent: Mozilla/5.0 (…...
centos系统清理docker日志文件
centos系统清理docker日志文件 1.查看docker根目录位置2.清理日志 1.查看docker根目录位置 命令:docker info ,将Docker Root Dir 的值复制下来。如果目录中包含 等特殊符号的目录,需要转义 2.清理日志 创建文件:vim docker_logs_clean.…...
算法金 | Python 中有没有所谓的 main 函数?为什么?
大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 定义和背景 在讨论Python为何没有像C或Java那样的明确的main函数之前,让我们先理解一下什么是main函数以及它在其他编程语言…...
RocketMQ相关知识知多少
一、RocketMQ的定义 官网网址:领域模型概述 | RocketMQ Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金…...
C++vector部分实现及感悟
myvector.h #pragma once #include<assert.h> #include<iostream> #include<vector> using namespace std; namespace bit {template<class T>//必须使用typename场景\template<typename T>与template<class T>一般情况下这两个通用&#…...
MySql什么时候表锁or行锁?
文章目录 锁的基本概念共享锁(读锁)排他锁(写锁)锁的兼容性锁的升级和降级 全局锁、表锁、行锁全局锁表锁行锁 何时使用行锁何时使用表锁额外思考: 在数据库的世界里,性能优化是一个永恒的话题。MySQL作为广…...
Stable Diffusion WebUI详细使用指南
Stable Diffusion WebUI(AUTOMATIC1111,简称A1111)是一个为高级用户设计的图形用户界面(GUI),它提供了丰富的功能和灵活性,以满足复杂和高级的图像生成需求。由于其强大的功能和社区的活跃参与&…...
Android中focusableInTouchMode会导致第一次点击事件失效
我们很多时候会对某些View设置点击事件,但是,当对这个View同时设置了focusableInTouchModetrue时,第一次点击事件会被消费为为此View获取焦点。 <Viewandroid:id"id/v_click"android:layout_width"match_parent"andr…...
C语言| 输出菱形*(梳理篇II)
C语言| 输出菱形*-CSDN博客 凡事还是得自己独立思考后,写一遍程序才能发现问题所在。 容易犯的错误: 【完整程序注释】 运行结果 /* 输出菱形 1 总行数 n为奇数,分上三角形下三角形,只考虑左边的空格和星号* 2 上三角形 行数…...
conda使用
因为时不时搜索conda操作,就想着逐步将先前的conda使用整理在一起,并添加新的内容。 目录 0.简介1.常用操作场景1.1 取消终端conda自动启动 0.简介 1.常用操作场景 1.1 取消终端conda自动启动 安装conda后取消命令行前出现的base,取消每次…...
适合小白学习的项目1949java图片管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java图片管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发&…...
Jmeter实战教程入门讲解
前言 通过前面对Jmeter元件的讲解,大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序,可以看看我这篇性能测试学习之路(三)—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…...
Flutter 中的 PrimaryScrollController 小部件:全面指南
Flutter 中的 PrimaryScrollController 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的滚动机制中,PrimaryScrollController 起着至关重…...
Windows线程同步的四种方式和区别
1. Windows线程同步的四种方式 2. 区别 Critical Section更多强调的是保护,Event对象、Mutex对象与Semaphore对象更多的强调的是同步;Critical Section对象是无法设置等待超时的,而其他三个对象则可以设置等待超时,从这一点来讲…...
C++ 20新特性之Concepts
C20的新特性之一Concepts,为C的模板编程带来了重大的改进和便利。以下是关于C20中Concepts特性的详细介绍: 基本概念 定义:Concepts是C20中引入的一种新的语言特性,用于限制类和函数模板的模板类型和非类型参数。它允许你为模板编…...
MATLAB基础应用精讲-【数模应用】SPSSAU数据处理
目录 SPSSAU 标题修改 1、说明 2、举例 数据标签 1、说明 2、举例...
AI大模型探索之路-实战篇15: Agent智能数据分析平台之整合封装Tools和Memory功能代码
系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6:掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…...
CV每日论文--2024.6.4
1、Mixed Diffusion for 3D Indoor Scene Synthesis 中文 标题:用于 3D 室内场景合成的混合扩散 简介:这篇论文提出了一种名为MiDiffusion的混合离散-连续扩散模型,用于从给定的房间类型、平面图和可能存在的物体中合成逼真的3D室内场景。 作者指出,该…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
