首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MYSQL 修改表结构 gh-ost 到底强哪里 作者自己来talk

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

作者头像
AustinDatabases
发布2020-03-26 15:43:37
7710
发布2020-03-26 15:43:37
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • gh-ost \
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档