当前位置: 首页 > news >正文

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行锁?

文章目录 锁的基本概念共享锁&#xff08;读锁&#xff09;排他锁&#xff08;写锁&#xff09;锁的兼容性锁的升级和降级 全局锁、表锁、行锁全局锁表锁行锁 何时使用行锁何时使用表锁额外思考&#xff1a; 在数据库的世界里&#xff0c;性能优化是一个永恒的话题。MySQL作为广…...

Stable Diffusion WebUI详细使用指南

Stable Diffusion WebUI&#xff08;AUTOMATIC1111&#xff0c;简称A1111&#xff09;是一个为高级用户设计的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它提供了丰富的功能和灵活性&#xff0c;以满足复杂和高级的图像生成需求。由于其强大的功能和社区的活跃参与&…...

Android中focusableInTouchMode会导致第一次点击事件失效

我们很多时候会对某些View设置点击事件&#xff0c;但是&#xff0c;当对这个View同时设置了focusableInTouchModetrue时&#xff0c;第一次点击事件会被消费为为此View获取焦点。 <Viewandroid:id"id/v_click"android:layout_width"match_parent"andr…...

C语言| 输出菱形*(梳理篇II)

C语言| 输出菱形*-CSDN博客 凡事还是得自己独立思考后&#xff0c;写一遍程序才能发现问题所在。 容易犯的错误&#xff1a; 【完整程序注释】 运行结果 /* 输出菱形 1 总行数 n为奇数&#xff0c;分上三角形下三角形&#xff0c;只考虑左边的空格和星号* 2 上三角形 行数…...

conda使用

因为时不时搜索conda操作&#xff0c;就想着逐步将先前的conda使用整理在一起&#xff0c;并添加新的内容。 目录 0.简介1.常用操作场景1.1 取消终端conda自动启动 0.简介 1.常用操作场景 1.1 取消终端conda自动启动 安装conda后取消命令行前出现的base&#xff0c;取消每次…...

适合小白学习的项目1949java图片管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java图片管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发&…...

Jmeter实战教程入门讲解

前言 通过前面对Jmeter元件的讲解&#xff0c;大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序&#xff0c;可以看看我这篇性能测试学习之路&#xff08;三&#xff09;—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…...

Flutter 中的 PrimaryScrollController 小部件:全面指南

Flutter 中的 PrimaryScrollController 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的滚动机制中&#xff0c;PrimaryScrollController 起着至关重…...

Windows线程同步的四种方式和区别

1. Windows线程同步的四种方式 2. 区别 Critical Section更多强调的是保护&#xff0c;Event对象、Mutex对象与Semaphore对象更多的强调的是同步&#xff1b;Critical Section对象是无法设置等待超时的&#xff0c;而其他三个对象则可以设置等待超时&#xff0c;从这一点来讲…...

C++ 20新特性之Concepts

C20的新特性之一Concepts&#xff0c;为C的模板编程带来了重大的改进和便利。以下是关于C20中Concepts特性的详细介绍&#xff1a; 基本概念 定义&#xff1a;Concepts是C20中引入的一种新的语言特性&#xff0c;用于限制类和函数模板的模板类型和非类型参数。它允许你为模板编…...

MATLAB基础应用精讲-【数模应用】SPSSAU数据处理

目录 SPSSAU 标题修改 1、说明 2、举例 数据标签 1、说明 2、举例...

AI大模型探索之路-实战篇15: Agent智能数据分析平台之整合封装Tools和Memory功能代码

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…...

CV每日论文--2024.6.4

1、Mixed Diffusion for 3D Indoor Scene Synthesis 中文 标题&#xff1a;用于 3D 室内场景合成的混合扩散 简介&#xff1a;这篇论文提出了一种名为MiDiffusion的混合离散-连续扩散模型,用于从给定的房间类型、平面图和可能存在的物体中合成逼真的3D室内场景。 作者指出,该…...

Android bw_costly_<iface>链

测试时关注到bw_costly_链 因为和iface有关。猜测这个链是动态生成的。 开关数据业务测试&#xff0c;果然关闭数据业务后&#xff0c;bw_OUTPUT中不再会调用bw_costly_rmnet_data3&#xff0c;也没有bw_costly_rmnet_data3这个链了。 再次打开数据业务后出现了bw_costly_rmnet…...

TypeScript 项目,自身 package 是 A,它引用了 B package。项目编译时,选择依赖版本的机制是什么?

在 TypeScript 项目中&#xff0c;当 package A 引用了 package B&#xff0c;编译 A 的过程中&#xff0c;B package 将按照 B package 自身的 package.json 文件中指定的各个库的版本进行编译&#xff0c;而不是按照 A package 中的库版本。 每个 package 都有自己的依赖项和…...

【数据结构】链表----头结点的作用

链表是一种常见的数据结构&#xff0c;由一系列节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含数据和指向下一个节点的指针。链表的头结点&#xff08;Head Node&#xff09;也称为哨兵位&#xff0c;是链表的起点&#xff0c;通常有以下几个重要作用&#xff…...

(CVPRW,2024)可学习的提示:遥感领域小样本语义分割

文章目录 相关资料摘要引言方法训练基础类别新类别推理 相关资料 论文&#xff1a;Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 代码&#xff1a;https://github.com/SteveImmanuel/OEM-Few-Shot-Learnable-Prompt 摘要 小样本分割是一项…...

tinyrenderer-切线空间法线贴图

法线贴图 法线贴图分两种&#xff0c;一种是模型空间中的&#xff0c;一种是切线空间中的 模型空间中的法线贴图的rgb代表着每个渲染像素法线的xyz&#xff0c;与顶点坐标处于一个空间&#xff0c;图片是五颜六色的。 切线空间中的法线贴图的rgb同样对应xyz&#xff0c;是切线…...

C++的vector使用优化

我们在上一章说了如何使用这个vector动态数组&#xff0c;这章我们说说如何更好的使用它以及它是如何工作的。当你创建一个vector&#xff0c;然后使用push_back添加元素&#xff0c;当当前的vector的内存不够时&#xff0c;会从内存中的旧位置复制到内存中的新位置&#xff0c…...

关于stm32的复用和重映射问题

目录 需求IO口的复用和重映射使用复用复用加重映射 总结参考资料 需求 一开始使用stm32c8t6&#xff0c;想实现pwm输出&#xff0c;但是原电路固定在芯片的引脚PB10和PB11上&#xff0c;查看了下引脚的功能&#xff0c;需要使用到复用功能。让改引脚作为定时器PWM的输出IO口。…...

遍历数组1

package demo; import java.util.ArrayList; public class Arrilist { public static void main(String[] args) { ArrayList<String>listnew ArrayList<>(); list.add("汤神"); list.add("yyx"); list.add("hong go…...

Go语言 一些问题了解

一、读取文件数据&#xff0c;是阻塞还是非阻塞的&#xff1f; 分两种情况&#xff1a;常规读取文件数据&#xff0c;和网络IO读取数据 1. 常规读取文件数据&#xff1a; io.Reader 和 bufio.Reader 是阻塞进行的。 bufio.Reader 提供缓冲的读取操作&#xff0c;意味着数据是…...

C++ Primer 第五版 第15章 面向对象程序设计

面向对象程序设计基于三个基本概念&#xff1a;数据抽象、继承和动态绑定。 继承和动态绑定对编写程序有两方面的影响&#xff1a;一是我们可以更容易地定义与其他类相似但不完全相同的新类&#xff1b;二是在使用这些彼此相似的类编写程序时&#xff0c;我们可以在一定程度上…...