在分布式一致性保证方面,无论是正常操作还是故障修复操作,组复制一直都是最终一致性系统。这意味着只要传入流量变慢或停止,所有组成员都将具有相同的数据内容。与系统一致性相关的事件可以分为控制操作(手动或由故障自动触发)和数据流操作。
对于组复制,可以在一致性方面进行评估的控制操作是
成员加入或离开,由组复制的 第 20.5.4 节,“分布式恢复” 和写入保护涵盖。
网络故障,由围栏模式涵盖。
在单主组中,主服务器故障转移,也可能是由
group_replication_set_as_primary()
触发的操作。
在单主组中,当一个辅助服务器被提升为主服务器时,发生主服务器故障转移,新主服务器可以立即对应用程序流量可用,而不管复制积压有多大,或者可以选择限制对其的访问,直到积压被应用。
使用第一种方法,组将在主服务器故障后尽可能快地确保稳定的组成员资格,方法是选举一个新的主服务器,然后立即允许数据访问,同时它仍在应用来自旧主服务器的任何可能的积压。写入一致性得到保证,但读取可能会暂时检索到陈旧数据,而新主服务器正在应用积压。例如,如果客户端 C1 在旧主服务器发生故障之前就在旧主服务器上写入了 A=2 WHERE A=1
,那么当客户端 C1 重新连接到新主服务器时,它可能会读取到 A=1
,直到新主服务器应用其积压并赶上旧主服务器离开组之前的状态。
使用第二种方法,系统在主服务器故障后以与第一种方法相同的方式确保稳定的组成员资格并选举一个新的主服务器,但在这种情况下,组将等待直到新主服务器应用所有积压,然后才允许数据访问。这确保了在前面描述的情况下,当客户端 C1 重新连接到新主服务器时,它会读取 A=2
。但是,权衡的是,故障转移所需的时间将与积压的大小成正比,在配置正确的组上,积压应该很小。
您可以使用 group_replication_consistency
变量配置成员在主服务器故障转移期间提供的交易一致性保证级别。请参阅 一致性对主服务器选举的影响。
数据流与组一致性保证相关,因为对组执行的读写操作,尤其是在这些操作分布在所有成员之间时。数据流操作适用于组复制的两种模式:单主和多主,但为了使本说明更清晰,它仅限于单主模式。在单主组的成员之间分配传入读或写事务的通常方法是将写入路由到主服务器,并将读取均匀地分配到辅助服务器。由于组应该表现为一个单一实体,因此可以合理地预期主服务器上的写入会立即在辅助服务器上可用。虽然组复制是使用实现 Paxos 算法的组通信系统 (GCS) 协议编写的,但组复制的某些部分是异步的,这意味着数据是异步地应用到辅助服务器的。这意味着客户端 C2 可以为主服务器写入 B=2 WHERE B=1
,立即连接到辅助服务器并读取 B=1
。这是因为辅助服务器仍在应用积压,尚未应用主服务器应用的事务。
您根据要在组中同步事务的点来配置组的一致性保证。为了帮助您理解这个概念,本节将简化跨组同步事务的点,即在读操作时或在写操作时。如果数据在读取时同步,当前客户端会话将等到给定点(即所有先前更新事务已应用的点),然后才能开始执行。使用这种方法,只有此会话受到影响,所有其他并发数据操作都不会受到影响。
如果数据在写入时同步,写入会话将等待直到所有辅助服务器都写入其数据。组复制在写入上使用总顺序,因此这意味着要等待此写入和辅助服务器队列中的所有先前写入应用。因此,当使用此同步点时,写入会话将等待所有辅助服务器队列应用。
任何其他方法都能确保在前面为客户端 C2 描述的情况下,即使立即连接到辅助服务器,也会始终读取 B=2
。每个方法都有其优点和缺点,这些优点和缺点与您的系统工作负载直接相关。以下示例描述了不同类型的工作负载,并建议哪个同步点适合。
想象以下情况
您希望平衡读取,而不会对从哪个服务器读取进行额外的限制,以避免读取陈旧数据,组写入比组读取少得多。
如果您有一个主要包含只读数据的组,并且希望读写事务在提交后立即应用到所有副本,以便后续的读取操作可以获取到最新的数据,包括最新的写入。这将确保您无需为每个只读事务支付同步成本,而只需为读写事务支付。
在这种情况下,您应该选择在写入时同步。
想象以下情况
您希望在不部署额外的限制的情况下平衡读取负载,以避免读取到陈旧数据,并且组写入操作比组读取操作更频繁。
您希望工作负载中的特定事务始终从组中读取最新的数据,例如,每当敏感数据更新时(例如文件的凭据或类似数据),并且您希望确保读取操作检索到最新的值。
在这种情况下,您应该选择在读取时同步。