- [Mysql Group Replication](#mysql-group-replication) - [Group Replication Background](#group-replication-background) - [Replication Technologies](#replication-technologies) - [group replication](#group-replication) # Mysql Group Replication `Mysql Group Replication`可以用于创建弹性、高可用、有容错的replication拓扑。 groups可以在single-primary mode下进行执行,其支持自动的primary选举,在同一时刻只有一个server接收更新操作。 另外,groups也支持multi-primary mode部署,此时所有servers都能够接收写操作,即使多个写请求是并行发送的。 MGR存在一个内置的group membership service,其在任一时刻都能为所有servers提供一致且可用的组视图。server可以加入和离开group,group view也会随之改变。在某些时刻,server可能非预期的离开group,在这种情况下failure detection机制将会自动感知并通知group去更新group view。 group replication是作为mysql server的插件被提供的。可以通过Innodb Cluster来部署`mysql server instances group`。 > 为了部署多个mysql实例,可以使用Innodb Cluster,其能够通过Mysql Shell轻松的管理mysql server实例组。Innodb Cluster和Mysql Router无缝集成,在应用连接到集群式,无需在应用中编写failover流程。 ## Group Replication Background 创建有容错性系统的最常用方式是`采用冗余组件的方案`,即使组件被移除,系统仍可按预期继续运行。这样将会增加系统的复杂性,特别的,`replicated databases`必须维护和管理多台server;并且,servers以集群的方式对外提供服务,还需要处理其他若干的经典分布式系统问题:如network partition或split brain问题。 mysql group replication提供了distributed state machine replication,并保证了servers间的强协同;server在作为同一group的一部分,会自动的彼此之间进行协调。 对于待提交的事务,majority of group必须就`事务在global transactions中的顺序`达成一致。决定事务commit或abort是由每个server单独处理的,但是所有server中,该事务提交/回滚状态都完全一致。如果存在network partition,导致members不能就transaction order达成一致,那么系统将不能继续处理,直至该问题被解决。故而,MGR中存在内置、自动的split-brain保护机制。 上述所有内容都由`GCS`(Group Communication System)协议提供,其提供了如下内容 - 故障检测机制 - group membership service - safe and completely ordered message delivery 上述所有机制都保证了数据在group of servers之间能够被一致的复制。GCS技术的核心基于`Paxos`算法实现,其用作group communication engine。 ### Replication Technologies 传统的mysql replication提供了一种简单的`source to replica`的复制方法: - source为primary实例 - replica为secondaries实例 source将会应用事务,并对事务进行提交。之后,事务会异步的被发送到replicas,接收到事务的replica会对事务进行重新执行(statement-based replicaion)或被应用(row-based replication)。在默认情况下,所有的server都拥有数据的完整副本。 默认情况下,mysql的异步replication示例图如下: 除此之外,还存在半同步的replication,其在协议中添加了同步步骤。示例如下所示,primary会等待replicas接收到事务并向primary返回ack,在接收到ack后才会执行commit操作。 上面两张图为传统的asynchronous MYSQL replication protocol。 ### group replication group replication是一种用于实现fault-tolerant系统的技术。replication group是一系列servers的集合,其中每个server都含有数据的完整副本,servers之间通过message进行交互。 group中的communication layer提供了一系列保证,例如atomic message和total order message delivery。 Mysql Group Replication基于这些特性、抽象,实现了`multi-source update everywhere replication protocol`。一个replication group由多个server组成,每个server在每时每刻都独立的执行事务。 - read/write事务都只在其被group同意之后才提交;即对于read/write事务,都要由整个group决定其是否能被提交,故而提交操作并不是由源服务器单方面决定的。(read/write transaction代表事务中包含写操作的事务)。 - read-only事务则是不需要group内其他server的协助,立刻就能提交 当`read/write`事务准备好在源server上提交时,都会原子性的广播`write values`和`write set`: - write values:代表被修改后的整行数据 - write set:被修改数据的唯一标识符 由于transaction是被原子广播的,故而,要么`group中所有servers都接收到该事务`,要么`group中所有servers都未收到该事务`。并且,`对于所有servers,其接收到的所有事务都相同,并且所有事务按照相同的顺序被接收`,并且,会为所有事务建立一个`global total order`。 但是,事务在不同的servers上并行执行时,可能会发生冲突。在被称为`certification`的过程中,该冲突通过查看和比较两个不同并行事务的write sets来检测。在certification的过程中,冲突检测在行级别执行:如果两个并行的事务在不同的servers上执行,并且修改了相同的行,那么这将会存在冲突。 该冲突将会按照如下方案被解决:对于在global total order中排序靠前的事务,其将会在所有server上被提交;而排序靠后的事务则是会终止,在源服务器上被提交,并且被group中的其他servers丢弃。 例如,t1和t2在不同的servers上并发执行,两者都修改了同一行,t2的排序在t1之前,那么在冲突中t2将会获胜而t1会回滚。上述规则则是分布式的`first commit wins rule`。 > 如果两个事务发生冲突的可能性高于不冲突的可能性,那么最好让其在相同的server上执行,并且通过server的local lock机制来对事务进行同步;而不是在不同的server上执行,并因certification造成回滚。 对于已经被认证的事务进行`applying`和`externalizing`,group replicaion允许server`在不破坏一致性和有效性的前提下`偏离`agreed order of the transactions`。`group replication`是一个最终一致性的系统,代表incoming traffic降低或停止时,所有的group members都将包含相同的data content。当traffic较高时,事务可以以稍微不同的顺序进行externalizing,并且,事务在进行externalizing时,在一些servers进行externalizing的时机也可能早于其他servers。(`externalizing`指的即是实际提交事务并使事务的修改对client可见;`applying`指的是server应用来自其他server的事务修改)。 例如,在mulit-primary模式下,一个本地事务可能在certification之后立马就被externalized,即使一个来自remote server的transaction在global order中顺序更靠前并且尚未被applied。当certification过程中,多个transactions间不涉及冲突时,该操作是被允许的。 在single-primary模式下,在primary server上,可能小概率会发生`并发、非冲突的本地事务按照和global order agreed by group replication的顺序进行提交和externalized`。 在不接受来自客户端写入操作的secondaries节点上,事务总是按照agreed order被提交和externalized。 具体mysql group replication protocol的示意图如下所示: