本文主要内容如下:
1.分组复制产生的背景
2.几种复制技术的比较
3.失效检测
4.组成员
5.故障容忍度
6.成员的节点状态
7.分组复制的两种模式
8.供体节点
1.分组复制产生的背景
多个MySQL服务组成的普通的复制体系存在必须的维护管理工作。MySQL分组复制技术使用MySQL组内通信协议提供了如下的好处:
(1)提供组内的MySQL服务之间的自动化协调。
(2)支持单个Primary体系或者多个Primary体系的分组。
(3)单个Primary体系的分组支持自动化的Primary选举。
(4)多个Primary体系的分组支持自动化的所有Primary接收到更新。
(5)内置的分组服务提供了组内数据的一致性和可用性。
MySQL分组复制技术的应用场景:
(1)弹性复制。
满足MySQL服务主机数量的动态增减的需求。
(2)高可用分片。分片技术(Sharding)作为一种流行的横向扩展(scale-out)方法,一个MySQL分组可以为每一个分片提供高可用的解决方案。
(3)代替主从复制。在特定场景下普通的主从复制存在单点压力问题,MySQL分组提供了伸缩性更好的解决方案。
(4)自治系统。 内置的复制协议支持自动化的MySQL分组。
2. 几种复制技术的比较
MySQL提供的几种复制技术的差别对比如下:
(1)异步复制技术。
(2)半同步复制技术。
(3)分组复制技术。
3.失效检测
MySQL分组复制提供了一种失效检测机制,可以用于发现和报告哪些MySQL服务处于无响应状态,这些无响应的MySQL服务被假定为挂掉了。这种挂掉暂时只是作为一种可疑情况。随后,如果分组一致同意这种可疑情况属实,则分组决定该MySQL服务已经实际上失效了。最后分组中的其它成员通过协调决策,将该MySQL服务从分组中排除掉。无响应指一个MySQL服务在规定的时间内没有收到另一个MySQL服务的响应消息。
当一个MySQL服务被从分组中排除掉时,该MySQL服务同样会探测到其它所有MySQL服务都没响应,因此该MySQL服务会怀疑其它所有MySQL服务都挂掉了,但是由于无法得到证实,只能是怀疑,而且最后也没有结果;在这种情况下,该MySQL服务不能执行任何本地的事务。
4. 组成员
MySQL分组复制依赖于称为MySQL分组成员服务的分布式服务,该服务是以MySQL内置的插件的形式提供的。成员服务定义了哪些MySQL服务处于在线状态并且正在参与分组事务。在线状态列表以视图的形式提供,每个分组成员将能够取得一致的视图。
当一个MySQL服务加入MySQL分组时,或者主动或被动的离开分组时,分组服务将更新这个视图。
5. 故障容忍度
MySQL分组成员服务采用PAXOS分布式算法来保证分布式一致性。PAXOS分布式算法的介绍请参考这个网页:https://baike.baidu.com/item/Paxos%20%E7%AE%97%E6%B3%95
MySQL分组中的成员数量与故障容忍度之间的关系由以下公式决定:
n = 2 x f + 1
其中,f是故障容忍度,n是分组成员的数量。此处故障容忍度是在不影响服务正常运行的情况下可以出现故障的服务的数量的最大值。
6. 成员的节点状态
成员的节点状态有以下几种:
状态 | 同步 | 描述 |
ONLINE | 是 | 节点在线。支持所有分组功能。随时可执行事务。 |
RECOVERING | 否 | 节点在线。处于恢复状态。正在从供体(donor)接收数据。 |
OFFLINE | 否 | 节点不在线。不属于任何分组。 |
ERROR | 否 | 错误。自动将super_read_only设置为ON,需人工修改该变量。 |
UNREACHABLE | 否 | 不可达状态。该节点被认为无响应,或者已经挂掉了。 |
7. 分组复制的两种模式
MySQL分组复制技术提供了两种模式:
(1)单主模式。
在一个分组中,只有一个成员处于Primary模式,而其它成员都处于Secondary模式。处于Primary模式的节点提供读写服务,而处于Secondary模式的节点只提供只读服务。
(2)多主模式。
在一个分组中,有多个成员处于Primary模式,其余成员处于Secondary模式。处于Primary模式的节点提供读写服务,而处于Secondary模式的节点只提供只读服务。
单主模式和多主模式由系统变量来决定。
group_replication_single_primary_mode:
ON:单主模式。
OFF:多主模式。
默认情况下分组复制为单主模式。
8. 供体节点
在MySQL分组复制体系中,需要一个节点提供数据供其它节点进行复制,这个提供数据的节点称为供体节点(donor)。供体节点随机产生,在一个复制体系中,各个节点轮流担任供体节点。如果当前供体节点无法连接,则使用后备供体节点。MySQL尽量确保每次产生的供体节点不相同。