Centos 7.4 Mysql 8.0 Setting up GTID replication GTID复制

介绍

1 原理

全局事务标识符(GTID)是创建的唯一标识符,并与在源服务器(主服务器)上提交的每个事务相关联。简单的说,就是每一个事务都会生成一个GTID,然后从库根据GTID来进行恢复。
GTID的格式为:

GTID = source_id:transaction_id
  • source_id:标识发起服务器,这里一般指服务器的server_uuid。
  • transaction_id:由在此服务器上提交事务的顺序确定的序列号。

原有主备方案需要制定binary log文件以及文件位置进行备份,然后配置。而GTID复制可以自动检测二进制日志位置。
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

2 优势

1.一个事务对应一个唯一ID,一个GTID在一个服务器上只会执行一次
2.GTID是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置
3.减少手工干预和降低服务故障时间,当主机挂了之后通过软件从众多的备机中提升一台备机为主机

那么GTID复制是怎么实现自动同步,自动对应位置的呢?
例如:ServerC <-----ServerA ----> ServerB
主机ServerA
备机:ServerB,ServerC
当主机ServerA 挂了之后 ,此时ServerB执行完了所有从ServerA 传过来的事务,
ServerC 延时一点。这个时候需要把 ServerB 提升为主机 ,Server C 继续为备机。
当ServerC 链接ServerC 之后,首先在自己的二进制文件中找到从ServerA 传过来的最新的GTID,
然后将这个GTID 发送到ServerB ,ServerB 获得这个GTID之后,就开始从这个GTID的下一个GTID
开始发送事务给ServerC。这种自我寻找复制位置的模式减少事务丢失的可能性以及故障恢复的时间。

安装

首先确保将主库在所有备库都进行了备份与恢复

1 设置Master服务器

将Master服务器设置为只读,并保证Slave服务器的数据与Master服务器完全相同,这点至关重要,这个可以放在备份之前执行,反正要求就是保证一致性。
无法限制root用户

mysql> SET @@global.read_only = ON;

2 备份

以下备份方式二选一
在所有Slave节点下执行

mysqldump -h 192.168.200.101 \
-u root \
--password=root \
--all-databases=true \
--routines --events \
--single-transaction \
--master-data  > dump.sql

mydumper安装我的其它文档

mydumper -h 192.168.200.101 \
-u root \
--password=root \
--use-savepoints  \
--trx-consistency-only \
--kill-long-queries \
--outputdir /app/mysql/mysqldata/backup

3 恢复

在所有Slave节点下执行
恢复也是二选一,根据上面备份方案决定
针对mysqldump备份集

mysql -u root -p -f < dump.sql

针对mydumper备份集

myloader \
--directory=/app/mysql/mysqldata/backup \
--user=binlog_user \
--password=binlog_user \
--queries-per-transaction=5000 \
--threads=8 \
--overwrite-tables

4 配置GTID

编辑所有节点的/etc/my.cnf文件,开启GTID,GTID必须保证所有节点配置相同

shell> sudo vi /etc/my.cnf
[mysqld] 
gtid_mode=ON
enforce-gtid-consistency=true
skip_slave_start

5 Slave节点配置

重启所有Slave节点

shell> systemctl restart mysqld.service

重新启动所有从站以使GTID生效。由于skip_slave_start参数,所以在手动执行START SLAVE命令之前,Slave将不会启动复制。此时无法启动启动,因为Master服务器GTID_MODE = OFF,Slave服务器GTID_MODE = ON,两者不相同

6 Master配置

shell> systemctl restart mysqld.service

7 启动复制

在所有备库执行

mysql> CHANGE MASTER TO MASTER_HOST = <master_host>, MASTER_PORT = <port>, MASTER_USER = 'binlog_user', MASTER_PASSWORD = 'binlog_P@ss12', MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;

8 检查设置是否生效

mysql> SHOW SLAVE STATUS\G

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值