MySQL之MGR初涉

简介

MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MGR是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供,实现了分布式下数据的最终一致性, 它是MySQL5.7版本出现的新特性,它提供了高可用、高扩展、高可靠的MySQL集群服务。组复制在数据库层面做到了高可用,只要集群中大多数主机可用,则服务可用。

特点

  • 高一致性:基于分布式paxos协议实现组复制,保证数据一致性。
  • 高容错性:自动检测机制,内置防脑裂保护机。
  • 高扩展性:节点增加移除自动更新组成员信息。新节点加入后,自动从其他节点同步增量数据。
  • 高灵活性:提供单主和多主模式,单主宕机自动选主。

限制

  • 存储引擎必须是InnoDB,即只支持InnoDB表
  • 每张表都必须要有一个主键,用于做weite set的冲突检测
  • 只支持ipv4,网络需求较高
  • 必须开启GTID
  • binlog格式必须设置为ROW
  • 一个MGR集群最多支持9个节点
  • 不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚
  • 二进制日志binlog不支持Replication event checksums
  • 多主模式(也就是多写模式) 不支持SERIALIZABLE事务隔离级别
  • 多主模式不能完全支持级联外键约束
  • 多主模式不支持在不同节点上对同一个数据库对象并发执行DDL(在不同节点上对同一行并发进行RW事务,后发起的事务会失败)

搭建过程可参考Docker 环境下搭建MySQL 8.0.20 组复制

单主模式和多主模式

MySQL组复制分单主模式和多主模式。

单主模式下,组复制具有自动选主功能,每次只有一个server成员接受更新。单主模式下,group内只有一个节点可读可写,其他节点只可以读。当primary节点意外宕机或下线,在集群仍满足大多数原则情况下,group内部发起选举,选出一个可用的读节点,提升为primary节点。primary选举根据group内剩下的存活节点的UUID按字典序升序选择,即剩余存活节点按UUID字典序排序,然后选择排在最前面的节点作为新的primary节点。

多主模式下,所有server成员都可以同时接受更新操作,group内的所有机器都是primary节点,同时可以进行读写操作,并且数据最终一致性。

MGR集群中事务的生命周期

MGR架构示意图

如图,DB1、DB2、DB3构成的MGR集群中,每个DB都有MGR层,MGR层功能可以简单理解为由Paxos模块和冲突检测Certify模块实现。

当 DB1 上有事务 T1 要执行时,T1 对 DB1 是来说本地事务,对于 DB2、DB3 来说是远端事务;DB1 上在事务 T1 在被执行后,会把执行事务 T1 信息广播给集群各个节点,包括 DB1 本身,通过 Paxos 模块广播给 MGR 集群各个节点,半数以上的节点同意并且达成共识,之后共识信息进入各个节点的冲突检测 certify 模块,各个节点各自进行冲突检测验证,最终保证事务在集群中最终一致性。

在冲突检测通过之后,本地事务 T1 在 DB1 直接提交即可,否则直接回滚。远端事务 T1 在 DB2 和 DB3 分别先更新到 relay log,然后应用到 binlog,完成数据的同步,否则直接放弃该事务。

https://yq.aliyun.com/articles/640117
https://database.51cto.com/art/202004/615706.htm?mobile
https://www.cnblogs.com/williamzheng/p/11347362.html
https://www.cnblogs.com/zzdbullet/p/11655434.html
https://www.cnblogs.com/fangxuanlang/p/10383544.html