最近,我工作在一个非常不幸的情况下,围绕不同集群,数据丢失,丢失重要的错误日志,强迫命令雷竞技下载官网Percona XtraDB集群(PXC)。尽管PXC尽量解释发生了什么错误日志,我保证它可以错过或忽视当你不知道会发生什么。
这篇文章是一个警告的故事,邀请尝试自己和摔打东西(不是在生产,对吗?)。
TLDR:
你知道马上看到此日志时发生了什么?
|
1
|
2023年
- - - - - -
06
- - - - - -
22 t08
:
23
:
29.003334 z
0
(
错误
]
(
我的
- - - - - -
000000年
]
(
Galera
]
gcs
/
src
/
gcs_group
。
cpp
:
group_post_state_exchange
(
)
:
433年
:
扭转
历史
:
171年
- >
44
,
这
成员
有
应用
127年
更多的
事件
比
的
主
组件
。
数据
损失
是
可能的
。
必须
中止
。
|
示范
使用大https://github.com/datacharmer/dbdeployer:
|
1
|
美元
dbdeployer
部署
复制
- - -
拓扑结构
=
pxc
- - -
沙盒
- - - - - -
二进制
=
~
/
选择
/
pxc
8.0.31
|
让我们写一些数据
|
1
|
美元
。
/
沙箱
/
pxc_msb_8_0_31
/
sysbench
oltp_read_write
- - -
表
=
2
- - -
表
- - - - - -
大小
=
1000年
准备
|
然后,假设有人想重启节点1。出于某种原因,他们阅读在你的内部文档要引导在这种情况下。dbdeployer,这将转化为:
|
1
2
3
4
5
|
美元
。
/
沙箱
/
pxc_msb_8_0_31
/
node1
/
停止
停止
/
家
/
雅安
- - - - - -
信用证
/
沙箱
/
pxc_msb_8_0_31
/
node1
美元
。
/
沙箱
/
pxc_msb_8_0_31
/
node1
/
开始
- - -
wsrep
- - - - - -
新
- - - - - -
集群
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
^
C
|
它失败了,因为它应该。
在现实中,那些引导错误发生在自制的启动脚本,木偶或ansible模块,甚至内部应用程序错误的情况。
为什么会失败呢?第一个错误需要注意:
|
1
|
2023年
- - - - - -
06
- - - - - -
22 t08
:
00
:
48.322148 z
0
(
错误
]
(
我的
- - - - - -
000000年
]
(
Galera
]
它
可能
不
是
安全
来
引导
的
集群
从
这
节点
。
它
是
不
的
去年
一个
来
离开
的
集群
和
可能
不
包含
所有
的
更新
。
来
力
集群
引导
与
这
节点
,
编辑
的
grastate
。
dat
文件
手动
和
集
safe_to_bootstrap
来
1
。
|
提醒:引导应该只用于当每个节点已经双重检查;这是一个手工操作。这里失败了,因为它没有强迫,因为该节点没有集群中的最后一个停止。
良好的反射:连接到其他mysql和检查之前“wsrep_cluster_size”和“wsrep_cluster_status”状态。
|
1
|
mysql
>
显示
全球
状态
在哪里
variable_name
在
(
“wsrep_local_state”
,
“wsrep_local_state_comment”
,
“wsrep_local_commits”
,
“wsrep_received”
,
“wsrep_cluster_size”
,
“wsrep_cluster_status”
,
“wsrep_connected”
)
;
|
不:盲目应用此日志告诉你做什么。
但我们是来“修复”,找到答案,让我们引导。
|
1
2
3
|
美元
sed
- - - - - -
我
' s / safe_to_bootstrap: 0 / safe_to_bootstrap: 1 / '
。
/
沙箱
/
pxc_msb_8_0_31
/
node1
/
数据
/
grastate
。
dat
美元
。
/
沙箱
/
pxc_msb_8_0_31
/
node1
/
开始
- - -
wsrep
- - - - - -
新
- - - - - -
集群
。
。
沙盒
服务器
开始
|
在这一点上,注意从node1,你有:
|
1
2
3
4
5
6
7
|
美元
。
/
沙箱
/
pxc_msb_8_0_31
/
node1
/
使用
- - - - - -
e
“显示全球地位variable_name在(“wsrep_cluster_status”、“wsrep_cluster_size”)”
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
变量
_的名字
|
价值
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
wsrep_cluster
_大小
|
1
|
|
wsrep_cluster_status
|
主
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
但从node2 node3你会:
|
1
2
3
4
5
6
7
|
美元
。
/
沙箱
/
pxc_msb_8_0_31
/
node2
/
使用
- - - - - -
e
“显示全球地位variable_name在(“wsrep_cluster_status”、“wsrep_cluster_size”)”
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
变量
_的名字
|
价值
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
wsrep_cluster
_大小
|
2
|
|
wsrep_cluster_status
|
主
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - - - - -
+
|
看起来可疑。但是你的监控真的提醒你这个吗raybet雷竞技竞猜在线官网?
让我们写一些更多的数据,很明显在node1上,因为为什么呢?它看起来健康。
|
1
|
美元
。
/
沙箱
/
pxc_msb_8_0_31
/
node1
/
sysbench
oltp_delete
- - -
表
=
2
- - -
表
- - - - - -
大小
=
1000年
- - -
事件
=
127年
运行
|
127年将是有用的。
噩梦随之而来
我们几天后。你还是写你的节点。一些新的理由node1是重启。也许你想申请一个参数。
|
1
2
|
美元
。
/
沙箱
/
pxc_msb_8_0_31
/
node1
/
重新启动
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
^
C
|
失败了吗?
检查日志,你会发现:
|
1
2
3
4
|
美元
少
沙箱
/
pxc_msb_8_0_31
/
node1
/
数据
/
msandbox
。
犯错
。
。
。
2023年
- - - - - -
06
- - - - - -
22 t08
:
23
:
29.003334 z
0
(
错误
]
(
我的
- - - - - -
000000年
]
(
Galera
]
gcs
/
src
/
gcs_group
。
cpp
:
group_post_state_exchange
(
)
:
433年
:
扭转
历史
:
171年
- >
44
,
这
成员
有
应用
127年
更多的
事件
比
的
主
组件
。
数据
损失
是
可能的
。
必须
中止
。
。
。
。
|
瞧,我们再次找到我们的“127”。
很好的反射:视情况而定。需要自己的一篇文章,但这是一个严重的问题。
不:Force SST在这个节点。因为它会工作,每个数据插入node1将丢失。
这是什么意思?
迫使引导时,总是一个节点开始。它不会尝试连接到其他节点,如果他们是健康的。其他节点不会尝试连接到第三个;从他们的观点来看,它只是没有加入,所以它不是集群的一部分。
当重新启动之前引导node1在哪些模式中,这是他们第一次见面。
每次提交一个事务,它是复制通过序列号(seqno)。seqno日益增加。它使用节点来确定增量状态传输是可能的,或如果一个节点状态是一致的。
现在node1不再是在引导模式,node1连接到其他成员。node1股票其状态(最后一个主要成员,seqno)。其他节点正确地捡起,这seqno看起来可疑的,因为它是比自己高,这意味着节点加入可以应用更多的事务。这也意味着它是来自一些其他集群。
因为节点在疑问,什么都不会发生。Node1被拒绝加入,不会做任何事情。它不会自动尝试重新同步,不会碰它的数据。Node2 node3则不受影响;他们将作为太。
如何从有取决于没有一般的指导方针。理想情况下,应该发现真理的源泉。如果两个集群应用写道,在最艰难的情况,这是一个分裂的大脑。
请注意:seqno只是数字。有平等seqno并不保证底层事务应用是相同的,但它仍然是有用的作为一个简单的检查。如果我们浪费更多并应用127个事务在node2上,甚至在grastate seqno手动修改。dat,我们可以“有趣”的结果。试一下(不生产,请注意)!
请注意:如果你不知道引导以及如何正确恢复,查看文档。
结论
最后引导是一个过程,不要强迫它轻。不要强迫SST马上如果一个节点没有想加入。你应该首先检查错误日志。
幸运的是,PXC并不盲目地让任何节点加入没有仔细检查。
减少意外停机时间与高可用性和数据丢失,开源MySQL集群解决方案。





