高性能MYSQL---基于GDIT的主从复制(异步)

1.GTID的含义

  • Global Transaction Identifier,全局事务标识
  • 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
  • GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
  • 基于gtid的主从复制原理:每个mysql数据库上都有一个唯一uuid,每个事务生成一个id。gtid由上面两者组合: uuid+事务id

2.GTID工作原理

  • 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
  • binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
  • sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
  • 如果有记录,说明该GTID的事务已经执行,slave会忽略。
  • 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
  • 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

pos与GTID的区别:
两者都是日志文件里事件的一个标志,如果将整个mysql集群看作一个整体:pos就是局部的,GTID就是全局的

3.优势

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

4.实现主从复制

此实验是基于binlog的主从复制的基础上做的

step1 在主从两端都修改配置文件:
在server1和server2中做以下操作:

vim /etc/my.cnf
 32 gtid_mode=ON            开启gtid模式
 33 enforce-gtid-consistency=true    强制gtid一直性,用于保证启动gitd后事务的安全

systemctl restart mysqld	#重启mysql

在这里插入图片描述
step2 在从库端先停掉slave,然后重新创建连接:

注意:如果进行change master to时使用MASTER_AUTO_POSITION = 1, slave连接master将使用基于GTID的复制协议
在这里插入图片描述

5.测试

step1 在主库表中添加新的信息:
在这里插入图片描述
step2 从库查看是否复制成功:
在这里插入图片描述
在从server2上:

show slave status\G

发现这两个参数 Retrieved_Gtid_Set: /Executed_Gtid_Set: 变了,从1位置开始复制的
在这里插入图片描述
再查看gtid模式复制的起始和结束位置
在这里插入图片描述

发布了184 篇原创文章 · 获赞 7 · 访问量 3612

猜你喜欢

转载自blog.csdn.net/weixin_43936969/article/details/104719808
今日推荐