专栏首页AustinDatabasesMYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk

MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk

PT工具在MYSQL中的使用其实已经好像有“半个世纪了”,其出名的原因主要是因为pt-osc,如果你不知道,那你真的用过MYSQL,其实还有另外两家 FB-OST , GH-OST.

实际上PT-OSC 虽然使用了这么多年,他也存在一些问题

PT-OSC

1 有些操作中,会引起高负载的写操作

2 在原表和新表切换的过程中更名,可能有失败的可能(虽然这样的情况不多,但可能存在)

3 要求多,主键(具有唯一性的),表有外键的时候需要添加参数,并且很可能还是有问题,可能会导致主从延迟,表中不建议由其他trigger ,PTOSC使用的就是 update , insert , delete triggers 来解决原表和新表之间的数据同步的问题。

4 对于大表,主业务表,还是不敢再业务时间来做,也是要到非业务或低峰期,来做。

虽然有这么多那么多的问题,但也是用了很多年。FB-OST 没有研究但原理也是类似的。(FB-OST)

GH-OST 其实是这三者里面,原理不一样的,有点开脑洞, 开发者是一个DBA,拥有15年的经验。

以下为开发者,在GITHUB 大会上的自我介绍

在考虑上面两个工具的缺点后,我使用了binary log ,虽然也我这里面也收到了FB-OST 的启发,但我这里的设计比上面提到的工具的优点,主要就是我的新表的数据来源不是来自于tigger 而是来自于binlong。 大家可以想一下,如果我同事更改15个表,要产生多少trigger,多少了connections 要被消耗,系统的工作负载会非常的重,MYSQL 不喜欢这样,而使用了binlog他不管修改多少表,他对于MYSQL 来说就是一个序列化的事情,MYSQL 喜欢序列化的事情,这样不会对系统产生更多的负载。

总结使用BINOG 有以下的优点

1 binlary logs 可以从任意的地方来读取,GH-OST 相当于一个从节点

2 gh-ost 控制了整个数据流,避免突然的无法控制的增量写

3 gh-ost 已经与master 节点工作负载解耦

4 gh-ost 的设计是依照顺序写的原则,完全避免了锁,对于操作的

server 来说就是一个single connection

5 数据的增量计算方法简单

上面的三个图很好的诠释了gh-ost 为什么比其他的工具要强的原因,可以从从库来读取数据,在写到master ,我也可以在master 上读,然后在master 上写,还可以在slave 上读,在slave 上改。

并且gh-ost还可以做真实的测试,而不是dry-run

另外一个优点是GH-OST 在执行的时候,可以根据master的状态来停止正在执行的任务,而等到master的负载变得正常后,在根据BINLOG继续来处理之前的延迟的工作。所以GH-OST 是一个安全的,值得信任的工具。

(完)

——————————————————————————————

当然,这个工具也很具有中国的特色

———————————————————————————————

要使用这个工具本身要本身的MYSQL是一定要支持binlog,必须打开
log-bin=mysql-binbinlog-format=ROW
log-slave-updates=ON下面是一个小的实验
gh-ost -allow-on-master -assume-rbr -exact-rowcount-critical-load Threads_running=400 -critical-load-hibernate-seconds 60-database employees -max-load Threads_running=100-nice-ratio 0.1  -chunk-size 5000 -ask-pass -table employeess-user ghost -host 192.168.198.81-alter 'add COLUMN add_column varchar(2000)'-verbose -execute 2>&1 | tee gh-ost.log

添加一个大字段是没有问题的。

在程序里面,下面这段是从binlog 中将需要同步的 U D I 操作进行挑拣

创建隐藏的魔鬼表

通过阅读部分源码,这里密码的insert 是采用 insert DUPLICATE KEY 方式来进行数据的插入。

其实从设计上来想,作者的想法是很有意思的,因为拷贝原表的数据到结束的这段时间,是不能应用这段时间的在这个表的修改,但BINLOG 里面是可以记录百分之百的对这张表的数据的变动的记录,则只要从开始拷贝表的时间点开始,到结束拷贝后,在将binlog 里面的数据进行提取,然后在新表上操作,待完成后在更换两个表rename,达到与原来加trigger的目的一样的效果。利用BINLOG的顺序性,稳定性,准确性等特点,将trigger性能问题化解。

另外更有意思的是gh-ost 可以在程序操作的过程中,修改一些配置

例如上例子中的,可以用下面的例子,将一些参数打入到正在运行的命令中

echo 'dml-batch-size=100' | nc -U /tmp/gh-ost.employees.employeess.sock

最后说说几个重要的参数

-allow-master-master 在主库中运行

-allow-nullable-unique-key 如果是表中唯一索引是不允许有NULL得情况,这里如果情况存在,则给这个值,程序可以继续运行

-assume-master-host string 当你目前的情况事主主的情况,

-assume-rbr 设置此标志可避免重新启动复制,并且您可以继续使用gh-ost而无需超级特权

-chunk-size int 每次要处理的行数

-concurrent-rowcount 计算需要copy的行

-critical-load 设置最大的阈值

-critical-load-hibernate-seconds 当达到负荷值后,系统将停止操作多少秒

-critical-load-interval-millis 设置当达到临界值后,间隔多长时间在进行重试

-cut-over 选择新旧表之间的切换类型

-discard-foreign-keys 忽略外键,当操作时需要注意的是如果表有外键则新表是不会建立外键的

-dml-batch-size 在单个任务中处理DML的数量是多少,默认10

-exact-rowcount 取得精确的表的行数

-initially-drop-ghost-table 如果是多次运行,已经留存上次存在的ghost表,选择这个参数,会在操作时将之前没有清理的表清理掉,慎用

-initially-drop-old-table 和上边的表一样,删除上次操作留下的老表

-initially-drop-socket-file 如果需要类似上边需要,在系统运行期间打入更改参数的情况,那就需要指定这个参数

-nice-ratio float 在每次操作之间需要等待的时间

-throttle-additional-flag-file 保存throttle的设置的路径

-throttle-control-replicas 检测那些从库需要进行检测延迟

最后用一个命令结束,根据命令来注释一些特别行的作用

gh-ost \

–allow-on-master \

–max-load=Threads_running=25 \ 当超过threads_runing阈值就停止

–chunk-size=1000 \ 1000行批处理

–throttle-control-replicas=”192.168.56.144″ \ 对这个从库检测

–max-lag-millis=1500 \ 从延迟的时间的阈值

–user=”ghost” \

–password=”ghost” \

–host=192.168.56.145 \

–database=”mysqlslap” \

–table=”t1″ \

–verbose \

–alter=”add column whatever6 varchar(50)” \

–cut-over=default \

–default-retries=120 \

–switch-to-rbr \

–panic-flag-file=/tmp/ghost.panic.flag \ 创建该文件时,工作立即停止

–postpone-cut-over-flag-file=/tmp/ghost.postpone.flag \

当这个文件存在的时候,不允许切换发生,当这个文件消失,才可以开始进行表的切换

–execute

本文分享自微信公众号 - AustinDatabases(AustinDatabases),作者:carol11

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MYSQL 主从复制同步了没,监控Seconds Behind Master ,别打脸

    小文今天被老板询问,新搭建的MYSQL 复制同步的情况怎么样,有没有报警或者复制时,主从不一致的情况发生,怎么报警的。小文答到老板放心,我们监控了seconds...

    AustinDatabases
  • MYSQL ANTIJOIN 提高20% 的性能 真的?

    从mysql 8.017开始有一个“rumor”, 就是相对于以前的版本查询的执行效率会提高20%,而原因在于antijoin的优化。

    AustinDatabases
  • MySQL 那些监控参数 问 答 (4)REDO AHI latch 锁

    2020已经悄然来到身边,感觉时间过的很快,学习的过程也是,一阵热乎的很简单,难再坚持两个字好写,做起来确实是难事。本系列后续还会有,会因为监控这个事情本身就没...

    AustinDatabases
  • NOIP复习内容

    https://www.luogu.org/problemnew/lists?name=GSS&orderitem=pid&tag=&content=0&typ...

    attack
  • 秋招面试真题解析:如何保证消息队列是高可用的?

    如果你的回答只是表明自己只会订阅和发布消息,面试官就会怀疑你是不是只是自己搭着玩,压根没在生产用过。

    Java_老男孩
  • webpack2的那些事儿 ------ 生成的文件是怎么运行的

    https://segmentfault.com/a/1190000008490316

    前端博客 : alili.tech
  • 【Rust日报】 2019-11-05 rustls-native-certs:为rustls集成操作系统证书库

    rustls-native-certs可以使rustls在作为TLS客户端运行时使用平台的本机证书存储。

    MikeLoveRust
  • 微服务为什么使用 Zookeeper 做注册中心?

    了解微服务的小伙伴都应该知道Zookeeper,Zookeeper是一个分布式的,开源的分布式应用程序协调服务。现在比较流行的微服务框架Dubbo、Spring...

    搜云库技术团队
  • HTML5本地化应用开发-HTML5 Web存储详解

    文章不是简单的的Ctrl C与V,而是一个字一个标点符号慢慢写出来的。我认为这才是是对读者的负责,本教程由技术爱好者成笑笑(博客:http://www.chen...

    做全栈攻城狮
  • IDEA快捷键拆解系列(四):View篇

      以下是关于View导航项及其每一子项的拆解介绍,其中,加粗部分的选项是博主认为比较重要的。

    happyJared

扫码关注云+社区

领取腾讯云代金券