MySQL-基于docker+GTID实现Replication集群主从复制及读写分离

mac2024-04-15  34

在上一篇文章中:MySQL-基于docker实现Replication集群主从复制及读写分离介绍了基于Docker实现的MySQL主从,利用的是普通的日志方式实现的。文章末尾,提了一下基于GTID实现主从,以及它的优点。不过没有写完,这一篇就利用中午休息的时间介绍下基于GTID的主从实现。

GTID

GTID,其全称是Global Transaction Identifier,可简化MySQL的主从切换以及Failover。GTID用于在binlog中唯一标识一个事务。当事务提交时,MySQL Server在写binlog的时候,会先写一个特殊的Binlog Event,类型为GTID_Event,指定下一个事务的GTID,然后再写事务的Binlog。主从同步时GTID_Event和事务的Binlog都会传递到从库,从库在执行的时候也是用同样的GTID写binlog,这样主从同步以后,就可通过GTID确定从库同步到的位置了。也就是说,无论是级联情况,还是一主多从情况,都可以通过GTID自动找点儿,而无需像之前那样通过File_name和File_position找点儿了。

所以,这种方式能够保证主库的写入以及从库的复制在一个事务内,避免出现主库写入成功,从库复制失败而导致的从库读取数据失败。 直接开始正文吧。

实现

如果你是第一次基于Docker搭建,并且也是第一次搭建这个主从,请保证阅读过上一篇文章,关于前几个步骤,就不在这里再次重复操作一遍了。请参照上一篇文章启动运行几个MySQL容器。

假设你已经完成了第一篇,1.1-1.4之前的操作。 注意:1.1-1.4请参照上一篇实现

1.5 创建主从节点的配置文件

这个是重点,关系到主从的实现。配置一定不能出错,其实配置非常简单。 主节点:/home/guwenjie/docker/mysql-master/conf,创建master.cnf文件 配置:

[mysqld] #GTID: server_id=3 gtid_mode=on enforce_gtid_consistency=on #binlog log_bin=master-binlog log-slave-updates=1 binlog_format=row #relay log skip_slave_start=1

从节点:/home/guwenjie/docker/mysql-slave-1/conf,创建slave.cnf文件 配置:

[mysqld] #GTID: gtid_mode=on enforce_gtid_consistency=on server_id=4 #binlog log-bin=slave-binlog log-slave-updates=1 binlog_format=row #relay log skip_slave_start=1

1.6MySQL容器内部相关配置

1.6.1:请参照上一篇实现1.6.1配置

1.6.2从库配置

进入从库节点容器:

docker exec -it mysql-slave-1 /bin/bash

登录MySQL,1.3步骤中我们创建的从库命令中,数据库也是:root/123456

mysql -uroot -p

首先停止slave节点

stop slave;

配置:

CHANGE MASTER TO MASTER_HOST='172.17.0.4', MASTER_USER='guwenjie-m', MASTER_PASSWORD='123456', MASTER_PORT=3306, MASTER_AUTO_POSITION = 1;

然后重置slave

reset slave;

启动slave

start slave;

可以查看一下slave启动后的情况,查看一下基本信息以及最重要的从库的IO和SQL是否正常 从库信息较多,加上\G参数查看方便。

show slave status \G;

你会发现和上一篇中从库的信息有所不同。

1.7测试

注意:这篇中有些步骤我写的是参照上一篇,但是这两套主从实现是不沾边的,你自己配置的时候不要混为一谈,配置文件千万不要写错了。

退出容器内部,然后重启主从容器

docker restart mysql-master docker restart mysql-slave-1

主库创建数据表,从库同步复制就不演示了,我还是直接做个gif图演示一下表数据同步(-m代表主库,-s代表从库)。 有任何问题欢迎留言

最新回复(0)