创建容错系统的最常见方式是通过使组件冗余化,换句话说,可以移除组件而系统应该继续按预期运行。这带来了一系列挑战,将这些系统的复杂性提升到一个全然不同的水平。具体来说,复制的数据库必须处理这样一个事实,即它们需要维护和管理多个服务器,而不仅仅是一个。此外,由于服务器一起合作创建组,因此还必须解决其他一些经典的分布式系统问题,如网络分区或脑裂场景。
因此,最终的挑战在于将数据库和数据复制的逻辑与具有多个服务器在一致且简单协调的逻辑融合在一起。换句话说,让多个服务器就系统状态和每次系统变化的数据达成一致意见。这可以概括为使服务器就每个数据库状态转换达成一致意见,以便它们都以一个单一数据库或最终收敛到相同状态的方式进行进展。这意味着它们需要作为(分布式)状态机运行。
MySQL Group Replication提供了具有强大协调的分布式状态机复制。当服务器属于同一组时,它们会自动协调。该组可以在单主模式下运行,并具有自动主选举,其中一次只有一个服务器接受更新。或者,对于更高级用户,该组可以以多主模式部署,其中所有服务器都可以接受更新,即使它们同时发出。这种功能以应用程序必须解决此类部署所施加的限制为代价。
有一个内置的组成员服务,使得在任何给定时间点,组的视图对所有服务器保持一致且可用。服务器可以离开和加入组,视图会相应更新。有时服务器可能意外离开组,此时故障检测机制会检测到这一情况,并通知组视图已更改。这一切都是自动的。
为了提交事务,组大多数成员必须就给定事务在全局事务序列中的顺序达成一致意见。决定提交或中止事务是每个服务器单独完成的,但所有服务器都做出相同的决定。如果存在网络分区,导致成员无法达成一致,那么系统直到解决此问题之前都不会继续进行。因此,还有一个内置的、自动的脑裂保护机制。
所有这些都由提供的群组通信系统(GCS)协议驱动。这些协议提供故障检测机制、组成员服务以及安全且完全有序的消息传递。所有这些属性都是创建一个确保数据在服务器组中一致复制的系统的关键。这项技术的核心是Paxos算法的实现,它充当着群组通信引擎的角色。




