保护私人版权,尊重他人版权。转载请注明出处并附带页面链接
简介
gh-ost是基于 golang 语言,是 github 开源的一个 DDL 工具,gh-ost 是 gitHub,s Online Schema Transmogrifier/Transfigurator/Transformer/Thingy 的缩写,意思是 GitHub 的在线表定义转换器。
gh-ost 有如下特点:
- 无触发器
- 轻量级
- 可暂停
- 动态可控
- 可审计
- 可测试
- 可靠
gh-ost 工作模式
gh-ost 工作时可以连上多个MySQL实例,同时也把自己以从库的方式连上其中一个实例来获取二进制日志事件。根据你的配置、数据库集群架构和你想在哪里执行修改操作,可以有许多种不同的工作模式。
模式一、连上从库,在主库上修改
这是 gh-ost 默认的工作模式,它会查看从库情况,找到集群的主库并且连接上去。修改操作的具体步骤是:
- 在主库上读写行数据;
- 在从库上读取二进制日志事件,将变更应用到主库上;
- 在从库上查看表格式、字段、主键、总行数等;
- 在从库上读取 gh-ost 内部事件日志(比如心跳);
- 在主库上完成表切换;
如果主库的二进制日志格式是 Statement,就可以使用这种模式。但从库就必须配成启用二进制日志(log_bin, log_slave_updates),还要设成 Row 格式(binlog_format=ROW),实际上 gh-ost 会在从库上帮你做这些设置。
事实上,即使把从库改成Row格式,这仍然是对主库侵入最少的工作模式。
模式二、直接在主库上修改
如果没有从库,或者不想在从库上操作,那直接用主库也是可以的。gh-ost 就会在主库上直接做所有的操作。仍然可以在上面查看主从复制延迟。
- 主库必须产生 Row 格式的二进制日志;
- 启动 gh-ost 时必须用–allow-on-master 选项来开启这种模式;
模式三、在从库上修改和测试
这种模式会在从库上做修改。gh-ost仍然会连上主库,但所有操作都是在从库上做的,不会对主库产生任何影响。在操作过程中,gh-ost 也会不时地暂停,以便从库的数据可以保持最新。
这个模式偏向测试用的,一般不用。
如何选择
先说模式一的缺点,模式一会在从DB上面读取binlog,可能造成数据库主从数据不一致,原因因为是主库的binlog没有完全在从库执行。所以感觉模式一有丢失数据的风险。
模式二任何操作都会在主库操作,或多或少会对主库负载造成影响,但是可以通过调整一些参数降低和时刻关注这些影响,所以个人推荐使用模式二。
gh-ost 的测试使用:
下载
github下载地址:https://github.com/github/gh-ost.git,
直接clone项目下来
安装
- 进入gh-ost文件夹,我们看到现在的gh-ost已经采用了docker的方式进行运行,因此我们的机器首先需要安装docker,centos系统直接使用
yum install docker
进行安装,安装完成后使用systemctl start docker
启动docker
1 | -rwxrwxr-x 1 kraus kraus 2035 Nov 24 14:57 build.sh |
- 将Dockerfile.test重命名为将Dockerfile,当然也可以不重命名,不重命名的话需要指定-f指定要使用的Dockerfile路径。然后使用docker build命令来构建镜像
1 | docker build -t go:v1.14.7 . |
构建完成后我们通过docker image ls
查看一下镜像
1 | [kraus@dev gh-ost]$ docker image ls |
- 运行容器
1 | [kraus@dev gh-ost]$ docker run -it go:v1.14.7 /bin/bash |
4.容器目录下直接运行build.sh脚本编译go-ost的go程序
1 | root@ccb3b7649582:/go/src/github.com/github/gh-ost# ./build.sh |
我们可以看到编译好的程序放在了/tmp/gh-ost-release目录下,程序名称就叫gh-ost
- 执行修改命令
1 | /tmp/gh-ost-release/gh-ost \ |
常用参数解释
1 | --max-load |
tips
记得要修改主库binlog配置,产生 Row 格式的二进制日志
1 | [mysqld] |