gh-ost

优质博文:IT-BLOG-CN

一、gh-ost的作用

gh-ost是由Github提供的Online DDL工具,使用binlog代替之前的触发器做异步增量数据同步,从而降低主库负载。

基于触发器的Online DDL工具原理:
【1】根据原表结构执行alter语句,新建一个更新表结构之后的表,称为幽灵表,对用户是透明的。
【2】将原表数据全量拷贝至幽灵表。
【3】将增量数据同步到幽灵表,也就是Online的核心。最开始办法是在源表上增加几个触发器,例如当源表执行INSERTUPDATEDELETE语句,就把这些操作通过触发器同步到幽灵表上,这样在幽灵表上执行的语句和源表的语句就属于同一个事务,显然这样会影响主库的性能。后面出现了异步的模式,使用触发器把对源表的操作保存到一个Changelog表中,不真正的去执行,专门有一个后台的线程从Changelog表读取数据应用到幽灵表上。这种方式一定程度上缓解了主库的压力,但是保存到Changelog表也同样是属于同一个事务中,对性能也有不小的影响。
【4】拷贝和同步完成之后,锁定源表并交换表名,幽灵表替换源表。
【5】删除源表,完成Online DDL

触发器同步增量数据的缺点:
【1】Triggers, overhead: 触发器是用存储过程的实现的,就无法避免存储过程本身需要的开销。
【2】Triggers, locks: 增大了同一个事务的执行步骤,更多的锁争抢。
【3】Trigger based migration, no pause: 整个过程无法暂停,假如发现影响主库性能,停止Online DDL,那么下次就需要从头来过。
【4】Triggers, multiple migrations: 他们认为多个并行的操作是不安全的。
【5】Trigger based migration, no reliable production test: 无法在生产环境做测试。
【6】Trigger based migration, bound to server: 触发器和源操作还是在同一个事务空间。

gh-ost放弃了触发器,使用binlog来同步。gh-ost作为一个伪装的备库,可以从主库/备库上拉取binlog,过滤之后重新应用到幽灵表上。

gh-ost首先连接到主库上,根据alter语句创建幽灵表,然后作为一个”备库“连接到其中一个真正的备库上,一边在主库上拷贝已有的数据到幽灵表,一边从备库上拉取增量数据的binlog,然后不断的把binlog应用回主库。图中cut-over是最后一步,锁住主库的源表,等待binlog应用完毕,然后替换gh-ost表为源表。gh-ost在执行中,会在原本的binlog event里面增加以下hint和心跳包,用来控制整个流程的进度,检测状态等。这种架构带来诸多好处,例如:
【1】整个流程异步执行,对于源表的增量数据操作没有额外的开销,高峰期变更业务对性能影响小。
【2】降低写压力,触发器操作都在一个事务内,gh-ost应用binlog是另外一个连接在做。
【3】可停止,binlog有位点记录,如果变更过程发现主库性能受影响,可以立刻停止拉binlog,停止应用binlog,稳定之后继续应用。
【4】可测试,gh-ost提供了测试功能,可以连接到一个备库上直接做Online DDL,在备库上观察变更结果是否正确,再对主库操作,心里更有底。
【5】并行操作,对于gh-ost来说就是多个对主库的连接。

二、云数据库场景

用户没有Super权限,因此使用过程中要加上–assume-rbr,gh-ost会认为binlog本身就是row模式,不会再去修改。阿里云RDS上的binlog默认也是row模式,所以不存在问题。binlog的三种模式

其它权限,主要是REPLICATION SLAVEREPLICATION CLIENT可以拉取binlog,也可以获得。

无法连接到备库拉取binlog。备库通常对用户来说是透明的,所以gh-ost需要直接连接到主库上去,这可能会增大对主库的负载。使用的时候需要增加–allow-on-master–assume-master-host。官方推荐的方式也是连接到其中一个备库,因为会有一些压力较大的SELECT操作,放在备库是最好的。几种连接模式如下图所示:

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

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

相关文章

leetcode-4. 寻找两个正序数组的中位数

题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输出:2.0…

婚礼弹幕上墙阳光正好,爱意正浓,打造一场出圈的唯美婚礼!

原文地址 婚礼现场的弹幕功能可以给整个场景增添温暖和喜庆的氛围。通过手机发送祝福,让亲友可以即时将祝福传达给新人,同时这些祝福以弹幕的形式在大屏幕上滚动展示,增加了现场互动的乐趣。墙上新闻搭配的功能则更加抢眼,不仅可…

基于代理的分布式身份管理方案

目的是使用分布式的联合计算分发去替换掉区块链中原有的类第三方可信中心的证书机制,更加去中心化。 GS-TBK Group Signatures with Time-bound Keys. CS-TBK 算法 Complete subtree With Time-bound Keys,该算法是用来辅助检测用户的签名是否有效&…

LabVIEW提高开发效率技巧----使用快捷键

在LabVIEW的开发过程中,熟练掌握和运用快捷键可以极大地提升工作效率,减少重复性操作所花费的时间。快捷键不仅可以加快编程速度,还能让开发者更加专注于逻辑实现和功能设计。细问问将详细介绍LabVIEW中的常用快捷键,特别是强大的…

【变化检测】基于HANet建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下: 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、HANet模型训练与预测 4、Onnx运行及可视化 运行环境:Python3.8,torch1.12.0cu113,onnxruntime1.19.2【这里装CPU版,GPU版低于1.19.2算子报错】 likyo…

一招解决微软copilot提示:该服务在您所在的地区不可用

随着windows 11的推出很多网友都开始注意到了微软copilot AI助手。科技快速发展当前AI已经是一个家喻户晓的名词了, 尤其是一些之前体验过ai强大功能的用户,对AI更加是爱不释手。虽然win 11 版本已经将copilot集成到系统当中,然后不少网友在想要体验时却…

kali里面搭建docker容器

注意事项:kali版本,镜像源 (1)权限为管理员: sudo su (2) 更新软件包列表并升级已安装的软件包 apt-get update apt-get upgrade 出错了,应该是更新源出问题了。 (3)更换镜像源&am…

stm32开发之串口空闲中断和环形数组的最简单的组合使用

前言 本次使用的是lwrb开源的源码;测试环境使用的是stm32f407zgt6这里不介绍lwrb的内容,如有需要请自行去查阅.这里会使用到rt_container_of的宏定义(相关介绍请参考rt_thread或linux源码相关的宏定义,其表达的内容是一致的)这里使用的是threadx做为os本…

Java调用数据库 笔记05

一. 数据库(通过各种驱动来实现调用): (应用程序通过接口控制的各种数据库驱动来调用数据库-->jdbc方法) 1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类…

TCP并发服务器的实现

一请求一线程 问题 当客户端数量较多时,使用单独线程为每个客户端处理请求可能导致系统资源的消耗过大和性能瓶颈。 资源消耗: 线程创建和管理开销:每个线程都有其创建和销毁的开销,特别是在高并发环境中,这种开销…

开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择

摘要:本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性,着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究,强调了针对社群用户量身定制活动时机的必要性&#xff0c…

简单了解微服务--黑马(在更)

认识微服务 单体架构 不适合大型复杂项目 微服务架构 将单体结构的各个功能模块拆分为多个独立的项目 拆取的独立项目分别开发,在部署的时候也要分别去编译打包,分别去部署,不同的模块部署在不同的服务器上,对外提供不同的功能…

渗透测试入门学习——php表单form与POST、GET请求练习

最终效果&#xff1a; 必填项为空报错提示&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>php表单练习</title> </head> <body> <?php//php中的…

UE5学习笔记22-武器瞄准和武器自动开火

0、一些疑问的记录 1.UUserWidget类和AHUD类的区别。两者都是关于界面显示的类。 实践&#xff1a; 想让界面和用户有交互使用UUserWidget&#xff0c;如果不要交互只是显示使用AHUD类&#xff0c;例如使用UUserWidget类制作开始界面&#xff0c;游戏开始&#xff0c;游戏设置&…

计算机人工智能前沿进展-大语言模型方向-2024-09-17

计算机人工智能前沿进展-大语言模型方向-2024-09-17 1. Large Language Models in Biomedical and Health Informatics: A Review with Bibliometric Analysis H Yu, L Fan, L Li, J Zhou, Z Ma, L Xian, W Hua, S He… - Journal of Healthcare …, 2024 生物医学和健康信息…

部分动态铜皮的孤岛无法删除。报错

(SPMHCI-1): Cannot break shape into fragments. 网上寻找了很多答案&#xff0c;都不太理想&#xff0c;不是我想要的方法。 终于功夫不负有心人&#xff0c;在Cadence官方论坛找到了蛛丝马迹。 Breaking Static shape into fragments - PCB Design - PCB Design & IC …

深入解析Transformer原理

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer架构的出现无疑是一个里程碑式的进展。从Google的BERT到OpenAI的GPT系列&#xff0c;Transformer已经成为许多前沿AI模型的核心。今天&#xff0c;我们就来深入探讨Transformer的原理&#xff0c;帮助你更…

优惠充值话费api对接如何选择对接平台?

优惠充值话费接口通常由电信运营商、第三方支付平台或专业的充值服务提供商提供。这些平台通过API接口允许开发者将话费充值功能集成到应用程序或网站中。 选择哪个平台比较好&#xff0c;取决于以下几个因素&#xff1a; 覆盖范围&#xff1a;选择能够覆盖你需要服务的地区和…

深度学习-生成式检索-论文速读-2024-09-14

深度学习-生成式检索-论文速读-2024-09-14 前言: 生成式检索&#xff08;Generative Retrieval&#xff0c; GR&#xff09;是一种结合了生成模型和检索系统的人工智能技术方法。这种方法在处理信息检索任务时&#xff0c;不仅依赖于已有数据的检索&#xff0c;还能生成新的、…

c++基类和派生类对象的赋值转换——赋值兼容规则

1.引出 如下场景&#xff1a; 由于b是double类型&#xff0c;所以赋值给int类型的引用前&#xff0c;要先进行隐式类型转换&#xff0c;这中间会生成临时对象&#xff0c;类是对象具有常性&#xff0c;所以int&之前应该加上const。 但是下面的场景&#xff1a; 没有出现报…