- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MongoDB 主分片(primary shard)相关总结由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
01 主分片是什么?
分片集群中的每一个数据库都有一个主分片,这个主分片上保存了当前数据库中没有被分片的集合的数据,主分片(primary shard)和主节点(primary)之间没有任何关联.
主分片是由mongos选择出来的,选择的依据是每当创建新数据库的时候,mongos会从集群中选择包含数据最少的分片作为新数据库的主分片。具体的选择方式是:
选择listdatabase命令返回的totalsize字段作为选择的准则。如下:
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
|
mongos> db.admincommand(
"listdatabases"
)
{
"databases"
: [
{
xxxx
},
{
xxxx
},
{
xxxx
}
],
"totalsize"
: 2842624,
"totalsizemb"
: 2,
"ok"
: 1,
"operationtime"
:
timestamp
(1610982469, 1),
"$clustertime"
: {
"clustertime"
:
timestamp
(1610982469, 1),
"signature"
: {
"hash"
: bindata(0,
"knqdzrxpygfdsi0gljxcqg4lj9u="
),
"keyid"
: numberlong(
"6894922308364795934"
)
}
}
}
|
如果我们想手工的选择某个数据库的主分片,可以使用moveprimary命令,迁移主分片的过程会耗费一定的时间,在迁移完成之前,不应该对数据库或者对应的集合进行访问。迁移过程可能会影响整个集群的操作,所以这个命令一般不要主动去使用,如果必须使用,请务必考虑对网络负载的影响.
如果你部署的一个分片集群是由一个副本集修改配置而来的,那么副本集上原来的那些数据库的主分片将会继续留在原来的副本集上,之后创建的数据库才可以将主分片设置在其他分片上.
02 如何迁移主分片 。
下面我们演示如何使用moveprimary命令来迁移数据库的主分片.
首先,我们来看,当前new数据库的test集合的主分片在sharding_yeyz这个分片上。它就是new.test的主分片,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
mongos> sh.status()
--- sharding status ---
shards:
{
"_id"
:
"sharding_yeyz"
,
"host"
:
"sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020"
,
"state"
: 1,
"tags"
: [
"1_1000"
] }
{
"_id"
:
"sharding_yeyz1"
,
"host"
:
"sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026"
,
"state"
: 1,
"tags"
: [
"1000_"
,
"1000_2000"
] }
databases:
...
{
"_id"
:
"new"
,
"primary"
:
"sharding_yeyz"
,
"partitioned"
:
true
,
"version"
: {
"uuid"
: uuid(
"68c70c64-f732-4478-8851-06dad4b94d6b"
),
"lastmod"
: 1 } }
new.test
shard
key
: {
"number"
: 1 }
unique
:
false
balancing:
true
chunks:
sharding_yeyz 3
sharding_yeyz1 1
{
"number"
: {
"$minkey"
: 1 } }
-->> { "number" : 1 } on : sharding_yeyz timestamp(2, 1)
{
"number"
: 1 }
-->> { "number" : 1000 } on : sharding_yeyz timestamp(1, 2)
{
"number"
: 1000 }
-->> { "number" : 2000 } on : sharding_yeyz1 timestamp(2, 0)
{
"number"
: 2000 }
-->> { "number" : { "$maxkey" : 1 } } on : sharding_yeyz timestamp(1, 5)
tag: 1_1000 {
"number"
: 1 }
-->> { "number" : 1000 }
tag: 1000_2000 {
"number"
: 1000 }
-->> { "number" : 2000 }
|
接下来我们使用moveprimary命令,使用之前,我们需要知道它的执行过程:
1、首先在集群元数据中修改主分片信息 。
2、然后移动所有的没有分片的集合到指定的主分片中 。
**它只能在mongos上执行.
命令的用法是:
1
2
3
4
|
db.admincommand( { moveprimary: <databasename>,
to
: <newprimaryshard> } )
举例:
db.admincommand( { moveprimary :
"new"
,
to
:
"sharding_yeyz1"
} )
|
我们执行完:
db.admincommand( { moveprimary : "new", to : "sharding_yeyz1" } ) 。
之后,结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
mongos> sh.status()
--- sharding status ---
shards:
{
"_id"
:
"sharding_yeyz"
,
"host"
:
"sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020"
,
"state"
: 1,
"tags"
: [
"1_1000"
] }
{
"_id"
:
"sharding_yeyz1"
,
"host"
:
"sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026"
,
"state"
: 1,
"tags"
: [
"1000_"
,
"1000_2000"
] }
databases:
{
"_id"
:
"new"
,
"primary"
:
"sharding_yeyz1"
,
"partitioned"
:
true
,
"version"
: {
"uuid"
: uuid(
"68c70c64-f732-4478-8851-06dad4b94d6b"
),
"lastmod"
: 2 } }
new.test
shard
key
: {
"number"
: 1 }
unique
:
false
balancing:
true
chunks:
sharding_yeyz 3
sharding_yeyz1 1
{
"number"
: {
"$minkey"
: 1 } }
-->> { "number" : 1 } on : sharding_yeyz timestamp(2, 1)
{
"number"
: 1 }
-->> { "number" : 1000 } on : sharding_yeyz timestamp(1, 2)
{
"number"
: 1000 }
-->> { "number" : 2000 } on : sharding_yeyz1 timestamp(2, 0)
{
"number"
: 2000 }
-->> { "number" : { "$maxkey" : 1 } } on : sharding_yeyz timestamp(1, 5)
tag: 1_1000 {
"number"
: 1 }
-->> { "number" : 1000 }
tag: 1000_2000 {
"number"
: 1000 }
-->> { "number" : 2000 }
|
可以看到,主分片已经迁移完成了.
以上就是mongodb 主分片(primary shard)相关总结的详细内容,更多关于mongodb 主分片(primary shard)的资料请关注我其它相关文章! 。
原文链接:https://cloud.tencent.com/developer/article/1778809 。
最后此篇关于MongoDB 主分片(primary shard)相关总结的文章就讲到这里了,如果你想了解更多关于MongoDB 主分片(primary shard)相关总结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我听说过两种数据库架构。 大师级 主从 master-master不是更适合现在的web吗,因为它就像Git一样,每个单元都有整套数据,如果一个宕机也无所谓。 主从让我想起了 SVN(我不喜欢它),你
我们当前将 MySQL 配置为支持故障转移:Site1 Site2。当它们被设置为主/主时。在给定时间点,应用程序服务器仅主动写入一个站点。我们想要设置一个新的故障转移站点。然后我们将拥有 Site
我听说过两种数据库架构。 大师-大师 主从 master-master 不是更适合当今的网络吗,因为它就像 Git,每个单元都有整套数据,如果其中一个发生故障,也没关系。 主从让我想起 SVN(我不喜
我正在创建一个标记为类别的表,其中主类别(父列)包含 0,子类别包含父类别的 ID。我听说这叫引用。我的问题:这张表的结构正确吗?或者是否有更好的方法,例如实现遍历树或类似方法? CREATE TAB
我正在阅读一份关于 C++ 与 C 的文档。该文档说与 C 相比,C++ 编写得非常紧凑。一个例子是,C 允许 main() 函数类型为 void。另一方面,C++ 不允许这样做,他给出了标准中的以下
C main函数和Java main函数有什么区别? int main( int argc, const char* argv[] ) 对比 public static void main(Strin
我一直摸不着头脑,但运气不好。设计器有一个包含 3 栏的站点、两个侧边栏和一个主要内容区域。 专为桌面设计,左栏、主要内容、右栏。但是,在较小的设备上,我们希望首先堆叠主要内容。 所以通常情况下,你可
我一直在阅读有关 Jenkins 主/从配置的信息,但我仍然有一些问题: 是不是真的没有像 Jenkins 主站那样安装和启动从站 Jenkins?我假设我会以相同的方式安装一个主 Jenkins 和
据我了解,Viemodel中MVVM背后的概念包括业务逻辑和/或诸如暴露于 View 的数据的主/明细关系之类的事物 因此,正如我发现的那样,有很多ORM生成器,例如模型的telerik a.o以及另
我们有一个群集,其中包含3个主分区,每个主分区有2个副本。主/副本分片的总文档数相同;但是,对于同一查询/文档,我们得到3个不同的分数。当我们将preference = primary添加为查询参数时
我有一个非常大/旧/长时间运行的项目,它使用相对于启动目录的路径访问文件资源(即应用程序仅在从特定目录启动时才工作)。当我需要调试程序时,我可以从 eclipse 启动它并使用“运行配置”->->“工
谁能向我解释一下为什么我在这段代码上遇到段错误?我一直试图弄清楚这一点,但在各种搜索中却一无所获。当我运行代码而不调用 main(argc, argv) 时,它会运行。 Slave 仅将 argv 中
使用 xcode 中的默认项目作为主从应用程序,如果我在折叠委托(delegate)中放置 print 调试语句,当我旋转设备时它似乎永远不会被触发(事实上我永远无法触发它)。 我编辑的代码位于 Ap
是否有任何产品可以使 mysql 主/从故障转移过程更容易?一些可以自动发生的事情,而不是手动修复它。 最佳答案 [...稍后...;) 你所说的“更容易”是什么?MySQL 有很多解决方案: MyS
我有两个 mysql 数据库。我想做主/主复制。 复制以一种方式进行。然而,反过来说却不然。该错误表明它无法与用户“test@IPADDRESS”连接。 如何将用户名更改为 repl?从未进行过测试,
我正在尝试在 MySQL 中运行以下查询: GRANT REPLICATION SLAVE ON *.* TO 'replication'@’10.141.2.%’ IDENTIFIED BY ‘sl
我正在尝试使用 Android 提供的主/详细流程模板创建一个应用程序,并且我正在尝试将多个操作栏菜单项添加到操作栏的主要部分和详细信息部分。这就是我要实现的目标: (来源:softwarecrew.
我正在寻找一个跨平台的 C++ master/worker 库或工作队列库。一般的想法是我的应用程序将创建某种任务或工作对象,将它们传递给工作主机或工作队列,这将依次在单独的线程或进程中执行工作。为了
我似乎看到很多人在他们的 MySQL 模式中任意分配大尺寸的主/外键字段,例如 INT(11) 甚至 WordPress 使用的 BIGINT(20)。 如果我错了,请纠正我,但即使是 INT(4)
如果我有一个可以与多个键相关联的用户,正确的表设置应该是: 一个表有两列,例如: UserName | Key 没有主键且用户可以有多行,或者: 具有匹配标识符的两个表 Table 1 Us
我是一名优秀的程序员,十分优秀!