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室内场景。 作者指出,该…...
【农用无人机】dijkstra算法无人机农田农药喷洒路径规划【含Matlab源码 15284期】
💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…...
Docker启动Easysearch自定义密码5种方法,flask_socketio+pyautogui实现的具有加密传输功能的极简远程桌面。
Docker 启动 Easysearch 时自定义初始密码的几种方式 通过环境变量直接设置密码 在运行 Docker 容器时,可以使用 -e 参数传递环境变量 ELASTIC_PASSWORD 来设置初始密码。 docker run -d --name easysearch \-p 9200:9200 \-e "ELASTIC_PASSWORDyour_custom_pa…...
yz-bijini-cosplay惊艳效果:多光源环境下Cosplay角色面部光影层次还原
yz-bijini-cosplay惊艳效果:多光源环境下Cosplay角色面部光影层次还原 安全声明:本文仅讨论技术实现方案,所有生成内容均为技术演示用途,不涉及任何真人形象或不当内容。 1. 项目概述:专为Cosplay创作打造的AI图像生成…...
csp信奥赛c++之字符数组与字符串的区别
csp信奥赛c之字符数组与字符串的区别 一、字符数组与字符串的区别(详细讲解) 在C(尤其信奥赛CSP常用环境)中,“字符数组”和“字符串”通常指两种不同的数据类型或存储方式: 特性字符数组 (char[])字符串…...
(87页PPT)6大领域+50个战略框架模型(附下载方式)
篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92796370/92683878 资料解读:6 大领域 50 个战略框架模型 详细资料请看本解读文章的最后内容 在商业竞争日趋激烈的当下,系统…...
解锁AMD Ryzen处理器潜能:SMU Debug Tool全场景应用指南
解锁AMD Ryzen处理器潜能:SMU Debug Tool全场景应用指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…...
罕见模式检测新突破:docta的rare_score算法原理与实现
罕见模式检测新突破:docta的rare_score算法原理与实现 【免费下载链接】docta A Doctor for your data 项目地址: https://gitcode.com/gh_mirrors/do/docta 在数据科学领域,识别和处理罕见模式一直是一项极具挑战性的任务。docta作为一款专注于数…...
ASTM D4169针刺棉手袋的产品有效期验证方案
针刺棉手袋的产品有效期验证,核心是确定产品在正常使用条件下的使用寿命(通常以使用次数或年限表示),而不仅仅是物理保质期。 结合你之前关注医疗器械运输验证的背景,这里需强调:针刺棉手袋的“有效期”验…...
MTK6737平台LCD驱动移植保姆级教程:从供应商参数到开机Logo的完整避坑指南
MTK6737平台LCD驱动移植实战:从零构建显示系统的关键技术与避坑指南 在嵌入式设备开发中,显示系统作为人机交互的核心组件,其稳定性直接影响用户体验。MTK6737作为主流中端移动处理器平台,广泛应用于各类智能设备,而HX…...
别再只调参了!用决策树可视化你的Fashion MNIST分类过程,看看模型到底在‘看’哪里
决策树可视化:用Fashion MNIST解码模型注意力机制 1. 当深度学习遇到可解释性困境 在图像分类任务中,我们常常陷入一个矛盾:CNN等复杂模型虽然准确率高,但其决策过程如同黑箱。当模型表现不佳时,我们往往只能盲目调整超…...
