【MySQL变更】gh-ost原理解读

news2025/2/4 19:08:43

gh-ost简介

gh-ost是处理MySQL在线表结构变更的工具,与pt-osc 不同,gh-ost不会使用触发器。

gh-ost 可以进行测试,暂停,动态控制和重新配置,审计还有其他许多操作perks。

命名

最初它被命名为gh-osc:GitHub Online Schema Change,

后来将c变为tgh-ost(发音:Ghost),代表 GitHub 的 Online Schema Transmogrifier/Translator/Transformer/Transfigurator

原理简介

所有现有的在线表结构变更工具都以相似的的原理:它们创建一个与原始表结构相同的幽灵表,在该表为空时进行表结构变更,缓慢并增量地将数据从原始表复制到幽灵表,同时将正在进行的更改(任何INSERT, DELETE,UPDATE应用于源表)应用到幽灵表。最后,在适当的时候,他们用幽灵表替换原表。

gh-ost使用相同的模式。然而,它与所有现有工具的不同之处在于不使用触发器。因为触发器是许多限制和风险的来源。

gh-ost 使用二进制日志流来捕获表数据变化,并将它们异步应用到ghost表上。gh-ost承担其他工具留给数据库执行的一些任务。因此,gh-ost可以更好地控制迁移过程;可以真正暂停它;可以真正将 migration 的写入负载与 master 的工作负载解耦。

此外,它还提供许多操作优势,使其更安全、更值得信赖且使用起来更有趣。

亮点

  • 可以在从库上进行测试 ,从而建立你对gh-ost的信任。gh-ost在从库上表结构变更的过程和主库相同,并不会真正的替换原表。这样在从库上就会保留原始表与幽灵表,你可以对比统计两张表的数据从而验证工具操作的正确性。这也是我们如何在生产环境测试gh-ost的方法
  • 真正的暂停 。当gh-ost throttles时,它真正停止在 master 上写入:没有行的拷贝,也没有正在进行事件的处理。通过节流,您可以将 master 恢复到其原始工作负载
  • 动态控制。您可以交互式重新配置gh-ost,即使迁移仍在运行。您可以强行启动节流。
  • 审计。您可以查询gh-ost状态。gh-ost监听 unix 套接字或 TCP。
  • 控制切换时刻。gh-ost可以使用指示推迟可能是最有风险的步骤:交换原始表与幽灵表的表名称。直到您可以舒适地使用。也无需担心预计的切换时间不在办公时间。
  • gh-ost可以使用外部钩子脚本。

用法

  • noop迁移(仅测试迁移是否有效且可以进行)
  • 一个真正的迁移,利用一个副本(迁移在主服务器上运行;gh-ost找出所涉及的服务器的身份。如果您的主服务器使用基于语句的复制,则需要模式)
  • 在 master 上运行真正的迁移,(但gh-ost更喜欢前者)
  • 在从库上进行真正的迁移(master未受影响)
  • 在从库上进行测试迁移,这是您与的操作建立信任的方式。

更多提示

  • --exact-rowcount 准确的进度指示
  • --postpone-cut-over-flag-file 控制切换时间
  • 更多交互式 参考 :交互式命令

基于触发器变更的弊端

  • 负载 对于原始表的每个INSERT, DELETE,UPDATE需要在幽灵表/影子表上回放,另外还有触发器的本身的代价。
  • 锁 锁竞争问题
  • 没有真正的暂停 比如 pt-osc 只能暂停全量的同步,不能暂停触发器的复制
  • 没有生产的测试
  • 对于多个变更(不同表)的支持
  • bound to server

更详细的解读 参考 :https://github.com/github/gh-ost/blob/master/doc/why-triggerless.md

无触发器的设计

pt-online-schema-change 在原始表创建三个触发器 (AFTER INSERT, AFTER UPDATE, AFTER DELETE) ,触发器的操作与原表的操作在同一事务中

基于无触发器的异步迁移

gh-ost的无触发设计采用异步方法。但是它不需要触发器,因为它不需要像 Facebook ost 工具那样有一个变更日志表。它不需要变更日志表的原因是它在另一个地方找到变更日志:二进制日志。

特别是,它读取基于行的复制 (RBR) 条目(您仍然可以将它与基于语句的复制一起使用!)并搜索适用于原始表的条目。

RBR 条目对于这项工作非常方便:它们将复杂的语句(可能是多表)分解为不同的、每表、每行的条目,这些条目易于阅读和应用。

gh-ost伪装为一个 MySQL 从副本:它连接到 MySQL 服务器并开始请求 binlog 事件,就好像它是一个真正的从副本一样。因此,它获得二进制日志的连续流,并过滤掉适用于原始表的那些事件。

gh-ost可以直接连接到主服务器,但更建议连接到主服务器的从副本之一。副本需要设置参数:log-slave-updates和binlog-format=ROW(gh-ost可以此设置)。

从二进制日志中读取,特别是在副本上读取二进制日志的情况,进一步强调了算法的异步性质。虽然事务可能(基于配置)与 binlog 条目写入同步,但它需要时间gh-ost- 假装是副本 - 会收到通知,将事件复制到下游并应用它。

异步设计意味着许多值得注意的结果,稍后将讨论。

工作流程

流程图

该工作流程包括从服务器读取表数据、从二进制日志读取事件数据、检查复制延迟或其他节流参数、将增量的表更应用到服务器(通常是主服务器)、通过二进制日志流发送提示等等。

初始化阶段

  1. 连接到主库或者从库
  2. 预验证 alter语句
  3. 验证权限,表存在
  4. 创建changelog 与 ghost 表(变更日志表与幽灵表)
  5. 对比原始表与幽灵表的结构差异,找到两张表都有的列,都有的唯一索引,验证外键。选择一个都有的唯一索引后续根据该字段对该表进行分块等处理。
  6. 设置binlog监听 开始监听changelog envents
  7. 将good to go 插入到changlog 表
  8. 开始监听原始表DML的二进制日志事件
  9. 读取原始表被选取我的唯一索引最大/最小的值

拷贝阶段

  1. 设置心跳机制:频繁写入 change log 表(我们认为这是低的,出于节流目的可忽略的写入负载)
  2. 持续更新状态
  3. 定期(经常)检查潜在的节流场景或提示
  4. 逐块(chunk)处理原始表的全量数据,将复制任务排队到 ghost 表上
  5. 从binlog中读取 DML 事件,将应用任务排队到 ghost 表
  6. 处理复制任务队列和应用任务队列并依次应用到ghost表 按节流状态暂停
  7. 一旦全表复制完成,注入/拦截“"copy all done”
  8. 存在postpone-cut-over-flag-file文件标识时 ,停止/推迟cut-over(我们继续应用正在进行的 DML)

切换完成阶段

  • 原始表 write lock ,禁止写入
  • 交换原始表与幽灵表名称
  • 清理阶段 删除表

使用要求

gh-ost目前需要 MySQL 5.7 及更高版本。

服务器需要设置参数binlog 格式为 binlog_format=ROW 基于row的复制 与 binlog_row_image=FULL。将来 binlog_row_image=MINIMAL 可能会被支持 

如果是复制的架构,需要变更的表的表结构 在主从上需要完全相同。

账号权限 

  • 对需要变更的表具有一下权限 ALTER, CREATE, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, TRIGGER, UPDATE 
  • 下面任选其一:
    • SUPER, REPLICATION SLAVE ON *.*,或:
    • REPLICATION CLIENT, REPLICATION SLAVE ON *.*

MySQL需要设置参数 binlog_format=ROW,如果不是row格式,在使用gh-ost时需要指定参数  --switch-to-rbr

无论服务器上设置什么隔离级别, gh-ost连接MySQL服务器时 ,使用 REPEATABLE_READ  事务隔离级别 

使用参数 --test-on-replica 时,在cut-over 阶段之前,gh-ost会停止主从复制,以便于你能比较两个表确认迁移是否正确

限制

外键约束不被支持 

触发器不被支持 

支持MySQL 5.7 JSON 列,但不作为PRIMARY KEY 其一部分

变更前后的 两张表 必须有相同的主键或者唯一索引,当拷贝数据时,这个key 被gh-ost用来迭代循环迭代

迁移用的字段必须不能包含 NULL 的值,意味着:

  • 这个列是 NOT  NULL 或者 这个列 可以为 NULL 但不包含任何 NULL值 
  • 默认情况下 ,如果唯一索引的列包含NULL 值,gh-ost 是 不会运行的。

不能迁移存在另外一张表名相同但是大小不同的表。例如,MyTable 和 MYtable。

Amazon RDS 可以使用给工具,但是有他自己的一些限制

可以兼容谷歌的 RDS ,需要使用参数 --gcp

可以兼容Aliyun 的RDS,但是需要使用参数 --aliyun-rds。

Azure  MySQL数据库 可以使用该工具,但是需要参数 --azure

多源复制 (Multisource) 不被支持,他只能工作只有一个主的时候 (--allow-on-master)

双主模式 (Master-master ) 只有在模式(active-passive)下工作 ,.双写模式 (Active-active ) 不被支持。

如果有一个enum字段作为迁移键的一部分(通常是PRIMARY KEY),则迁移性能将会降低并且可能会很糟糕。

不支持迁移FEDERATED表,并且与gh-ost问题解决无关。

不支持加密二进制日志

ALTER TABLE ... RENAME TO some_other_name 不被支持

常见问题 

cut-over 阶段是如何工作的? 是你真的原子性的吗?

cut-over 阶段 即 原表与 幽灵表交换的阶段  是一个原子的,阻塞的 ,受控的阶段。

Atomic(原子性):老表 与 幽灵表交互表名是一起的。不会存在老表的表名不存在的情况。

Blocking(阻塞的):应用的查询要不对老表进行操作,要不被阻塞,要不继续对新表进行操作。

Controlled(受控的):cut-over的超时时间可以预先定义阈值,超过该时间可以自动终止然后重试, cut-over只有在从库不延迟的情况下进行,

是否可以添加唯一索引?

在确保表中该字段不存在重复数据是可以添加的。

是否可以并发迁移?

可以 ,但是要需要注意添加参数 --replica-server-id

为什么更推荐 Connect to Replica

避免对主库超声额外的负载影响 。gh-ost作为复制客户端连接。每个额外的副本都会给主服务器增加一些负载。

方便监控复制延迟,--max-lag-millis 参数可以监控从副本的延迟

下载 

Release GA release v1.1.6 · github/gh-ost · GitHub

参数解读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1337294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从入门到精通,30天带你学会C++【第九天:排序合集】

Everyday English Never put off what you can do until tomorrow. 今日事,今日毕。 前言 首先跟大家说声抱歉,我已经25天没写博客了,我知道我掉了很多粉丝,但是还有很多人坚持关注着我,在这里我表示感谢…

C++ Qt开发:QSqlDatabase数据库组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSqlDatabase数据库模块的常用方法及灵活运用…

【软件工程大题】白盒测试

给出一个简单的测试样例,然后再进行白盒测试的讲解 if A and B then action1 if C or D then action2 1.语句覆盖 每个语句执行一次 也就是,样例中的每个语句执行一次,至于ABCD取值,要满足IF条件,让四个语句都执行一次 A and B -> T ⇒ AT …

蓝桥杯的学习规划

c语言基础: Python语言基础 学习路径:画框的要着重学习

2023年教程汇总 | 《小杜的生信笔记》

2023年总结 2023年即将结束,我们即将迎来2024年。2023年,我们做了什么呢??这个是个值得深思的问题…? 12月份是个快乐且痛苦时间节点。前一段时间,单位需要提交2023年工作总结,真的是憋了好久才可以下笔…

【数据结构】无向图的最小生成树(Prime,Kruskal算法)

文章目录 前言一、最小生成树二、Kruskal算法1.方法:2.判断是否成环3.代码实现 三、 Prim算法1.方法:2.代码 四、源码 前言 连通图:在无向图中,若从顶点v1到顶点v2有路径,则称顶点v1与顶点v2是连通的。如果图中任意一对…

医院信息化-6 大模型与医疗

之前写了一系列跟医疗信息化相关的内容,其中有提到人工智能,但是写的都是原先的一些AI算法基础上的医疗应用。现在大模型出现的涌现推理能力确实让人惊讶,并且出现可商用化的可能性,因此最近一年关于大模型在医疗的应用也开始出现…

ComfyUI如何中文汉化

comfyui中文地址如下: https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translationhttps://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translation如何安装? 1. git安装 进入项目目录下的custom_nodes目录下,然后进入控制台,运…

Java——基本数据类型

Java基本数据类型 一、 整型1. byte2. short3. int4. long 二、浮点型1. float2. double 三、 字符型(char)四、 布尔型(boolean) 总结 算下刚转Java到现在也有三个多月了,所以打算对Java的知识进行汇总一下,本篇文章介绍一下Java…

Linux之用户/组 管理

关机&重启命令 shutdown -h now立刻进行关机shutdown -h 11分钟后关机(shutdown默认等于shutdown -h 1) -h即halt shutdown -r now现在重新启动计算机 -r即reboot halt关机reboot重新启动计算机sync把内存数据同步到磁盘 再进行shutdown/reboot/halt命令在执行…

【支持向量机】SVM线性可分支持向量机学习算法——硬间隔最大化支持向量机及例题详解

支特向量机(support vector machines, SVM)是一种二类分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器。包含线性可分支持向量机、 线性支持向量机、非线性支持向量机。 当训练数据线性可分时,通过硬间隔最大化学习线性分类器, 即为线性…

提升泵类设备性能的解决方案:基于AI的预测性维护

随着工业的智能化和数字化发展,设备维护的方式得到不断优化。人工智能(AI)、机器学习和云计算等先进技术的引入,使得设备健康管理系统的数据采集、实时分析、故障预警与智能诊断等能力得到提升。借助这些设备预测性维护手段&#…

LISN到底是啥?干啥用的?

LISN是在EMC测试的时候,会被使用的设备,如下图所示: 双路V型电源阻抗稳定网络。它完全符合CISPR16-1-2、MIL-STD 461F、VDE 0876、FCC Part 15标准的要求,其等效电路为50Ω||(5Ω50μH),频率范围…

vue3使用mixins

<template><div>{{ num }}___{{ fav }}</div><button click"favBtn">改变值</button> </template><script setup lang"ts"> import mixin from "../mixins/mixin"; let { num, fav, favBtn } mixin(…

【微服务核心】Spring Boot

Spring Boot 文章目录 Spring Boot1. 简介2. 开发步骤3. 配置文件4. 整合 Spring MVC 功能5. 整合 Druid 和 Mybatis6. 使用声明式事务7. AOP整合配置8. SpringBoot项目打包和运行 1. 简介 SpringBoot&#xff0c;开箱即用&#xff0c;设置合理的默认值&#xff0c;同时也可以…

【MySQL】数据库之日志管理、备份与恢复

目录 一、MySQL的日志管理 二、MySQL的完全备份与恢复 物理冷备份&#xff08;完全备份&#xff09;与恢复 数据库上云迁移的方案&#xff1f; 逻辑热备份&#xff08;完全备份&#xff09;与恢复 三、MySQL的增量备份与恢复 1、手动增量备份 2、脚本增量备份 3、增量备…

归并排序之C++实现

描述 归并排序是一种经典的排序算法&#xff0c;采用分治的思想。 归并排序是一种基于分治思想的经典排序算法。它将待排序的数组不断地分成两个子数组&#xff0c;直到每个子数组只有一个元素。然后&#xff0c;对每个子数组进行归并排序&#xff0c;即不断地将两个有序的子数…

ros2中ros_gz_bridge/gazebo安装的注意事项

这个搞错了&#xff1a;这个是安装ros_gz_bridge的&#xff0c;不是安装gazebo的 AT:如果是安装的Harmonic&#xff0c;在安装ros_gz_bridge的时候要从源码编译 ros2完整版里面好像已经包含了gazebo的一个版本 包名应该就是叫ros-humble-ros-ign-gazebo 所以gazebo是作为一个普…

使用tesla gpu 加速大模型,ffmpeg,unity 和 UE等二三维应用

我们知道tesla gpu 没有显示器接口&#xff0c;那么在windows中怎么使用加速unity ue这种三维编辑器呢&#xff0c;答案就是改变注册表来加速相应的三维渲染程序. 1 tesla gpu p40 p100 加速 在windows中使用regedit 来改变 核显配置&#xff0c; 让p100 p40 等等显卡通过核显…

docker-compose部署kafka

docker-compose.yml配置 version: "3" services:kafka:image: bitnami/kafka:latestports:- 7050:7050environment:- KAFKA_ENABLE_KRAFTyes- KAFKA_CFG_PROCESS_ROLESbroker,controller- KAFKA_CFG_CONTROLLER_LISTENER_NAMESCONTROLLER- KAFKA_CFG_LISTENERSPLAIN…