在这个由两部分组成的博客系列中,我想介绍组复制的一些故障转移场景。在第一部分中,我将讨论在撰写这些文章时发现的一种有趣的行为和性能下降。在第2部分中,我将展示几个故障转移场景,并演示组复制如何处理每种情况。
测试环境非常基本,在MySQL 8.0.19上使用默认设置的三节点组复制(mysql1,mysql2,myslq3)。mysql2是主要的节点。
在这个场景中,我正在测试当一个节点与主节点分离时的部分网络故障,但其他节点仍然可以看到它。
你会想mysql3将失去quorum并退出集群,但是没有。在集群内部,所有节点都在不断地相互通信,而不仅仅是主节点在进行通信mysql3但也mysql1正在和mysql3.
如果我们从主服务器询问集群状态,它会说mysql3不可访问。
|
1
2
3.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29
30.
31
32
33
34
35
36
37
38
39
40
41
|
MySQL
mysql2
:
3306
ssl
JS
>
集群
.
状态
(
)
;
{
“clusterName”
:
“my_innodb_cluster”
,
“defaultReplicaSet”
:
{
“名称”
:
“默认”
,
“主”
:
“mysql2-T1:3306”
,
“ssl”
:
“禁用”
,
“状态”
:
“OK_NO_TOLERANCE”
,
“statusText”
:
“集群不能容忍任何故障。1名成员不活跃”
,
“拓扑结构”
:
{
“mysql1-T1:3306”
:
{
“地址”
:
“mysql1-T1:3306”
,
“模式”
:
“R / O”
,
“readReplicas”
:
{
}
,
“replicationLag”
:
零
,
“角色”
:
“哈”
,
“状态”
:
“在线”
,
“版本”
:
“8.0.19”
}
,
“mysql2-T1:3306”
:
{
“地址”
:
“mysql2-T1:3306”
,
“模式”
:
“R / W”
,
“readReplicas”
:
{
}
,
“replicationLag”
:
零
,
“角色”
:
“哈”
,
“状态”
:
“在线”
,
“版本”
:
“8.0.19”
}
,
“mysql3-T1:3306”
:
{
“地址”
:
“mysql3-T1:3306”
,
“模式”
:
“n / a”
,
“readReplicas”
:
{
}
,
“角色”
:
“哈”
,
“shellConnectError”
:
"MySQL错误2003 (HY000):无法连接到MySQL服务器'mysql3-T1' (110)"
,
“状态”
:
“访问”
,
“版本”
:
“8.0.19”
}
}
,
“topologyMode”
:
“单一主”
}
,
“groupInformationSourceMember”
:
“mysql2-T1:3306”
|
但如果我们问状态mysql1它会说一切正常:
|
1
2
3.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29
30.
31
32
33
34
35
36
37
38
39
40
41
|
MySQL
mysql1
:
3306
ssl
JS
>
集群
.
状态
(
)
;
{
“clusterName”
:
“my_innodb_cluster”
,
“defaultReplicaSet”
:
{
“名称”
:
“默认”
,
“主”
:
“mysql2-T1:3306”
,
“ssl”
:
“禁用”
,
“状态”
:
“OK”
,
“statusText”
:
“集群是在线的,可以容忍最多一个故障。”
,
“拓扑结构”
:
{
“mysql1-T1:3306”
:
{
“地址”
:
“mysql1-T1:3306”
,
“模式”
:
“R / O”
,
“readReplicas”
:
{
}
,
“replicationLag”
:
零
,
“角色”
:
“哈”
,
“状态”
:
“在线”
,
“版本”
:
“8.0.19”
}
,
“mysql2-T1:3306”
:
{
“地址”
:
“mysql2-T1:3306”
,
“模式”
:
“R / W”
,
“readReplicas”
:
{
}
,
“replicationLag”
:
零
,
“角色”
:
“哈”
,
“状态”
:
“在线”
,
“版本”
:
“8.0.19”
}
,
“mysql3-T1:3306”
:
{
“地址”
:
“mysql3-T1:3306”
,
“模式”
:
“R / O”
,
“readReplicas”
:
{
}
,
“replicationLag”
:
零
,
“角色”
:
“哈”
,
“状态”
:
“在线”
,
“版本”
:
“8.0.19”
}
}
,
“topologyMode”
:
“单一主”
}
,
“groupInformationSourceMember”
:
“mysql2-T1:3306”
|
对我来说,这有点令人困惑,因为我要求来自同一个集群的两个成员报告不同的状态,我希望在所有节点上看到相同的集群状态。
但这意味着什么呢?
我还能写集群吗?将mysql3获得新的变化?为了回答这些问题,让我们做一些简单的测试。
我创建了一个简单的表格:
|
1
2
3.
4
5
6
7
|
创建
表格
“实验室”(
“id”
int
非空
AUTO_INCREMENT,
的主机名
varchar(20)
默认的
零,
“created_at”
datetime
默认的
CURRENT_TIMESTAMP
在更新
CURRENT_TIMESTAMP,
主键
(“id”),
关键
“idx_created”(“created_at”)
)
引擎
=
InnoDB
|
现在我已经在主节点上开始了以下循环:
|
1
|
而
真正的
;
做
mysql
-usbtest
-pxxxxx
-P3306
-h127
.
0.0.1
-e
“INSERT INTO sysbench.”实验室(主机名)VALUES(@@主机名)"
;
完成
2
>/dev/零
|
它会尽可能多地插入主机名。我让它在后台运行。
我打开了两个ssh连接,一个到mysql2(primary),一个到mysql3,然后运行以下循环:
|
1
|
而
真正的
;
做
mysql
-BN
-usbtest
-pxxxxx
-P3306
-hmysql2
-e
select 'mysql2',count(*),now() from sysbench。where created_at BETWEEN now() -间隔1秒和现在()"
;
睡眠
1
;
完成
2
>/dev/零
|
它将打印每秒钟在mysql2和mysql3上插入多少行。
我切断了网络mysql2而且mysql3使用iptables:
|
1
|
mysql3
mysql2 -j DROP;iptables -A OUTPUT -s mysql2 -j DROP
|
在这之后,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:
|
1
2
3.
4
5
6
7
8
9
10
11
|
mysql3622020-03-3114:13:12
mysql3652020-03-3114:13:13
mysql3672020-03-3114:13:14
mysql3692020-03-3114:13:15
mysql3472020-03-3114:13:16
mysql302020-03-3114:13:17
mysql302020-03-3114:13:18
mysql302020-03-3114:13:19
mysql3412020-03-3114:13:20
mysql3712020-03-3114:13:21
mysql3722020-03-3114:13:22
|
同样,在PXC8中,所有节点报告相同的集群状态mysql2.
结论
由于Group Replication和Galera的实现和方法不同,因此可以看到对性能的影响也不同。Galera比Group Replication对网络问题有更好的容忍度。我将发表一篇更长的博客文章,其中也将讨论其他故障转移/灾难场景。










“不仅是主对话,而且mysql2也在与mysql3对话”
Mysql2是主要的..
它可能是“不仅是与mysql3的主要对话,而且是mysql1与mysql3的对话”?
谢谢,你说得对。
嗨,其因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”
}
我不明白为什么我得到了一个不同的结果。
你好,
您的阅读器节点可以相互看到吗?在iptables命令中,我猜您更改了主机名?Oracle也验证了这种行为:https://bugs.mysql.com/bug.php?id=99133
嗨,每个节点上的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确认这是一个错误,我得到了一个不同的结果,我很困惑…