iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在MongoDB中添加分片副本集
  • 103
分享到

怎么在MongoDB中添加分片副本集

2023-06-14 07:06:40 103人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关怎么在MongoDB中添加分片副本集,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。流程:新建分片副本集使用addShard命令将分片副本集添加到集群中使用addS

这篇文章将为大家详细讲解有关怎么在MongoDB中添加分片副本集,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

流程:

新建分片副本集

使用addShard命令将分片副本集添加到集群

使用addShardTag命令为分片打标签

使用addTagRange命令为打好标签的分片设置片键的数值区间,注意,各个分片的数值区间不能有重复。

   目前测试环境的架构是:

怎么在MongoDB中添加分片副本集

01 新建副本集

   由于我们即将加入集群的分片是一个副本集,因此,需要提前将这个副本集创建好,创建的过程相对比较容易,按照之前的步骤来进行搭建,这里给出链接:

mongoDB 副本集的搭建

02 副本集添加到已有的集群中(addShard)

   这一步也比较简单,可以直接在monGos上的admin数据库使用命令addShard即可:

db.runCommand({addShard:"sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026"})

当然,你也可以直接使用db.adminCommand命令来代替db.runCommand命令,这两个命令的区别是adminCommand命令默认是在admin数据库下面执行的,而runCommand默认的是当前数据库。

上面的命令,将本地的:

27024、27025、27026端口加入到集群中。到这里架构会变成:

怎么在MongoDB中添加分片副本集

03 添加分片时间标签(addShardTag)

     分片加入到集群之后,还需要对分片添加Tag,添加Tag的目的,是让我们知道,当前分片上保留的业务数据是哪一个时间段的。在测试环境中,我使用1_1000和1000_2000这两个tag来测试,命令如下:

sh.addShardTag("sharding_yeyz", "1_1000")sh.addShardTag("sharding_yeyz1", "1000_2000")

对上面的命令简单进行解释,其中:

sharding_yeyz和sharding_yeyz1是分片副本集的名称;

1_1000和1000_2000是tag的名称。

添加完毕之后,我们可以通过系统的config库下面的tag表看到tag的情况,如下:

mongos> db.shards.find(){ "_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_2000" ] }

04 给打好的标签添加具体的数值范围(addTagRange)

   设定好标签之后,需要设置每个标签所代表的分片上具体的数值范围,这就要用到addTagRange函数,使用方法如下:

sh.addTagRange( "new.test",  { number: 1},  { number: 1000},  "1_1000"  )sh.addTagRange( "new.test",  { number: 1000},  { number: 2000},  "1000_2000"  )

注意,这里数值范围是指分片的那个集合的片键的数值范围。

分片永远是针对集合说的。

上面的命令是说,我们对数据库new下面的test集合做了分片,它的片键值是number这个字段:

当number属于[1,1000)的时候,该文档存放在tag是"1_1000"的这个分片上,也就是sharding_yeyz;

当number属于[1000,2000)的时候,该文档存放在tag是"1000_2000"的这个分片上,也就是sharding_yeyz1;

注意,区间为左闭右开。

05 查看结果

    添加分片并设置分片的数值范围之后,我们可以使用:

db.printShardingStatus()命令或者sh.status()命令来查看当前集群中的分片情况:

mongos> sh.status()--- Sharding Status ---  sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5fafaf4f5785d9965548f687") } 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" ] } active mongoses: "4.0.6" : 1 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours:   No recent migrations databases: { "_id" : "config", "primary" : "config", "partitioned" : true }  config.system.sessions   shard key: { "_id" : 1 }   unique: false   balancing: true   chunks:    sharding_yeyz 1   { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 0)  { "_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 }

到了这里,我们开始验证最终的结果,先通过下面的命令生成一组测试数据,如下:

for (var i=1 ;i<=2000 ; i++){ db.test.insert({"number":i})}

去查看每个分片上的内容,可以发现:

sharding_yeyz

sharding_yeyz:PRIMARY> db.test.find().sort({"number":-1}){ "_id" : ObjectId("5ffc051dd4c416daac620af5"), "number" : 2000 }{ "_id" : ObjectId("5ffc0511d4c416daac620325"), "number" : 2000 }{ "_id" : ObjectId("5ffc051bd4c416daac62070c"), "number" : 999 }{ "_id" : ObjectId("5ffc050fd4c416daac61ff3c"), "number" : 999 }{ "_id" : ObjectId("5ffc051bd4c416daac62070b"), "number" : 998 }{ "_id" : ObjectId("5ffc050fd4c416daac61ff3b"), "number" : 998 }{ "_id" : ObjectId("5ffc051bd4c416daac62070a"), "number" : 997 }{ "_id" : ObjectId("5ffc050fd4c416daac61ff3a"), "number" : 997 }{ "_id" : ObjectId("5ffc051bd4c416daac620709"), "number" : 996 }{ "_id" : ObjectId("5ffc050fd4c416daac61ff39"), "number" : 996 }{ "_id" : ObjectId("5ffc051bd4c416daac620708"), "number" : 995 }

    这里需要注意,为什么2000这个值还是出现在分片一上呢?

这个原因是在设置分片的数值范围的时候,我们设置的区间是左闭右开的。而我们设置的分片范围分别是[1,1000)和[1000,2000),因此2000这个数字就被随机分配到这两个分片中,实际的情况是,它被分配到了分片一中。

sharding_yeyz1

sharding_yeyz1:PRIMARY> db.test.find().sort({"number":-1}){ "_id" : ObjectId("5ffc051dd4c416daac620af4"), "number" : 1999 }{ "_id" : ObjectId("5ffc0511d4c416daac620324"), "number" : 1999 }{ "_id" : ObjectId("5ffc051dd4c416daac620af3"), "number" : 1998 }{ "_id" : ObjectId("5ffc0511d4c416daac620323"), "number" : 1998 }{ "_id" : ObjectId("5ffc051dd4c416daac620af2"), "number" : 1997 }{ "_id" : ObjectId("5ffc0511d4c416daac620322"), "number" : 1997 }{ "_id" : ObjectId("5ffc051dd4c416daac620af1"), "number" : 1996 }{ "_id" : ObjectId("5ffc0511d4c416daac620321"), "number" : 1996 }{ "_id" : ObjectId("5ffc051dd4c416daac620af0"), "number" : 1995 }{ "_id" : ObjectId("5ffc0511d4c416daac620320"), "number" : 1995 }{ "_id" : ObjectId("5ffc051dd4c416daac620aef"), "number" : 1994 }{ "_id" : ObjectId("5ffc0511d4c416daac62031f"), "number" : 1994 }{ "_id" : ObjectId("5ffc051dd4c416daac620aee"), "number" : 1993 }{ "_id" : ObjectId("5ffc0511d4c416daac62031e"), "number" : 1993 }{ "_id" : ObjectId("5ffc051dd4c416daac620aed"), "number" : 1992 }{ "_id" : ObjectId("5ffc0511d4c416daac62031d"), "number" : 1992 }

关于怎么在MongoDB中添加分片副本集就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在MongoDB中添加分片副本集

本文链接: https://www.lsjlt.com/news/269121.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作