• 售前

  • 售后

热门帖子
入门百科

如作甚MongoDB添加分片副本集

[复制链接]
阿豆学长长ov 显示全部楼层 发表于 2021-8-14 14:57:05 |阅读模式 打印 上一主题 下一主题
目次


  • 01 新建副本集
  • 02 副本集添加到已有的集群中(addShard)
  • 03 添加分片时间标签(addShardTag)
  • 04 给打好的标签添加详细的数值范围(addTagRange)
  • 05 查看结果
   背景是如许的:线上一个MongoDB集群生存了许多汗青数据,这些汗青数据是按照时间字段举行分片的,近来到了2021年,有些分片的截止时间要到了,为了能容纳更多的数据,须要在当前分片的基础上增加相应的分片。
   线上环境中,每个分片本身也是一个3副本的副本集,以是添加的时间有些特定的流程须要注意,我再测试环境中简单测了一下这个过程,纪录下来。
    整个过程大概的流程是:
1、新建分片副本集
2、利用addShard命令将分片副本集添加到集群中
3、利用addShardTag命令为分片打标签
4、利用addTagRange命令为打好标签的分片设置片键的数值区间,注意,各个分片的数值区间不能有重复。
   如今测试环境的架构是:


01 新建副本集

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

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

   这一步也比力简单,可以直接在mongos上的admin数据库利用命令addShard即可:
  1. 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来测试,命令如下:
  1. sh.addShardTag("sharding_yeyz", "1_1000")
  2. sh.addShardTag("sharding_yeyz1", "1000_2000")
复制代码
对上面的命令简单举行表明,其中:
sharding_yeyz和sharding_yeyz1是分片副本集的名称;
1_1000和1000_2000是tag的名称。
添加完毕之后,我们可以通过体系的config库下面的tag表看到tag的环境,如下:
  1. mongos> db.shards.find()
  2. { "_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" ] }
  3. { "_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函数,利用方法如下:
  1. sh.addTagRange( "new.test",
  2.   { number: 1},
  3.   { number: 1000},
  4.   "1_1000"
  5.   )
  6. sh.addTagRange( "new.test",
  7.   { number: 1000},
  8.   { number: 2000},
  9.   "1000_2000"
  10.   )
复制代码
注意,这里数值范围是指分片的谁人集合的片键的数值范围。
分片永久是针对集合说的。
上面的命令是说,我们对数据库new下面的test集合做了分片,它的片键值是number这个字段:
当number属于[1,1000)的时间,该文档存放在tag是"1_1000"的这个分片上,也就是sharding_yeyz;
当number属于[1000,2000)的时间,该文档存放在tag是"1000_2000"的这个分片上,也就是sharding_yeyz1;
注意,区间为左闭右开。

05 查看结果

    添加分片并设置分片的数值范围之后,我们可以利用:
db.printShardingStatus()命令或者sh.status()命令来查看当前集群中的分片环境:
  1. mongos> sh.status()
  2. --- Sharding Status ---
  3. sharding version: {
  4. "_id" : 1,
  5. "minCompatibleVersion" : 5,
  6. "currentVersion" : 6,
  7. "clusterId" : ObjectId("5fafaf4f5785d9965548f687")
  8. }
  9. shards:
  10. { "_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" ] }
  11. { "_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" ] }
  12. active mongoses:
  13. "4.0.6" : 1
  14. autosplit:
  15. Currently enabled: yes
  16. balancer:
  17. Currently enabled: yes
  18. Currently running: no
  19. Failed balancer rounds in last 5 attempts: 0
  20. Migration Results for the last 24 hours:
  21.   No recent migrations
  22. databases:
  23. { "_id" : "config", "primary" : "config", "partitioned" : true }
  24.   config.system.sessions
  25.    shard key: { "_id" : 1 }
  26.    unique: false
  27.    balancing: true
  28.    chunks:
  29.     sharding_yeyz 1
  30.    { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 0)
  31. { "_id" : "new", "primary" : "sharding_yeyz", "partitioned" : true, "version" : { "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 1 } }
  32.   new.test
  33.    shard key: { "number" : 1 }
  34.    unique: false
  35.    balancing: true
  36.    chunks:
  37.     sharding_yeyz 3
  38.     sharding_yeyz1 1
  39.    { "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1)
  40.    { "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2)
  41.    { "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0)
  42.    { "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5)
  43.     tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }
  44.     tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }
复制代码
到了这里,我们开始验证最终的结果,先通过下面的命令生成一组测试数据,如下:
  1. for (var i=1 ;i<=2000 ; i++){ db.test.insert({"number":i})}
复制代码
去查看每个分片上的内容,可以发现:
sharding_yeyz
  1. sharding_yeyz:PRIMARY> db.test.find().sort({"number":-1})
  2. { "_id" : ObjectId("5ffc051dd4c416daac620af5"), "number" : 2000 }
  3. { "_id" : ObjectId("5ffc0511d4c416daac620325"), "number" : 2000 }
  4. { "_id" : ObjectId("5ffc051bd4c416daac62070c"), "number" : 999 }
  5. { "_id" : ObjectId("5ffc050fd4c416daac61ff3c"), "number" : 999 }
  6. { "_id" : ObjectId("5ffc051bd4c416daac62070b"), "number" : 998 }
  7. { "_id" : ObjectId("5ffc050fd4c416daac61ff3b"), "number" : 998 }
  8. { "_id" : ObjectId("5ffc051bd4c416daac62070a"), "number" : 997 }
  9. { "_id" : ObjectId("5ffc050fd4c416daac61ff3a"), "number" : 997 }
  10. { "_id" : ObjectId("5ffc051bd4c416daac620709"), "number" : 996 }
  11. { "_id" : ObjectId("5ffc050fd4c416daac61ff39"), "number" : 996 }
  12. { "_id" : ObjectId("5ffc051bd4c416daac620708"), "number" : 995 }
复制代码
   这里须要注意,为什么2000这个值照旧出如今分片一上呢?
这个缘故原由是在设置分片的数值范围的时间,我们设置的区间是左闭右开的。而我们设置的分片范围分别是[1,1000)和[1000,2000),因此2000这个数字就被随机分配到这两个分片中,现实的环境是,它被分配到了分片一中。
sharding_yeyz1
  1. sharding_yeyz1:PRIMARY> db.test.find().sort({"number":-1})
  2. { "_id" : ObjectId("5ffc051dd4c416daac620af4"), "number" : 1999 }
  3. { "_id" : ObjectId("5ffc0511d4c416daac620324"), "number" : 1999 }
  4. { "_id" : ObjectId("5ffc051dd4c416daac620af3"), "number" : 1998 }
  5. { "_id" : ObjectId("5ffc0511d4c416daac620323"), "number" : 1998 }
  6. { "_id" : ObjectId("5ffc051dd4c416daac620af2"), "number" : 1997 }
  7. { "_id" : ObjectId("5ffc0511d4c416daac620322"), "number" : 1997 }
  8. { "_id" : ObjectId("5ffc051dd4c416daac620af1"), "number" : 1996 }
  9. { "_id" : ObjectId("5ffc0511d4c416daac620321"), "number" : 1996 }
  10. { "_id" : ObjectId("5ffc051dd4c416daac620af0"), "number" : 1995 }
  11. { "_id" : ObjectId("5ffc0511d4c416daac620320"), "number" : 1995 }
  12. { "_id" : ObjectId("5ffc051dd4c416daac620aef"), "number" : 1994 }
  13. { "_id" : ObjectId("5ffc0511d4c416daac62031f"), "number" : 1994 }
  14. { "_id" : ObjectId("5ffc051dd4c416daac620aee"), "number" : 1993 }
  15. { "_id" : ObjectId("5ffc0511d4c416daac62031e"), "number" : 1993 }
  16. { "_id" : ObjectId("5ffc051dd4c416daac620aed"), "number" : 1992 }
  17. { "_id" : ObjectId("5ffc0511d4c416daac62031d"), "number" : 1992 }
复制代码
这个结果看着就比力正常了。
今天的内容就到这里吧。
以上就是怎样为MongoDB添加分片副本集的详细内容,更多关于为MongoDB添加分片副本集的资料请关注草根技术分享其它干系文章!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作