我们可以看到,在Percona解决很多不同的问题。雷竞技下载官网这是最新的一个让我抓我的头最近一段时间。
的场景
我们有一个分片集群环境运行MongoDB 4.0,需要升级到MongoDB 4.2。简单的对吧?唯一特定的关于这个环境,MongoDB是运行在一个定制的码头工人在AWS环境。
我们开始用通常的方法禁用均衡器和升级配置服务器的副本集。在这种情况下,配置服务器的副本运行MongoDB 4.0组有三个成员。而不是升级,我们选择运行MongoDB 4.2添加三个新成员。现在我们一共有六个节点。下一步是降压的主要的一个新的4.2节点最后解除旧服务器。
测试迁移计划
我们开始计划non-prod环境中。起初,一切正常;我们得到了配置服务器的副本将六名成员和设置优先级,这样一个新的4.2服务器是唯一的候选人成为主要从当前退位后。所以我们继续跑rs.stepDown ()命令像往常一样,这是当事情开始出错。客户突然开始报告以下信息:
|
1
|
2022年
- - - - - -
07年
- - - - - -
15 t14
:
49
:
59.629
+
0000年
W
网络
(
ReplicaSetraybet雷竞技竞猜在线官网Monitor
- - - - - -
TaskExecutor
]
不能
来
达到
主
为
集
testrs
- - - - - -
cfg
|
我的第一想法是在网络层一定是错的,但是检查所有主机之间的连接并没有发现问题。接下来,我们看着码头工人,但一切似乎都好了。
更深入的研究
我们连接本地服务器配置成为主要的,我们看到一个奇怪的情况。服务器无法完成升压过程成为主要的,而且中途它:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
testrs
- - - - - -
cfg
:
主
&
gt
;
db
.isMaster
(
)
{
“主机”
:
(
“host1:27019”
,
“host2:27019”
]
,
“被动”
:
(
“host3:27019”
,
“host4:27019”
,
“host5:27019”
,
“host6:27019”
]
,
“setName”
:
“testrs-cfg”
,
“setVersion”
:
77年
,
“ismaster”
:
假
,
“二级”
:
真正的
,
“主”
:
“host6:27019”
,
“我”
:
“host6:27019”
,
…
|
看着最后四行我们可以看到host6应该是主要的但不是完全提升。我们也检查了db.currentOp ()它显示所有会话似乎在等待一些锁相关副本设置状态转换,和下面的操作似乎困的创建索引config.chunks集合:
|
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
|
{
“类型”
:
“人事处”
,
“主机”
:
“host6:27019”
,
“desc”
:
“rsSync-0”
,
“活跃”
:
真正的
,
“currentOpTime”
:
“2022 - 07 - 18 t12:07:22.381 + 0000”
,
“effectiveUsers”
:
(
{
“用户”
:
“__system”
,
“数据库”
:
“本地”
}
]
,
“opid”
:
2800年
,
“secs_running”
:
NumberLong
(
5
)
,
“microsecs_running”
:
NumberLong
(
5494726
)
,
“人事处”
:
“命令”
,
“ns”
:
“配置cmd美元”。
,
“命令”
:
{
“方法createindex”
:
“块”
,
“索引”
:
(
{
“名称”
:
“ns_1_min_1”
,
“关键”
:
{
“ns”
:
1
,
“最小值”
:
1
}
,
“独一无二”
:
真正的
}
]
,
“$ db”
:
“配置”
}
,
“numYields”
:
0
,
“waitingForLatch”
:
{
“时间戳”
:
ISODate
(
“2022 - 07 - 18 t12:07:16.990z”
)
,
“captureName”
:
“ReplicationCoordinatorImpl:: _mutex”
}
,
“锁”
:
{
“ReplicationStateTransition”
:
“W”
}
,
“waitingForLock”
:
假
,
|
奇怪的是这个集合包含只有几个文档,所以这个操作应该非常快(也索引已经存在)。
在这一点上,我们怀疑可能触及一些bug,开始看很多关于死锁问题的报道在降压的/加速的过程。不幸的是,我们空手上来了。
解决方案
接下来,我们检查了配置服务器副本集本身的配置,注意到一些不寻常的“设置”部分rs.conf ():
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
“设置”
:
{
“chainingAllowed”
:
真正的
,
“heartbeatIntervalMillis”
:
2000年
,
“heartbeatTimeoutSecs”
:
10
,
“electionTimeoutMillis”
:
10000年
,
“catchUpTimeoutMillis”
:
- - - - - -
1
,
“catchUpTakeoverDelayMillis”
:
30000年
,
“getLastErrorModes”
:
{
}
,
“getLastErrorDefaults”
:
{
“w”
:
“大多数”
,
“j”
:
真正的
,
“wtimeout”
:
0
}
,
“replicaSetId”
:
ObjectId
(
“62 cd9b0d1bb173ee7be7f2ef”
)
}
}
|
的getLastErrorDefaults运行时设置是省略了大部分时间rs.initialize (),因为写的问题是通常控制在每会话的基础上。在这种情况下,配置服务器副本被初始化getLastErrorDefaults的{w:多数,j:真}而不是默认的值w: {1}。
我们尝试重置副本配置设置为默认值如下:
|
1
2
3
|
cfg
=
rs
. conf
(
)
cfg
.settings
.getLastErrorDefaults
=
{
“w”
:
1
,
“wtimeout”
:
0
}
rs
.reconfig
(
cfg
)
|
这样做之后,rs.stepDown ()完美地工作,我们可以有4.2基本到位。
结论
这个故事的寓意是,我们应该检查写担忧副本的默认值设置水平促进MongoDB 4.2主第一次。
非默认写问题之前没有选举的问题,所以一些改变在MongoDB 4.2引发这种行为。这个问题是特定于配置服务器,同样没有发生与普通碎片复制集。
有趣的是,从MongoDB 5.0我们不能再指定一个默认写关心使用settings.getLastErrorDefaults对一个副本集。
这也证明了值的测试设置,模拟真实的生产环境中,能够测试和捕捉这些问题在生产之前咬我们。





