新的环境可以有不同的复制集的名称和/或服务在不同的主机和端口。PBM处理这种困难的为你工作。这样迁移的正常恢复。在这篇文章中,我将向您展示如何迁移到一个新的集群。
这个问题
通常改变集群拓扑你做大量的手工步骤。PBM减少的过程。
让我们看一看一个例子,我们将有一个初始集群和期望。
初始集群:
|
1
2
3
4
|
configsrv年代pan>
:“configsrv / conf年代pan>
:27017”年代pan>
碎片年代pan>
:年代pan>
- - - - - -<年代pan class="crayon-h">
“rs0 / rs0:27017 rs1:27017 rs2:27017”年代pan>
- - - - - -<年代pan class="crayon-h">
“extra-shard /额外的:27018”年代pan>
|
集群包括年代pan>configsrv年代trong>configsvr replset与单个节点和两个碎片:年代pan>rs0年代trong>(3节点replset)年代pan>extra-shard年代trong>(1节点replset)。名称、主机和端口不跨集群传统但我们会解决这个问题。年代pan>
目标集群:年代pan>
|
1
2
3
4
5
|
configsrv年代pan>
:“cfg / cfg0年代pan>
:27019”年代pan>
碎片年代pan>
:年代pan>
- - - - - -<年代pan class="crayon-h">
“rs0 / rs00:27018 rs01:27018 rs02:27018”年代pan>
- - - - - -<年代pan class="crayon-h">
“卢比/ rs10:27018 rs11:27018 rs12:27018”年代pan>
- - - - - -<年代pan class="crayon-h">
“卢比/ rs20:27018 rs21:27018 rs22:27018”年代pan>
|
在这里我们有年代pan>cfg年代trong>configsvr replset单个节点和3碎片年代pan>rs0年代trong>- - - - - -<年代trong>平日年代trong>在每个碎片都是3复制集。年代pan>
思考如何做到这一点。年代pan>
PBM,所有我们需要部署集群和逻辑备份由PBM 1.5.0或更高版本。以下简单的命令将做其余的:年代pan>
|
1
|
pbm年代pan>
恢复年代pan>
BACKUP_NAME美元年代pan>
- - -年代pan>
replset年代pan>
- - - - - -年代pan>
重新映射年代pan>
“cfg = configsrv rs1 = extra-shard”年代pan>
|
迁移在行动
让我告诉你如何看起来在实践中。我将提供最后的细节。年代pan>在年代pan>回购年代pan>,<年代pan style="font-weight: 400;">你可以找到所有配置、脚本和输出用在这里。年代pan>
正如上面提到的,我们需要一个备份。为此,我们将部署一个集群,种子数据,然后进行备份。年代pan>
最初的集群部署
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
美元年代pan>
>年代pan>
最初的年代pan>
/年代pan>
部署年代pan>
>年代pan>
最初的年代pan>
/年代pan>
部署年代pan>
.out年代pan>
美元年代pan>
>年代pan>
码头工人年代pan>
组成年代pan>
- - - - - -年代pan>
f年代pan>
“初始/ compose.yaml”年代pan>
执行年代pan>
pbm年代pan>
- - - - - -年代pan>
相依年代pan>
\年代pan>
pbm年代pan>
状态年代pan>
- - - - - -年代pan>
年代年代pan>
集群年代pan>
集群年代pan>
:年代pan>
= = =年代pan>
= = =年代pan>
= =年代pan>
configsvr年代pan>
:年代pan>
- - - - - -年代pan>
configsvr年代pan>
/年代pan>
相依年代pan>
:年代pan>
27019年年代pan>
:年代pan>
pbm年代pan>
- - - - - -年代pan>
代理年代pan>
v1年代pan>
。年代pan>
8.0年代pan>
好吧年代pan>
rs0年代pan>
:年代pan>
- - - - - -年代pan>
rs0年代pan>
/年代pan>
rs00年代pan>
:年代pan>
27017年年代pan>
:年代pan>
pbm年代pan>
- - - - - -年代pan>
代理年代pan>
v1年代pan>
。年代pan>
8.0年代pan>
好吧年代pan>
- - - - - -年代pan>
rs0年代pan>
/年代pan>
rs01年代pan>
:年代pan>
27017年年代pan>
:年代pan>
pbm年代pan>
- - - - - -年代pan>
代理年代pan>
v1年代pan>
。年代pan>
8.0年代pan>
好吧年代pan>
- - - - - -年代pan>
rs0年代pan>
/年代pan>
rs02年代pan>
:年代pan>
27017年年代pan>
:年代pan>
pbm年代pan>
- - - - - -年代pan>
代理年代pan>
v1年代pan>
。年代pan>
8.0年代pan>
好吧年代pan>
额外的年代pan>
- - - - - -年代pan>
碎片年代pan>
:年代pan>
- - - - - -年代pan>
额外的年代pan>
- - - - - -年代pan>
碎片年代pan>
/年代pan>
额外的年代pan>
:年代pan>
27018年年代pan>
:年代pan>
pbm年代pan>
- - - - - -年代pan>
代理年代pan>
v1年代pan>
。年代pan>
8.0年代pan>
好吧年代pan>
|
链接:<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/initial/deploy" target="_blank" rel="noopener">初始/部署一个>,<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/initial/deploy.out" target="_blank" rel="noopener">初始/ deploy.out一个>
集群已经准备好,我们可以添加一些数据。年代pan>
种子数据
我们将插入第一个1000年一个自然数序列数字:1 - 1000。年代pan>
|
1
2
3
|
美元年代pan>
>年代pan>
mongosh年代pan>
“mongo: 27017 / rsmap”年代pan>
- - -年代pan>
安静的年代pan>
- - -年代pan>
eval年代pan>
”
为年代pan>
(年代pan>
让年代pan>
我年代pan>
=年代pan>
1年代pan>
;年代pan>
我年代pan>
< =年代pan>
1000年年代pan>
;年代pan>
我年代pan>
+ +年代pan>
)年代pan>
db年代pan>
.coll年代pan>
.insertOne年代pan>
(年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>”<年代pan class="crayon-h">
>年代pan>
/年代pan>
dev年代pan>
/年代pan>
零年代pan>
|
获得数据状态
这些文件应该在插入时分区的所有碎片。看一下,一般来说,如何。我们将使用年代pan>”<年代trong>dbHash年代trong>”年代pan>命令所有的碎片集合的状态。它将用于验证后。年代pan>
我们还将做一个快速检查碎片,蒙戈。年代pan>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
|
美元年代pan>
>年代pan>
最初的年代pan>
/年代pan>
dbhash年代pan>
>年代pan>
最初的年代pan>
/年代pan>
dbhash年代pan>
.out年代pan>
& &年代pan>
猫年代pan>
最初的年代pan>
/年代pan>
dbhash年代pan>
.out年代pan>
# rs00:27017 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
# rs01:27017 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
# rs02:27017 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
#额外:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“4 a79c07e0cbf3c9076d6e2d81eb77f0a”年代pan>
}年代pan>
# rs00:27017 db.getSiblingDB .coll (“rsmap”)年代pan>
;年代pan>
(年代pan>
)年代pan>
.sort年代pan>
(年代pan>
{年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
.toArray年代pan>
(年代pan>
)年代pan>
.reduce年代pan>
(年代pan>
(年代pan>
(年代pan>
数年代pan>
=年代pan>
0年代pan>
,年代pan>
seq年代pan>
=年代pan>
真正的年代pan>
,年代pan>
下一个年代pan>
=年代pan>
1年代pan>
]年代pan>
,年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>
=年代pan>
>年代pan>
(年代pan>
数年代pan>
+年代pan>
1年代pan>
,年代pan>
seq年代pan>
& &年代pan>
下一个年代pan>
= =年代pan>
我年代pan>
,年代pan>
我年代pan>
+年代pan>
1年代pan>
]年代pan>
,年代pan>
(年代pan>
]年代pan>
)年代pan>
.slice年代pan>
(年代pan>
0年代pan>
,年代pan>
2年代pan>
)年代pan>
(年代pan>
520年年代pan>
,年代pan>
假年代pan>
]年代pan>
#额外:27018 db.getSiblingDB .coll (“rsmap”)年代pan>
;年代pan>
(年代pan>
)年代pan>
.sort年代pan>
(年代pan>
{年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
.toArray年代pan>
(年代pan>
)年代pan>
.reduce年代pan>
(年代pan>
(年代pan>
(年代pan>
数年代pan>
=年代pan>
0年代pan>
,年代pan>
seq年代pan>
=年代pan>
真正的年代pan>
,年代pan>
下一个年代pan>
=年代pan>
1年代pan>
]年代pan>
,年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>
=年代pan>
>年代pan>
(年代pan>
数年代pan>
+年代pan>
1年代pan>
,年代pan>
seq年代pan>
& &年代pan>
下一个年代pan>
= =年代pan>
我年代pan>
,年代pan>
我年代pan>
+年代pan>
1年代pan>
]年代pan>
,年代pan>
(年代pan>
]年代pan>
)年代pan>
.slice年代pan>
(年代pan>
0年代pan>
,年代pan>
2年代pan>
)年代pan>
(年代pan>
480年年代pan>
,年代pan>
假年代pan>
]年代pan>
# mongo: 27017年代pan>
(年代pan>
1000年年代pan>
,年代pan>
真正的年代pan>
]年代pan>
|
链接:<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/initial/dbhash" target="_blank" rel="noopener">初始/ dbhash一个>,<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/initial/dbhash.out" target="_blank" rel="noopener">初始/ dbhash.out一个>
所有年代pan>rs0年代trong>成员有相同的数据。从初级中学复制正确。年代pan>
的年代pan>quickcheck.js年代pan>中使用的<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/initial/dbhash" target="_blank" rel="noopener">初始/ dbhash一个>脚本描述文档。它返回文档的数量以及这些文档是否使自然数序列。年代pan>
我们有数据备份。时间进行备份。年代pan>
做一个备份
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
美元年代pan>
>年代pan>
码头工人年代pan>
组成年代pan>
- - - - - -年代pan>
f年代pan>
最初的年代pan>
/年代pan>
组成年代pan>
.yaml年代pan>
执行年代pan>
pbm年代pan>
- - - - - -年代pan>
相依年代pan>
bash年代pan>
pbm年代pan>
- - - - - -年代pan>
相依年代pan>
>年代pan>
pbm年代pan>
备份年代pan>
- - -年代pan>
等待年代pan>
开始年代pan>
备份年代pan>
2022 - 06 - 15 t08:18:44z年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
等待年代pan>
为年代pan>
2022 - 06 - 15 t08:18:44z年代pan>
备份年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
完成年代pan>
pbm年代pan>
- - - - - -年代pan>
相依年代pan>
>年代pan>
pbm年代pan>
状态年代pan>
- - - - - -年代pan>
年代年代pan>
备份年代pan>
备份年代pan>
:年代pan>
= = =年代pan>
= = =年代pan>
= =年代pan>
FS年代pan>
/年代pan>
数据年代pan>
/年代pan>
pbm年代pan>
快照年代pan>
:年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
18年代pan>
:年代pan>
44 z年代pan>
28.23 kb年代pan>
<年代pan>
逻辑年代pan>
>年代pan>
(年代pan>
完整的年代pan>
:年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
18年代pan>
:年代pan>
49 z年代pan>
]年代pan>
|
我们有一个备份。是足够的迁移到新的集群。年代pan>
让我们破坏最初的集群和部署到目标环境。(破坏初始集群不是一个要求。我只是不想浪费资源。)年代pan>
集群部署目标
|
1
2
3
|
pbm年代pan>
- - - - - -年代pan>
相依年代pan>
>年代pan>
退出年代pan>
美元年代pan>
>年代pan>
码头工人年代pan>
组成年代pan>
- - - - - -年代pan>
f年代pan>
最初的年代pan>
/年代pan>
组成年代pan>
.yaml年代pan>
下来年代pan>
- - - - - -年代pan>
v年代pan>
>年代pan>
/年代pan>
dev年代pan>
/年代pan>
零年代pan>
美元年代pan>
>年代pan>
目标年代pan>
/年代pan>
部署年代pan>
>年代pan>
目标年代pan>
/年代pan>
部署年代pan>
.out年代pan>
|
链接:<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/target/deploy">目标/部署一个>,<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/target/deploy">目标/ deploy.out一个>
让我们检查PBM状态。年代pan>
PBM状态
|
1
2
3
4
5
6
7
8
9
10
11
12
|
美元年代pan>
>年代pan>
码头工人年代pan>
组成年代pan>
- - - - - -年代pan>
f年代pan>
目标年代pan>
/年代pan>
组成年代pan>
.yaml年代pan>
执行年代pan>
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
bash年代pan>
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
>年代pan>
pbm年代pan>
配置年代pan>
- - -年代pan>
力年代pan>
- - - - - -年代pan>
重新同步年代pan>
#确保代理从存储器同步年代pan>
存储年代pan>
重新同步年代pan>
开始年代pan>
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
>年代pan>
pbm年代pan>
状态年代pan>
- - - - - -年代pan>
年代年代pan>
备份年代pan>
备份年代pan>
:年代pan>
= = =年代pan>
= = =年代pan>
= =年代pan>
FS年代pan>
/年代pan>
数据年代pan>
/年代pan>
pbm年代pan>
快照年代pan>
:年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
18年代pan>
:年代pan>
44 z年代pan>
28.23 kb年代pan>
<年代pan>
逻辑年代pan>
>年代pan>
(年代pan>
不兼容的年代pan>
:年代pan>
备份年代pan>
并年代pan>”<年代pan class="crayon-i">t年代pan>
匹配年代pan>
当前的年代pan>
集群年代pan>
拓扑结构年代pan>
- - - - - -年代pan>
它年代pan>
有年代pan>
不同的年代pan>
副本年代pan>
集年代pan>
的名字年代pan>
。年代pan>
额外的年代pan>
碎片年代pan>
在年代pan>
的年代pan>
备份年代pan>
将年代pan>
导致年代pan>
这年代pan>
,年代pan>
为年代pan>
一个年代pan>
简单的年代pan>
例子年代pan>
。年代pan>
的年代pan>
额外的年代pan>
/年代pan>
未知的年代pan>
副本年代pan>
集年代pan>
的名字年代pan>
发现年代pan>
在年代pan>
的年代pan>
备份年代pan>
是年代pan>
:年代pan>
额外的年代pan>
- - - - - -年代pan>
碎片年代pan>
,年代pan>
configsvr年代pan>
。年代pan>
备份年代pan>
有年代pan>
没有年代pan>
数据年代pan>
为年代pan>
的年代pan>
配置年代pan>
服务器年代pan>
或年代pan>
唯一的年代pan>
replicaset年代pan>
]年代pan>
(年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
18年代pan>
:年代pan>
49 z年代pan>
]年代pan>
|
正如所料,这是不符合新部署。年代pan>
了解如何使它工作年代pan>
解决PBM状态
|
1
2
3
4
5
6
7
8
|
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
>年代pan>
出口年代pan>
PBM_REPLSET_REMAPPING年代pan>
=年代pan>
“cfg = configsvr rs1 = extra-shard”年代pan>
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
>年代pan>
pbm年代pan>
状态年代pan>
- - - - - -年代pan>
年代年代pan>
备份年代pan>
备份年代pan>
:年代pan>
= = =年代pan>
= = =年代pan>
= =年代pan>
FS年代pan>
/年代pan>
数据年代pan>
/年代pan>
pbm年代pan>
快照年代pan>
:年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
18年代pan>
:年代pan>
44 z年代pan>
28.23 kb年代pan>
<年代pan>
逻辑年代pan>
>年代pan>
(年代pan>
完整的年代pan>
:年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
18年代pan>
:年代pan>
49 z年代pan>
]年代pan>
|
好了。现在我们可以恢复。年代pan>
恢复
|
1
2
3
4
|
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
>年代pan>
pbm年代pan>
恢复年代pan>
2022 - 06 - 15 t08:18:44z年代pan>
- - -年代pan>
等待年代pan>
开始年代pan>
恢复年代pan>
从年代pan>
2022 - 06 - 15 t08:18:44z年代pan>
。年代pan>
。年代pan>
。年代pan>
.Started年代pan>
逻辑年代pan>
恢复年代pan>
。年代pan>
等待年代pan>
来年代pan>
完成年代pan>
。年代pan>
。年代pan>
。年代pan>
。年代pan>
.Restore年代pan>
成功年代pan>
完成了年代pan>
!年代pan>
|
的年代pan>等待年代pan>国旗块shell会话,直到恢复完成。你不能等待但检查。年代pan>
|
1
2
3
4
|
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
>年代pan>
pbm年代pan>
列表年代pan>
- - -年代pan>
恢复年代pan>
恢复年代pan>
历史年代pan>
:年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
18年代pan>
:年代pan>
44 z年代pan>
|
到目前为止一切都很顺利。差不多做完了年代pan>
让我们验证数据。年代pan>
数据验证
|
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
|
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
>年代pan>
退出年代pan>
美元年代pan>
>年代pan>
目标年代pan>
/年代pan>
dbhash年代pan>
>年代pan>
目标年代pan>
/年代pan>
dbhash年代pan>
.out年代pan>
& &年代pan>
猫年代pan>
目标年代pan>
/年代pan>
dbhash年代pan>
.out年代pan>
# rs00:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
# rs01:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
# rs02:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
# rs10:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“4 a79c07e0cbf3c9076d6e2d81eb77f0a”年代pan>
}年代pan>
# rs11:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“4 a79c07e0cbf3c9076d6e2d81eb77f0a”年代pan>
}年代pan>
# rs12:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“4 a79c07e0cbf3c9076d6e2d81eb77f0a”年代pan>
}年代pan>
# rs20:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
}年代pan>
# rs21:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
}年代pan>
# rs22:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
}年代pan>
# rs00:27018 db.getSiblingDB .coll (“rsmap”)年代pan>
;年代pan>
(年代pan>
)年代pan>
.sort年代pan>
(年代pan>
{年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
.toArray年代pan>
(年代pan>
)年代pan>
.reduce年代pan>
(年代pan>
(年代pan>
(年代pan>
数年代pan>
=年代pan>
0年代pan>
,年代pan>
seq年代pan>
=年代pan>
真正的年代pan>
,年代pan>
下一个年代pan>
=年代pan>
1年代pan>
]年代pan>
,年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>
=年代pan>
>年代pan>
(年代pan>
数年代pan>
+年代pan>
1年代pan>
,年代pan>
seq年代pan>
& &年代pan>
下一个年代pan>
= =年代pan>
我年代pan>
,年代pan>
我年代pan>
+年代pan>
1年代pan>
]年代pan>
,年代pan>
(年代pan>
]年代pan>
)年代pan>
.slice年代pan>
(年代pan>
0年代pan>
,年代pan>
2年代pan>
)年代pan>
(年代pan>
520年年代pan>
,年代pan>
假年代pan>
]年代pan>
# rs10:27018 db.getSiblingDB .coll (“rsmap”)年代pan>
;年代pan>
(年代pan>
)年代pan>
.sort年代pan>
(年代pan>
{年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
.toArray年代pan>
(年代pan>
)年代pan>
.reduce年代pan>
(年代pan>
(年代pan>
(年代pan>
数年代pan>
=年代pan>
0年代pan>
,年代pan>
seq年代pan>
=年代pan>
真正的年代pan>
,年代pan>
下一个年代pan>
=年代pan>
1年代pan>
]年代pan>
,年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>
=年代pan>
>年代pan>
(年代pan>
数年代pan>
+年代pan>
1年代pan>
,年代pan>
seq年代pan>
& &年代pan>
下一个年代pan>
= =年代pan>
我年代pan>
,年代pan>
我年代pan>
+年代pan>
1年代pan>
]年代pan>
,年代pan>
(年代pan>
]年代pan>
)年代pan>
.slice年代pan>
(年代pan>
0年代pan>
,年代pan>
2年代pan>
)年代pan>
(年代pan>
480年年代pan>
,年代pan>
假年代pan>
]年代pan>
# rs20:27018 db.getSiblingDB .coll (“rsmap”)年代pan>
;年代pan>
(年代pan>
)年代pan>
.sort年代pan>
(年代pan>
{年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
.toArray年代pan>
(年代pan>
)年代pan>
.reduce年代pan>
(年代pan>
(年代pan>
(年代pan>
数年代pan>
=年代pan>
0年代pan>
,年代pan>
seq年代pan>
=年代pan>
真正的年代pan>
,年代pan>
下一个年代pan>
=年代pan>
1年代pan>
]年代pan>
,年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>
=年代pan>
>年代pan>
(年代pan>
数年代pan>
+年代pan>
1年代pan>
,年代pan>
seq年代pan>
& &年代pan>
下一个年代pan>
= =年代pan>
我年代pan>
,年代pan>
我年代pan>
+年代pan>
1年代pan>
]年代pan>
,年代pan>
(年代pan>
]年代pan>
)年代pan>
.slice年代pan>
(年代pan>
0年代pan>
,年代pan>
2年代pan>
)年代pan>
(年代pan>
]年代pan>
# mongo: 27017年代pan>
(年代pan>
1000年年代pan>
,年代pan>
真正的年代pan>
]年代pan>
|
链接:<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/target/dbhash">目标/ dbhash一个>,<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/target/dbhash.out">目标/ dbhash.out一个>
正如您可以看到的,年代pan>平日年代trong>碎片是空的。另外两个有相同的dbHash和quickcheck结果在初始集群。我认为均衡器可以告诉一些关于这个年代pan>
平衡状态年代pan>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
美元年代pan>
>年代pan>
mongosh年代pan>
“mongo: 27017”年代pan>
- - -年代pan>
安静的年代pan>
- - -年代pan>
eval年代pan>
“sh.balancerCollectionStatus (rsmap.coll)”年代pan>
{年代pan>
balancerCompliant年代pan>
:年代pan>
假年代pan>
,年代pan>
firstComplianceViolation年代pan>
:年代pan>
“chunksImbalance”年代pan>
,年代pan>
好吧年代pan>
:年代pan>
1年代pan>
,年代pan>
“clusterTime美元”年代pan>
:年代pan>
{年代pan>
clusterTime年代pan>
:年代pan>
时间戳年代pan>
(年代pan>
{年代pan>
t年代pan>
:年代pan>
1655281436年代pan>
,年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
,年代pan>
签名年代pan>
:年代pan>
{年代pan>
哈希年代pan>
:年代pan>
二进制年代pan>
(年代pan>
缓冲年代pan>
从今以后年代pan>
(年代pan>
“0000000000000000000000000000000000000000”年代pan>
,年代pan>
“六角”年代pan>
)年代pan>
,年代pan>
0年代pan>
)年代pan>
,年代pan>
keyId年代pan>
:年代pan>
长年代pan>
(年代pan>
“0”年代pan>
)年代pan>
}年代pan>
}年代pan>
,年代pan>
operationTime年代pan>
:年代pan>
时间戳年代pan>
(年代pan>
{年代pan>
t年代pan>
:年代pan>
1655281436年代pan>
,年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
}年代pan>
|
我们知道该做什么。再次启动均衡器和检查状态。年代pan>
|
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
美元年代pan>
>年代pan>
mongosh年代pan>
“mongo: 27017”年代pan>
- - -年代pan>
安静的年代pan>
- - -年代pan>
eval年代pan>
“sh.startBalancer()对吧”年代pan>
1年代pan>
美元年代pan>
>年代pan>
mongosh年代pan>
“mongo: 27017”年代pan>
- - -年代pan>
安静的年代pan>
- - -年代pan>
eval年代pan>
“sh.balancerCollectionStatus (rsmap.coll)”年代pan>
{年代pan>
balancerCompliant年代pan>
:年代pan>
真正的年代pan>
,年代pan>
好吧年代pan>
:年代pan>
1年代pan>
,年代pan>
“clusterTime美元”年代pan>
:年代pan>
{年代pan>
clusterTime年代pan>
:年代pan>
时间戳年代pan>
(年代pan>
{年代pan>
t年代pan>
:年代pan>
1655281457年代pan>
,年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
,年代pan>
签名年代pan>
:年代pan>
{年代pan>
哈希年代pan>
:年代pan>
二进制年代pan>
(年代pan>
缓冲年代pan>
从今以后年代pan>
(年代pan>
“0000000000000000000000000000000000000000”年代pan>
,年代pan>
“六角”年代pan>
)年代pan>
,年代pan>
0年代pan>
)年代pan>
,年代pan>
keyId年代pan>
:年代pan>
长年代pan>
(年代pan>
“0”年代pan>
)年代pan>
}年代pan>
}年代pan>
,年代pan>
operationTime年代pan>
:年代pan>
时间戳年代pan>
(年代pan>
{年代pan>
t年代pan>
:年代pan>
1655281457年代pan>
,年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
}年代pan>
美元年代pan>
>年代pan>
目标年代pan>
/年代pan>
dbhash年代pan>
>年代pan>
目标年代pan>
/年代pan>
dbhash年代pan>
- - - - - -年代pan>
2.年代pan>
& &年代pan>
猫年代pan>
目标年代pan>
/年代pan>
dbhash年代pan>
- - - - - -年代pan>
2.年代pan>
# rs00:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
# rs01:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
# rs02:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“550 f86eb459b4d43de7999fe465e39e0”年代pan>
}年代pan>
# rs10:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“4 a79c07e0cbf3c9076d6e2d81eb77f0a”年代pan>
}年代pan>
# rs11:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“4 a79c07e0cbf3c9076d6e2d81eb77f0a”年代pan>
}年代pan>
# rs12:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“4 a79c07e0cbf3c9076d6e2d81eb77f0a”年代pan>
}年代pan>
# rs20:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“6 a54e10a5526e0efea0d58b5e2fbd7c5”年代pan>
}年代pan>
# rs21:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“6 a54e10a5526e0efea0d58b5e2fbd7c5”年代pan>
}年代pan>
# rs22:27018 db.getSiblingDB (rsmap) .runCommand .collections (“dbHash”)年代pan>
{年代pan>
“科尔”年代pan>
:年代pan>
“6 a54e10a5526e0efea0d58b5e2fbd7c5”年代pan>
}年代pan>
# rs00:27018 db.getSiblingDB .coll (“rsmap”)年代pan>
;年代pan>
(年代pan>
)年代pan>
.sort年代pan>
(年代pan>
{年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
.toArray年代pan>
(年代pan>
)年代pan>
.reduce年代pan>
(年代pan>
(年代pan>
(年代pan>
数年代pan>
=年代pan>
0年代pan>
,年代pan>
seq年代pan>
=年代pan>
真正的年代pan>
,年代pan>
下一个年代pan>
=年代pan>
1年代pan>
]年代pan>
,年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>
=年代pan>
>年代pan>
(年代pan>
数年代pan>
+年代pan>
1年代pan>
,年代pan>
seq年代pan>
& &年代pan>
下一个年代pan>
= =年代pan>
我年代pan>
,年代pan>
我年代pan>
+年代pan>
1年代pan>
]年代pan>
,年代pan>
(年代pan>
]年代pan>
)年代pan>
.slice年代pan>
(年代pan>
0年代pan>
,年代pan>
2年代pan>
)年代pan>
(年代pan>
520年年代pan>
,年代pan>
假年代pan>
]年代pan>
# rs10:27018 db.getSiblingDB .coll (“rsmap”)年代pan>
;年代pan>
(年代pan>
)年代pan>
.sort年代pan>
(年代pan>
{年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
.toArray年代pan>
(年代pan>
)年代pan>
.reduce年代pan>
(年代pan>
(年代pan>
(年代pan>
数年代pan>
=年代pan>
0年代pan>
,年代pan>
seq年代pan>
=年代pan>
真正的年代pan>
,年代pan>
下一个年代pan>
=年代pan>
1年代pan>
]年代pan>
,年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>
=年代pan>
>年代pan>
(年代pan>
数年代pan>
+年代pan>
1年代pan>
,年代pan>
seq年代pan>
& &年代pan>
下一个年代pan>
= =年代pan>
我年代pan>
,年代pan>
我年代pan>
+年代pan>
1年代pan>
]年代pan>
,年代pan>
(年代pan>
]年代pan>
)年代pan>
.slice年代pan>
(年代pan>
0年代pan>
,年代pan>
2年代pan>
)年代pan>
(年代pan>
480年年代pan>
,年代pan>
假年代pan>
]年代pan>
# rs20:27018 db.getSiblingDB .coll (“rsmap”)年代pan>
;年代pan>
(年代pan>
)年代pan>
.sort年代pan>
(年代pan>
{年代pan>
我年代pan>
:年代pan>
1年代pan>
}年代pan>
)年代pan>
.toArray年代pan>
(年代pan>
)年代pan>
.reduce年代pan>
(年代pan>
(年代pan>
(年代pan>
数年代pan>
=年代pan>
0年代pan>
,年代pan>
seq年代pan>
=年代pan>
真正的年代pan>
,年代pan>
下一个年代pan>
=年代pan>
1年代pan>
]年代pan>
,年代pan>
{年代pan>
我年代pan>
}年代pan>
)年代pan>
=年代pan>
>年代pan>
(年代pan>
数年代pan>
+年代pan>
1年代pan>
,年代pan>
seq年代pan>
& &年代pan>
下一个年代pan>
= =年代pan>
我年代pan>
,年代pan>
我年代pan>
+年代pan>
1年代pan>
]年代pan>
,年代pan>
(年代pan>
]年代pan>
)年代pan>
.slice年代pan>
(年代pan>
0年代pan>
,年代pan>
2年代pan>
)年代pan>
(年代pan>
229年年代pan>
,年代pan>
假年代pan>
]年代pan>
# mongo: 27017年代pan>
(年代pan>
1000年年代pan>
,年代pan>
真正的年代pan>
]年代pan>
|
链接:<一个href="https://github.com/defbin/percona-blog/blob/main/pbm-rsmap/target/dbhash-2.out">目标/ dbhash - 2.年代pan>
有趣。年代pan>平日年代trong>碎片有一些数据。然而,年代pan>卢比年代trong>和年代pan>平日年代trong>没有改变。我们估计蒙戈一些块移动年代pan>平日年代trong>并更新路由器配置。物理上删除块碎片是一个单独的步骤。这就是为什么碎片上直接查询数据是不准确的。数据随时可能消失。光标返回所有可用的文档复制集目前尽管路由器配置。年代pan>
总之,我们不应该关心它了。现在蒙戈/ mongod责任更新路由器配置、查询正确的碎片,和删除移动块碎片的需求。最后,我们通过蒙戈有效数据。年代pan>
就是这样。年代pan>
但是等一下,我们不进行备份!永远不要忘记另一个可靠的备份。年代pan>
制作一个新的备份
更好地改变存储,这样我们会有备份的新部署在不同的地方,不会看到错误不兼容的备份进一步从最初的集群。年代pan>
|
1
2
3
4
5
6
7
8
9
10
|
美元年代pan>
>年代pan>
pbm年代pan>
配置年代pan>
- - -年代pan>
文件年代pan>
“NEW_PBM_CONFIG美元”年代pan>
>年代pan>
/年代pan>
dev年代pan>
/年代pan>
零年代pan>
美元年代pan>
>年代pan>
pbm年代pan>
配置年代pan>
- - -年代pan>
力年代pan>
- - - - - -年代pan>
重新同步年代pan>
>年代pan>
/年代pan>
dev年代pan>
/年代pan>
零年代pan>
美元年代pan>
>年代pan>
pbm年代pan>
备份年代pan>
- - - - - -年代pan>
w年代pan>
>年代pan>
/年代pan>
dev年代pan>
/年代pan>
零年代pan>
pbm年代pan>
- - - - - -年代pan>
cfg0年代pan>
>年代pan>
pbm年代pan>
状态年代pan>
- - - - - -年代pan>
年代年代pan>
备份年代pan>
备份年代pan>
:年代pan>
= = =年代pan>
= = =年代pan>
= =年代pan>
FS年代pan>
/年代pan>
数据年代pan>
/年代pan>
pbm年代pan>
快照年代pan>
:年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
25年代pan>
:年代pan>
44 z年代pan>
165.34 kb年代pan>
<年代pan>
逻辑年代pan>
>年代pan>
(年代pan>
完整的年代pan>
:年代pan>
2022年年代pan>
- - - - - -年代pan>
06年代pan>
- - - - - -年代pan>
15 t08年代pan>
:年代pan>
25年代pan>
:年代pan>
49 z年代pan>
]年代pan>
|
现在我们完成了。并且可以睡得更好。年代pan>
一件事:可能的错误配置
让我们回顾一下另一个形象来解释所有可能的错误。年代pan>
初始集群:年代pan>cfg年代trong>,<年代trong>rs0年代trong>,<年代trong>卢比年代trong>,<年代trong>平日年代trong>,<年代trong>rs3年代trong>,<年代trong>卢比年代trong>,<年代trong>的生活费年代trong>
目标集群:年代pan>rs3卢比,cfg、rs0 rs1,卢比,rs6年代trong>
如果我们申请重新映射:年代pan>”<年代trong>rs0 = rs0 rs1 =卢比,卢比= rs1 rs3 =卢比年代trong>”年代pan>,我们会错误年代pan>“错过了replset:<年代trong>rs3年代trong>,<年代trong>的生活费年代trong>”年代pan>。和对年代pan>rs6年代trong>。
错过的年代pan>的生活费年代trong>应该是显而易见的:备份拓扑年代pan>的生活费年代trong>复制集,但错过了目标。和目标年代pan>rs6年代trong>没有数据恢复。添加年代pan>rs6 =生活费年代trong>修复这个问题。年代pan>
但是错过了年代pan>rs3年代trong>可能会让人困惑。让我们设想:年代pan>
|
1
2
3
4
5
6
7
8
9
10
11
|
初始化年代pan>
|年代pan>
咕咕叫年代pan>
- - -年代pan>
- - -年代pan>
- - - - - -年代pan>
+年代pan>
- - -年代pan>
- - -年代pan>
- - - - - -年代pan>
cfg年代pan>
cfg年代pan>
#不变年代pan>
rs0年代pan>
- - -年代pan>
>年代pan>
rs0年代pan>
#映射。不变年代pan>
卢比年代pan>
- - -年代pan>
>年代pan>
平日年代pan>
平日年代pan>
- - -年代pan>
>年代pan>
卢比年代pan>
rs3年代pan>
- - -年代pan>
>年代pan>
#犯错:没有碎片年代pan>
卢比年代pan>
- - -年代pan>
>年代pan>
rs3年代pan>
- >年代pan>
卢比年代pan>
#好:没有数据年代pan>
的生活费年代pan>
- - -年代pan>
>年代pan>
#犯错:没有碎片年代pan>
- >年代pan>
rs6年代pan>
#好:没有数据年代pan>
|
当我们重新映射的备份年代pan>卢比年代trong>来年代pan>rs3年代trong>,目标年代pan>rs3年代trong>是保留。的年代pan>rs3年代trong>在备份replset现在没有目标。只是重新映射年代pan>rs3年代trong>可用年代pan>卢比年代pan>也会修复它。年代pan>
这个预订避免数据重复。这就是为什么我们使用通过蒙戈快速检查。年代pan>
细节
兼容的拓扑
简单地说,年代pan>兼容的拓扑年代pan>等于或者更多的碎片在目标部署。在我们的示例中,我们最初的2碎片但是恢复他们3碎片。PBM恢复数据只在两个碎片。MongoDB可以分配剩下的碎片后,启用了均衡器(年代pan>sh.startBalancer ()年代trong>)。复制集成员的数量并不重要因为PBM需要备份的成员(每replset)和恢复主要只。其他data-bearing成员从主复制数据。所以你可以做一个备份从三月replset replset然后恢复到一个成员。年代pan>
你不能恢复到另一个从replset类型shardsvr来configsvr。年代pan>
预配置环境
集群部署应该与所有碎片补充道。应该添加用户和权限以及提前分配。PBM代理应该配置为相同的存储和访问它的新的集群。年代pan>
注意:PBM代理备份元数据存储在存储和保持缓存MongoDB。年代pan>pbm配置-force-resync年代pan>让你刷新缓存的存储。做一个新的集群部署之后看到备份/ oplog块由最初的集群。年代pan>
理解replset重新映射
你可以重新映射复制集的名称<年代trong>-replset-remapping年代trong>标志或年代pan>PBM_REPLSET_REMAPPING年代trong>环境变量。如果两组,国旗有优先级。年代pan>
完全恢复,恢复时间点和oplog回放,PBM CLI发出命令映射作为一个参数。每个命令被一个单独的显式映射(或没有)。这是可以做到的只有CLI。代理不使用环境变量也不标记。年代pan>
pbm状态年代pan>和年代pan>pbm列表年代pan>使用国旗/ envvar重新映射replset备份/ oplog元数据和应用这种映射到当前部署适当的给他们看。如果备份和复制集的名称不匹配,年代pan>pbm列表年代trong>不会显示这些备份,年代pan>pbm状态年代trong>打印一个错误与错过的复制集的名称。年代pan>
恢复和重新映射与逻辑备份。年代pan>
PBM如何做呢?
在恢复期间,PBM评论当前拓扑和分配成员的快照和oplog块碎片/复制集的名字,分别。重新映射更改默认的赋值。年代pan>
恢复完成后,PBM代理路由器配置的同步恢复数据“本地”这个集群。年代pan>
后面的场景
的<年代trong>config.shards年代trong>收集当前拓扑描述。PBM用它来知道和恢复。不修改集合PBM。但是恢复数据包含一些其他的路由器配置初始拓扑。年代pan>
我们更新了两个集合与新的取代旧的碎片名字恢复数据:年代pan>
- config.databases年代trong>——主碎片non-sharded数据库年代pan>
- config.chunks年代trong>——块碎片年代pan>
在这之后,MongoDB知道数据库、集合和块新的集群。年代pan>
结论
迁移集群需要关注,知识,和平静。MongoDB的replset-remapping Percona备份功能在两雷竞技下载官网种不同环境之间迁移降低复杂性。年代pan>我想说,现在是接近一次例行的工作。年代pan>
祝你有美好的一天年代pan>吗?年代pan>
雷竞技下载官网为MongoDB Percona备份一个>(PBM)是一个分布式备份和恢复工具,分片和non-sharded集群。在1.8.0,我们添加了replset-remapping功能允许您恢复数据新兼容的集群拓扑。
想要每周更新清单的最新博客文章?
现在订阅,我们将送你一个更新每周五下午1点等。
相关的博客文章
推荐的文章
2023年8月4日
伊夫•特鲁多一个>
自定义Perc雷竞技下载官网oraybet雷竞技竞猜在线官网na监视和管理仪表板
2023年8月4日
彼得•扎伊采夫一个>
数据库服务器为MySQL和MariaDB生命周期
2023年8月2日,
大卫·斯托克斯一个>
MySQL 5.7到8.0的升级——就地或逻辑升级?
最受欢迎文章
2023年6月20日
谢尔盖Pronin一个>
上部署Django Kubernetes PostgreSQL P雷竞技下载官网ercona运营商
2023年2月10日
马塞洛•阿尔特曼一个>
雷竞技下载官网Percona XtraBackup现在支持我实例配置文件
2023年3月15日
谢尔盖Pronin一个>和<一个href="//m.doggingzone.com/blog/author/ege-gunes" class="co-author-display-name">针对枪一个>
自动化Kubernetes MongoDB的物理备份