MYSQL MGR 进化论 节点数据强一致 不是梦

为了答谢关注公众号并一直支持的小伙伴,这边拉到了赞助,下面是本次赞助拉到的精美书籍,有需要的亲们,周四会正式活动,答题赢MYSQL 图书的活动,希望能让大家满意。

正文

——————————————————————————————

MYSQL 一直在进步,从支持复杂查询,到8.014 版本已经支持了 consistency levels。什么是数据一致性。简而言之,一致性是一种考虑如何跨集群中的多个节点复制数据的方法,向一个节点写入一行数据,则在将该数据写入所有其他参与节点之前,不会认为该数据在集群中是一致的。这就会导致在MGR中的主节点写入的数据,在其他节点中读取的时候,和你的主节点的数据,不一致。

实际上在任何时候,让你的所有的节点的数据都一致,这.........

MGR 的参数group_replication_consistency 问题

1 他有几个参数

2 默认的参数是哪个

3 这些参数配置后的不同表现是什么

4 到底 group_replication_consistency 在MGR 中扮演了什么角色

我们围绕上面的三个问题来, 先回答问题2 在MYSQL 8.018 这个版本上,PERCONA SERVER 的版本的默认值是before  (为什么不是官版的MYSQL,可以参考之前的一个文字,关于PERCONA)

下面是一段测试,prove oneself  版本8.018

所有的服务器默认的 group_replication_consistency 都是 before

然后我们开始更新work_years 这个值,

主节点

其他从节点 NODE 2

其他从节点 NODE 3

通过验证,在大量更新超大行数的数据的时候,主节点和从节点的数据(在主节点已经commit后),从节点的数据并不一定和主节点一致,但在一段时间后,会一致。

AFTER

在将所有的节点都调整为AFTER 后,我们开始了实验

NODE1  主节点

NODE 2 从节点

NODE 3 从节点

从上的测试可以验证一个问题,就是BEFORE 和 AFTER 之间的区别

1 BEFORE 在主节点 commit 后  其他的从节点在查询数据时,与主节点是不一致的,但最终会一致

2 AFTER 在主节点commit 后,去查询从节点,从节点与主节点的数据是一致的。

这就是在设置这两个参数后,最大的不同,并且还有一个点就是主节点在commit 大事务的操作,同样是 200万行数据, BEFORE 的操作时间在 8分钟13秒, 而在设置了 after以后 同样的命令,操作时间在 18分钟45秒。

根据文档,其中的different 也不言而喻

Before 

A RW transaction waits for all preceding transactions to complete before being applied

AFTER

A RW transaction waits until its changes have been applied to all of the other members

实际上除了这两个值,还有其他的选择 Eventual , Before_on_primary_failover, Before , After, Before_and_After. 这么多到底怎么分。(第一个问题已经回答完)

实际上我们可以在使用 BEFORE ,AFTER , Before and After 的时候忘记 BEFORE_ON_PRIMARY_FAILOVER 这个选项因为他包含在这三者里面。

这里用图来说明  BEFORE  AND  AFTER

BEFORE ,Before 主要的关注点在读,下图 事务1 和事务2 在数据库中运行,虽然事务1 比事务2 要早开始, 但是却比事务2 晚结束,这就导致在从库上产生一个顺序性的问题,那如果你此时选择了BEFORE ,结果是你看到的结果会与主库不一致,是按照顺序而来的,你会按照在primary中实际事务的开始执行的顺序,在从库体现。

而AFTER 要表达的意思,在事务1在主库是否要不要提交,那的看他后面的节点们,如果他们都已经将事务接受,则可以返回一个信号,告诉主,OK,主库提交。此时对于事务 1 ,我们在 MGR的每台机器上看到的数据,都应该是一致的。

BEFORE 和  AFTER 的合并就是 BEFORE AND AFTER, 这里也做了测试,也是这三个里面最慢的一次  19分20秒, 想想也是。

当然这里也是很浅的说明,因为数据库本身他不是应用级别的产品,他是一个基础架构的问题,其中涉及到并发,只要涉及到并发的问题,则就不是一个顺序性级别的问题。所以在怎么考虑,琢磨,必然都会有遗漏。

注:在这样单任务无并发的情况下,在测试 BEFORE AND AFTER时,其中的一个节点改变了状态变为了 recovering,  后续由于操作的随意性,造成此节点与集群脱离,当然很快恢复了。

所以在目前即使是 8.018 的时候,我们对于MYSQL 的应用级别的事务,还是不能放松管控,尤其在你将他们的 consistency levels 设置成 AFTER ,BEFORE AND AFTER 后,并发的大事务可能会让你“痛不欲生”。这样的感觉,让我想起 PXC 的时代的数据强一致了。

所以没有特殊需求,consistency levels,的选择可以是 BEFORE 或者 BEFORE_ON_PRIMARY_FAILOVER, 这样的兼容性可能会对某些不注意数据库设计和使用MYSQL会好一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值