企业级——Mysql基于GTID的主从复制

mac2025-11-09  9

基于GTID的主从复制

由于同一事务的GTID在所有节点上的值一致,我们都不需要知道GTID的具体值。(前提:需要做好前面的binlog复制。)在传统的复制里面,当发生故障,需要主从切换,需要找到binlog和pos点,然后将主节点指向新的主节点,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找binlog和pos点,我们只需要知道主节点的ip,端口,以及账号密码就行,因为复制是自动的,MySQL会通过内部机制GTID自动找点同步。从服务器连接到主服务器之后,把自己执行过的GTID(Executed_Gtid_Set)<SQL线程> 、获取到的GTID(Retrieved_Gtid_Set)<IO线程>发给主服务器,主服务器把从服务器缺少的GTID及对应的transactions发过去补全即可。当主服务器挂掉的时候,找出同步最成功的那台从服务器,直接把它提升为主即可。如果硬要指定某一台不是最新的从服务器提升为主, 先change到同步最成功的那台从服务器, 等把GTID全部补全了,就可以把它提升为主了。

1.环境准备

在主从复制的基础上进行试验。

2.进行配置

在server1:

修改配置文件

vim /etc/my.cnf ##在文件最后添加 gtid_mode=ON enforce-gtid-consistency=true #开启gtid模块
在server2:
mysql> select * from gtid_executed; ##是空的,因为还没重启
在server1:

(1)查看日志:

mysqlbinlog mysql-bin.000004 ##可以看到之前做的操作都在里面

(2)查看uuid:

cat auto.cnf ##看到server1的uuid
在server2:

(1)修改配置文件:

vim /etc/my.cnf ##在文件最后添加 gtid_mode=ON(必选) enforce-gtid-consistency(必选) log_bin=ON(可选)--高可用切换,最好设置ON log-slave-updates=ON(可选)--高可用切换,最好设置ON
mysql5.6 slave必须开启binlog日志 但是5.7中不是必须的

(2)重启mysqld服务:

systemctl restart mysqld

(3)检查主从复制是否正常

cat relay-log.info #查看relay-log

(4)登陆数据库并修改master的信息:

mysql> stop slave; ##先停止复制 Query OK, 0 rows affected (0.01 sec) mysql> CHANGE MASTER TO ##修改master信息 -> MASTER_HOST = '172.25.66.1', -> MASTER_USER = 'repl', -> MASTER_PASSWORD = 'LQHlqh123+', -> MASTER_AUTO_POSITION = 1; ##启用gtid,它是自动的 mysql> stop slave; ##开启复制 mysql> show slave status\G; ##查看信息
在server1:

在server1上插入数据

mysql> insert into usertb values ('user2','222'); Query OK, 1 row affected (0.01 sec) mysql> insert into usertb values ('user3','333'); Query OK, 1 row affected (0.00 sec) mysql> select * from usertb; ##查看 mysql> insert into usertb values ('user4','444'); Query OK, 1 row affected (0.01 sec) mysql> insert into usertb values ('user5','555'); Query OK, 1 row affected (0.01 sec) mysql> select * from usertb; ##查看
在server2上:

(1)查看状态

mysql> show slave status\G; Retrieved_Gtid_Set: f84e8de1-38a2-11e9-b78c-5254009afece:1-4 Executed_Gtid_Set: f84e8de1-38a2-11e9-b78c-5254009afece:1-4 ##发现这两个参数变了,从1位置开始复制的,共四条

(2)再查看gtid模式复制的起始和结束位置

mysql> use mysql; ##进入数据库 mysql> select * from gtid_executed; ##刷新并查看 +--------------------------------------+----------------+--------------+ | source_uuid | interval_start | interval_end | +--------------------------------------+----------------+--------------+ | f84e8de1-38a2-11e9-b78c-5254009afece | 1 | 1 | | f84e8de1-38a2-11e9-b78c-5254009afece | 2 | 2 | +--------------------------------------+----------------+--------------+ 2 rows in set (0.00 sec)
若插入数据后在server2上的起始位置未更新,可以在server1和server2两端重启mysqld的服务,并在server2停止slave,再次开启slave,并刷新列表。
最新回复(0)