上图是半同步复制(Semi-sync replication)的示意图,在master将事务写入binlog后,将新写入的binlog事务
日志传送给slave节点,但需要等待slave返回传送的结果;slave收到binlog事务后,将其写入relay log中,然
后向master返回传送成功ACK;master收到ACK后,再在存储引擎中提交事务。
MySQL基于两种复制模式都可以搭建高可用数据库集群,也能满足大部分高可用系统的要求,但在对事务一致
性要求很高的系统中,还是存在一些不足,主要的不足就是主从之间的事务不能保证时刻完全一致。
基于异步复制的高可用方案存在主从不一致乃至丢失事务的风险,原因在于当master将事务写入binlog,然
后复制给slave后并不等待slave回复即进行提交,若slave因网络延迟或其它问题尚未收到binlog日志,而此
时master故障,应用切换到slave时,本来在master上已经提交的事务就会丢失,因其尚未传送到slave,从
而导致主从之间事务不一致。
基于semi-sync复制的高可用方案也存在主备不一致的风险,原因在于当master将事务写入binlog,尚未传
送给slave时master故障,此时应用切换到slave,虽然此时slave的事务与master故障前是一致的,但当主
机恢复后,因最后的事务已经写入到binlog,所以在master上会恢复成已提交状态,从而导致主从之间的事
务不一致。
Group Replication应运而生
为了应对事务一致性要求很高的系统对高可用数据库系统的要求,并且增强高可用集群的自管理能力,避免节
点故障后的failover需要人工干预或其它辅助工具干预,MySQL5.7新引入了Group Replication,用于搭建更
高事务一致性的高可用数据库集群系统。基于Group Replication搭建的系统,不仅可以自动进行failover,而
且同时保证系统中多个节点之间的事务一致性,避免因节点故障或网络问题而导致的节点间事务不一致。此外
还提供了节点管理的能力,真正将整个集群做为一个整体对外提供服务。
Group Replication的实现原理
Group Replication由至少3个或更多个节点共同组成一个数据库集群,事务的提交必须经过半数以上节点同意
方可提交,在集群中每个节点上都维护一个数据库状态机,保证节点间事务的一致性。Group Replication基于
分布式一致性算法Paxos实现,允许部分节点故障,只要保证半数以上节点存活,就不影响对外提供数据库服
务,是一个真正可用的高可用数据库集群技术。
Group Replication支持两种模式,单主模式和多主模式。在同一个group内,不允许两种模式同时存在,并且
若要切换到不同模式,必须修改配置后重新启动集群。
在单主模式下,只有一个节点可以对外提供读写事务的服务,而其它所有节点只能提供只读事务的服务,这也
是官方推荐的Group Replication复制模式。单主模式的集群如下图所示:
评论