一、什么是MGR?
MGR(MySQL Group Replication),是MySQL在2016年12月推出的一个全新的高可用与高扩展的解决方案。
二、为什么要使用MGR?
MySQL推出MGR之前,传统复制分为两种,异步复制、半同步复制。
MySQL Asynchronous Replication(异步复制):master执行事务,写入binlog日志,然后提交。slave接收binlog日志事务并将事务先写入relay日志,然后重做事务。当master宕机时有可能会造成数据不一致情况。
MySQL Semisynchronous Replication (半同步复制):master执行事务,写入二进制日志,将binlog事务日志传送到slave,slave接收到binlog事务日志后,将其写到relay log,然后向master返回传送成功ACK;master收到ACK后,再在存储引擎中提交事务。(两种提交方式,由参数rpl_semi_sync_master_wait_point决定)
但是以上两种主从复制存在以下弊端:
1、写操作集中在MASTER服务器上;
2、可能产生数据不一致的问题;
3、MASTER宕机后,需要人为选择新主并重新给其他的slave端执行change master。
三、MGR提供了哪些功能?
1、同步复制;
2、单主模式、多主模式;
3、自动切换;
4、弹性扩展。
四、MGR建置限制?
1、仅支持innodb引擎;
2、所有新增表必须显式创建主键;
3、建议隔离级别为READ COMMITED,多主模式下,不支持SERIALIZABLE;
4、多主模式下,不建议使用外键;
5、需开启bin_log_format=row、log_slave_updates=ON;
6、需开启GTID;
7、需安装引擎group_replication.so;
8、MGR最多支持9个节点。
五、MGR原理
1、单主模式
单主模式下,只有一个节点可以读写,其他节点提供只读服务。单主模式下,当主节点宕掉,其他节点自动会根据服务器的server_uuid变量和group_replication_member_weight变量值,选择下一个slave作为主节点,group_replication_member_weight的值最高的成员被选为新的主节点,该参数默认为50,可以在节点上设置不同值;在group_replication_member_weight值相同的情况下,group根据数据字典中server_uuid排序,排序在最前的被选择为主节点。
2、多主模式
多主模式下,在组复制中通过Group Replication Protocol协议及Paxos协议,形成的整体高可用解决方案,同时增加了certify的概念,负责检查事务是否允许提交,是否与其它事务存在冲突,Group Replication是由多个节点共同组成一个数据库集群,每个节点都可以单独执行事务,但是read-write(RW)的操作只有在组内验证后才可以commit,Read-only (RO)事务是不需要验证可以立即执行,当一个事务在一个节点上提交之前,会在组内自动进行原子性的广播,告知其他节点变更了什么内容/执行了什么事务,然后为该事物建立一个全局的排序,最终,这意味着所有的服务器都以相同的顺序接收相同的事务集。因此,所有服务器都按照相同的顺序应用相同的变更集,因此它们在组中保持一致。 在多主模式下,该组的所有成员都设置为读写模式,在多主模式下,不支持SERIALIZABLE事务隔离级别,且不能完全支持级联外键约束。