当前位置: 首页 > 科技观察

16.数据一致性与安全保证-MGR的简单介绍

时间:2023-03-13 16:10:24 科技观察

本文介绍了MGR如何保证数据的一致性和安全性。1、MGR事务一致性对于MGR这样的“分布式”系统,需要保证多个节点间的事务一致性。无论每个节点处于正常状态还是个别节点处于故障恢复状态,每个节点都必须能够保证交易数据的最终一致性。所谓最终一致性,就是当所有写事务请求都停止后,各个节点上的事务数据是一致的。与MGR数据一致性相关的因素有几个:节点变化、增加或删除。节点故障修复。主节点已切换。节点的事务一致性保证级别可以通过选项group_replication_consistency设置。该选项从MySQL8.0.14开始引入,默认值为EVENTUAL,也就是最终一致性。这也是MGR在8.0.14之前和引入这个选项之前默认的事务一致性保证级别。2.主节点切换时如何保证事务一致性在单主模式下,当主节点切换时(无论是手动切换还是因为故障转移),新的主节点有两种选择如何处理事务积压:1.第一种:不处理事务积压,立即响应读写事务请求。这时候,事务可能会读取到旧数据。2、第二种:优先处理积压的事务,再响应读写事务请求。此时,新的Primary节点可能需要更长的时间来响应读写事务请求,具体取决于积压事务队列的大小。MySQL8.0.14之前,因为不支持设置事务一致性级别,所以选择了最大化可用性的方案,即上面的第一种方案。P.S,在多主模式下,由于每个节点都可以响应读写事务请求,所以不存在这个问题。3.交易数据一致性保证在MGR中,并不是所有的事件(交易)都是同步的,有些过程是异步的,所以在从节点上可能存在数据延迟,也就是说从节点上可能读取到了旧数据。交易数据。从MySQL8.0.14开始,可以通过设置optiongroup_replication_consistency来控制RO(read-only)和RW(read-write)事务在读写数据之前的一致性级别,可以避免读取旧数据或者写入数据然后同步尽快转移到其他节点,以满足各种应用场景的交易一致性级别要求。我们先了解几个基本概念。事务同步分读时的事务同步和写时的事务同步。结合MGR的事务机制,更具体地说,是事务执行前(BEFORE)和事务执行后(AFTER)。接下来我们一一介绍选项group_replication_consistency的可选级别。P.S,可以在每个节点上分别设置不同的事务一致性级别,也可以进行session级别的修改,但不推荐这样做。3.1EVENTUAL在这个级别,RO和RW事务不需要等待积压的事务被应用后才被执行。这是默认级别,是引入此选项之前的行为。这意味着以下内容:RW事务可以在其他节点之前外部化(将事务广播到其他节点)而不是等待。RO事务可能会读取旧数据。当Primary节点切换时,新产生的RW事务可能会因为冲突而被回滚。3.2BEFORE_ON_PRIMARY_FAILOVER当发生主节点切换时,需要等待旧主节点的积压事务全部应用到新主节点上,才能正式完成切换,转为ONLINE状态成为一个新的主节点,并继续响应新的主节点。交易请求。这样做可以保证发生故障转移时,客户端不会发现旧数据,保证数据的一致性,但客户端也可能出现延迟。3.3在申请BEFORERW交易和执行RO交易之前,必须先等待之前积累的交易完成。这样可以保证RO交易总是能读取到最新的交易,而对于RW交易来说,只是等待累积交易的应用完成,而不需要其他节点上完成交易。3.4AFTER比BEFORE更近一步,要求RW事务在其他节点上等待申请完成。这样后续的交易就可以获取任意一个节点上最新的交易数据。事实上,您应该谨慎使用这个级别和更高级别,这可能会导致其他问题。可以参考这篇文章:技术分享|为什么不推荐MGR一致性模式AFTER3.5BEFORE_AND_AFTER一致性级别对RO和RW事务的要求最高,都需要同步事务数据。也就是说,在应用RW交易之前,它必须等待之前积累的交易完成,同时它还需要等待它的交易变化被应用到所有其他节点上;RO交易执行前,必须先等待之前积累的交易完成。4.一致性级别选择建议对于大多数场景,默认的EVENTUAL级别就足够了;特别是在使用单主模式时,如果需要实时读取交易数据,只需要向Primary节点发起请求即可。另外,如果担心主节点切换时会读取到旧的交易数据,可以将level提高到BEFORE_ON_PRIMARY_FAILOVER。另外,如果想在Secondary节点上及时读取最新的交易数据,提高读扩展能力,可以增加到BEFORE级别。不再推荐更高的一致性级别,并且存在更多潜在的风险和错误。P.S,最好将各个节点的一致性级别设置为相同,运行时不要修改session-level选项值,以免造成不可预知的影响。总结本文介绍了MGR中几种不同的数据一致性保证级别,以及选择哪个级别的建议。参考资料、文档:MySQL8.0参考手册(https://dev.mysql.com/doc/refman/8.0/en/group-replication.html)。数据库内核开发-文正虎(https://img.ydisp.cn/news/20220926/t1dnnq3qewi复制原理-宋立兵(https://img.ydisp.cn/news/20220926/jdztvpr02sy