gh-ost特点:
1、不使用触发器。
在gh-ost出现之前第三方MySQL DDL工具均采用触发器的方式进行实现,包括前面percona的pt-osc,Facebook的OSC等等。而gh-ost采用的机制和他们完全不同:它通过MySQL binlog来同步数据。
gh-ost会伪装成一个从库节点,读取数据库(可能是集群中的主节点或者从节点)的binlog,并实时解析,将变更表的所有DML操作都重新运用到影子表上面。
因此对于发布期间变更表上发生的DML操作,可以完全避免由于触发器而产生的性能开销,以及锁的争抢。
2、动态控制。
之前通过pt-osc发布时,命令执行后参数就没法修改,除非停止重来。假设发布进行到90%,突然由于其他各种原因导致服务器负载上升,为不影响业务,只能选择将发布停掉,等性能恢复再重来。
通过pt-osc发布的表都是很大的表,耗时较长,所以遇到这类场景很尴尬。因此发布中参数如果可动态调控将变得非常重要。
gh-ost另外实现了一个socket server,我们可以在发布过程中,通过socket和发布进程进行实时交互,它可以支持实时的暂停,恢复,以及很多参数的动态调整,来适应外界变化。
总结gh-ost工作原理:
先生成一个镜像表(影子表),在镜像表上执行DDL语句;从源表中拷贝数据到镜像表;依据 Binlog 信息完成增量数据的变更。最后用镜像表替换源表。
整个 Online DDL 操作仅在最终 rename 源表与镜像表时会阻塞几秒钟的读写。
扩展:
gh-ost 发音和ghost一样,其实单词也是一样哈哈。
安装:
去这里寻找下载的版本:https://github.com/github/gh-ost/tags
wget -c 下载地址(注意选择amd64版本的,我一开始不小心选择了arm64版本导致无法执行命令)
tar -zxvf 下载的文件
然后就可以执行:./gh-ost --help
命令:
./gh-ost -max-load=Threads_running=20
-critical-load=Threads_running=100
-chunk-size=2000 -user=“root” -password=“swl123” -host=127.0.0.1
-allow-on-master -database=“coupang” -table=“cp_orders”
-alter=“alter table cp_orders change order_status or_status tinyint(2)” -cut-over=default
-exact-rowcount -concurrent-rowcount -default-retries=120
-timestamp-old-table -panic-flag-file=/tmp/ghost.panic.flag
-approve-renamed-columns
-switch-to-rbr
-execute
注意:
- -alert就是具体修改表的DDL语句。
- binlog格式必须得设置为row才可以。可以先把数据库的binlog格式设置为row:SET GLOBAL
binlog_format=ROW。
项目地址:
https://github.com/github/gh-ost
参考文章:
https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md
https://www.cnblogs.com/zhoujinyi/p/9187421.html
https://www.cnblogs.com/zping/p/8876148.html
https://mp.weixin.qq.com/s?__biz=MzU1Mzk5NTA3NA==&mid=2247487808&idx=1&sn=b5cf612d2821be954cb0b75d9a194065&chksm=fbeb0f6dcc9c867bf7fcb7b751c9ee5886c9ba02b5cdb24224d892231249ff23da5ef1aecff5&scene=178&cur_album_id=2038342119441924096#rd