在这个由两部分组成的博客系列中,我想介绍组复制的一些故障转移场景。在第一部分中,我将讨论在撰写这些文章时发现的一种有趣的行为和性能下降。在第2部分中,我将展示几个故障转移场景,并演示组复制如何处理每种情况。

测试环境非常基本,在MySQL 8.0.19上使用默认设置的三节点组复制(mysql1,mysql2,myslq3)。mysql2主要的节点。

在这个场景中,我正在测试当一个节点与主节点分离时的部分网络故障,但其他节点仍然可以看到它。

你会想mysql3将失去quorum并退出集群,但是没有。在集群内部,所有节点都在不断地相互通信,而不仅仅是主节点在进行通信mysql3但也mysql1正在和mysql3

如果我们从主服务器询问集群状态,它会说mysql3不可访问。

但如果我们问状态mysql1它会说一切正常:

对我来说,这有点令人困惑,因为我要求来自同一个集群的两个成员报告不同的状态,我希望在所有节点上看到相同的集群状态。

但这意味着什么呢?

我还能写集群吗?将mysql3获得新的变化?为了回答这些问题,让我们做一些简单的测试。

我创建了一个简单的表格:

现在我已经在主节点上开始了以下循环:

它会尽可能多地插入主机名。我让它在后台运行。

我打开了两个ssh连接,一个到mysql2(primary),一个到mysql3,然后运行以下循环:

它将打印每秒钟在mysql2和mysql3上插入多少行。

我切断了网络mysql2而且mysql3使用iptables:

在这之后,mysql3仍然得到改变,但如何?它不能连接到mysql2.但它仍然可以连接到mysql1哪个会充当中间的中继节点呢mysql2而且mysql3.这听起来很棒,因为即使在部分网络中断的情况下,我们仍然可以使用mysql3因为它得到了改变。然而,这种行为在任何地方都没有记录。所以我不知道它是如何工作的。我打开了一个错误报告更新文档。

严重的性能下降

然而,我也注意到,这导致了严重的性能下降。当所有节点都连接起来时,我能够每秒插入60-80行。当我切断网络时,这个数字下降到每秒2-5个插入,也就是80 - 90%退化。这可能严重影响任何应用程序的性能,这意味着组复制甚至部分网络中断,或错误实现Iptables规则,等等。可能会导致生产问题。

由于记录很差,我不能确定为什么会发生这种情况。在组复制中,大多数人承认事务就足够了,所以理论上,mysql2而且mysql1这就足够了,所以我们不能用网络延迟来解释这种下降,因为额外的跳数。

我也开了一个错误报告这一点已经得到了证实。

Percona XtraDB集群如何工作?雷竞技下载官网

雷竞技下载官网Percona XtraDB集群基于Galera,这是MySQL的另一个集群解决方案。在Galera,这种行为是众所周知的;一个节点甚至可以在数据中心之间充当中继节点。我还在一个三节点PXC8集群上重复了相同的测试。当我切断主节点(我写的地方)和mysql3有3秒的间隔,直到集群重新计算集群视图并重新路由流量,之后一切恢复正常没有可衡量的性能的影响,mysql3得到所有的变化是低谷吗mysql1

同样,在PXC8中,所有节点报告相同的集群状态mysql2

结论

由于Group Replication和Galera的实现和方法不同,因此可以看到对性能的影响也不同。Galera比Group Replication对网络问题有更好的容忍度。我将发表一篇更长的博客文章,其中也将讨论其他故障转移/灾难场景。

5评论
最古老的
最新的 大多数投票
内联反馈
查看所有评论
weike.meng

“不仅是主对话,而且mysql2也在与mysql3对话”
Mysql2是主要的..
它可能是“不仅是与mysql3的主要对话,而且是mysql1与mysql3的对话”?

weike.meng

嗨,其因Korocz
我在MySQL Community Server 8.0.19上的三个节点组复制上重复了相同的测试。当我设置iptables时,


# mysql3 iptables -A INPUT -s mysql1 -j DROP;iptables -A OUTPUT -s mysql1 -j DROP

首先打印出主节点


Mysql1 113 2020-04-22 10:46:55
Mysql1 94 2020-04-22 10:46:56
Mysql1 33 2020-04-22 10:46:57
Mysql1 11 2020-04-22 10:46:58
Mysql1 14 2020-04-22 10:46:59
Mysql1 13 2020-04-22 10:47:00
Mysql1 9 2020-04-22 10:47:01
Mysql1 4 2020-04-22 10:47:02
Mysql1 26 2020-04-22 10:47:03
Mysql1 56 2020-04-22 10:47:04
Mysql1 108 2020-04-22 10:47:05


mysql3节点打印出来


Mysql3 67 2020-04-22 10:46:54
Mysql3 69 2020-04-22 10:46:55
Mysql3 68 2020-04-22 10:46:56
Mysql3 28 2020-04-22 10:46:57
Mysql3 7 2020-04-22 10:46:58
Mysql3 9 2020-04-22 10:46:59
Mysql3 10 2020-04-22 10:47:00
Mysql3 5 2020-04-22 10:47:01
Mysql3 2 2020-04-22 10:47:02
Mysql3 1 2020-04-22 10:47:03
Mysql3 0 2020-04-22 10:47:04
Mysql3 0 2020-04-22 10:47:05
Mysql3 0 2020-04-22 10:47:06
Mysql3 0 2020-04-22 10:47:07

我得到了不同的结果。
在mytest中,所有节点上的集群状态都相同。


ssl JS > cluster.status()

:“clusterName oms4”,
" defaultReplicaSet ": {
“名称”:“默认”,
“主要”:“kh-oms4-sit-innodbcluster-db01:3306”,
“ssl”:“要求”,
“状态”:“OK_NO_TOLERANCE”,
"statusText": "群集不能容忍任何故障。1名成员不活跃”,
“拓扑”:{
" kh-oms4-sit-innodbcluster-db01:3306 ": {
“地址”:“kh-oms4-sit-innodbcluster-db01:3306”,
“模式”:“跑道”,
“readReplicas”:{},
“replicationLag”:空,
“角色”:“哈”,
“状态”:“在线”,
“版本”:“8.0.19”
},
" kh-oms4-sit-innodbcluster-db02:3306 ": {
“地址”:“kh-oms4-sit-innodbcluster-db02:3306”,
“模式”:“R / O”,
“readReplicas”:{},
“replicationLag”:空,
“角色”:“哈”,
“状态”:“在线”,
“版本”:“8.0.19”
},
" kh-oms4-sit-innodbcluster-db03:3306 ": {
“地址”:“kh-oms4-sit-innodbcluster-db03:3306”,
“模式”:“R / O”,
“readReplicas”:{},
“角色”:“哈”,
“状态”:“(失踪)”

},
“topologyMode”:“单一主”
},
:“groupInformationSourceMember kh-oms4-sit-innodbcluster-db01:3306”


我不明白为什么我得到了一个不同的结果。

weike.meng

嗨,每个节点上的iptables
mysql1


(电子邮件保护)~]# iptables -L
链输入(策略接受)
目标prot选择源目标

转发链(策略接受)
目标prot选择源目标

链输出(策略接受)
目标prot选择源目标


mysql2


(电子邮件保护)~]# iptables -L
链输入(策略接受)
目标prot选择源目标

转发链(策略接受)
目标prot选择源目标

链输出(策略接受)
目标prot选择源目标


mysql3


(电子邮件保护)~]# iptables -L
链输入(策略接受)
目标prot选择源目标
DROP all——kh-oms4-sit-innodbcluster-db01

转发链(策略接受)
目标prot选择源目标

链输出(策略接受)
目标prot选择源目标
DROP all——kh-oms4-sit-innodbcluster-db01

我使用这个命令设置iptables


iptables -A INPUT -s 10.101.190.112 -j DROP;iptables -A OUTPUT -s 10.101.190.112


在iptables命令中,我认为您更改了主机名..这意味着我应该


iptables -A INPUT -s kh-oms4-sit-innodbcluster-db01 -j DROP;iptables -A OUTPUT -s kh-oms4-sit-innodbcluster-db01 -j DROP


?

因为oracle确认这是一个错误,我得到了一个不同的结果,我很困惑…