iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >如何为MongoDB添加分片副本集
  • 734
分享到

如何为MongoDB添加分片副本集

2024-04-02 19:04:59 734人浏览 薄情痞子
摘要

目录01 新建副本集02 副本集添加到已有的集群中(addShard)03 添加分片时间标签(addShardTag)04 给打好的标签添加具体的数值范围(addTagRange)0

   背景是这样的:线上一个mongoDB集群保存了很多历史数据,这些历史数据是按照时间字段进行分片的,最近到了2021年,有些分片的截止时间要到了,为了能容纳更多的数据,需要在当前分片的基础上增加相应的分片。

   线上环境中,每个分片本身也是一个3副本的副本集,所以添加的时候有些特定的流程需要注意,我再测试环境中简单测了一下这个过程,记录下来。

    整个过程大概的流程是:

1、新建分片副本集

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

3、使用addShardTag命令为分片打标签

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

   目前测试环境的架构是:

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端口加入到集群中。到这里架构会变成:

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添加分片副本集的详细内容,更多关于为MongoDB添加分片副本集的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何为MongoDB添加分片副本集

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

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

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

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

下载Word文档
猜你喜欢
  • 如何为MongoDB添加分片副本集
    目录01 新建副本集02 副本集添加到已有的集群中(addShard)03 添加分片时间标签(addShardTag)04 给打好的标签添加具体的数值范围(addTagRange)0...
    99+
    2024-04-02
  • 怎么在MongoDB中添加分片副本集
    这篇文章将为大家详细讲解有关怎么在MongoDB中添加分片副本集,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。流程:新建分片副本集使用addShard命令将分片副本集添加到集群中使用addS...
    99+
    2023-06-14
  • mongodb副本集如何添加删除节点
    这期内容当中小编将会给大家带来有关mongodb副本集如何添加删除节点,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。环境介绍:三个节点的mongodb 副本集10.9.2...
    99+
    2024-04-02
  • MongoDB如何删除添加副本集并修改副本集IP等信息
    本篇文章为大家展示了MongoDB如何删除添加副本集并修改副本集IP等信息,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MongoDB 删除,添加副本集,并修改副本...
    99+
    2024-04-02
  • MongoDB副本集如何添加和删除仲裁节点
    小编给大家分享一下MongoDB副本集如何添加和删除仲裁节点,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • MongoDB 使用副本集备份添加新的辅助副本成员
    问题描述: 在生产环境中,当辅助副本成员的读压力很大时,可通过添加新的辅助副本成员来缓解压力。为了能实现主副本成员不停机,并减轻主副本成员的压力,可在辅助副本成员上mongodump备份数据;为了...
    99+
    2024-04-02
  • Mongodb中怎么实现副本集和分片
    这篇文章将为大家详细讲解有关Mongodb中怎么实现副本集和分片,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python只用mongo事务在python中...
    99+
    2024-04-02
  • mongodb如何更换副本集
    要更换MongoDB副本集,需要遵循以下步骤:1. 添加新副本集成员:首先,在新服务器上安装MongoDB,并确保它可以连接到现有的...
    99+
    2023-08-23
    mongodb
  • MongoDB副本集的示例分析
    小编给大家分享一下MongoDB副本集的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实验环境使用的Mongodb版本为...
    99+
    2024-04-02
  • Linux下如何配置MongoDB副本集
    这篇文章给大家分享的是有关Linux下如何配置MongoDB副本集的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据...
    99+
    2023-06-27
  • 如何进行MongoDB副本集搭建
    如何进行MongoDB副本集搭建,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们之前的案例都是在单个节点上实现的,在生产环境中这种做法是有风险的,如果服务宕机...
    99+
    2023-06-19
  • MongoDB中副本集的示例分析
    这篇文章主要介绍了MongoDB中副本集的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:replication set复制...
    99+
    2024-04-02
  • 【Mongodb】往分片复制集添加复制成员
    1.新的成员机器上安装mongo,启动shard1 [root@ip-10-1-2-183 etc]# more shard1.conf logpath=/usr/l...
    99+
    2024-04-02
  • mongodb副本集用一致性快照方法添加从节点步骤
    环境描述 主节点 192.168.0.1:27002 两个从节点 192.168.0.2:27002 192.168.0.3:27002 目标:用一致性快照方式添加第三个从节点192.168...
    99+
    2024-04-02
  • MongoDB访问控制的副本集如何部署
    这篇文章主要介绍了MongoDB访问控制的副本集如何部署的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MongoDB访问控制的副本集如何部署文章都会有所收获,下面我们一起来看看吧。版本及环境 MongoDB4....
    99+
    2023-06-29
  • MongoDB副本集分片集群一分片config库主机断电导致该分片config库无法启动怎么办
    这篇文章给大家分享的是有关MongoDB副本集分片集群一分片config库主机断电导致该分片config库无法启动怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。由于机房意外...
    99+
    2024-04-02
  • MongoDB如何修改副本集节点的优先值
    这篇文章主要介绍MongoDB如何修改副本集节点的优先值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 复制集节点的优先级影响了 elections 的...
    99+
    2024-04-02
  • MongoDB中副本集丢失数据的示例分析
    这篇文章主要为大家展示了“MongoDB中副本集丢失数据的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MongoDB中副本集丢失数据的示例分析”这篇文...
    99+
    2024-04-02
  • Elasticsearch节点、集群、分片及副本是什么
    这篇文章主要讲解了“Elasticsearch节点、集群、分片及副本是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Elasticsearch节点、集群、分片及副本是什么”吧!Elast...
    99+
    2023-06-28
  • mongodb3.4集群搭建实战之高可用的分片+副本集
    前言 最近因为工作的原因,在学习使用mongodb数据库,mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群,分享出来供大...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作