分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。在关系型数据库中,当一个表太大(超过几亿行数据)时,我们也有分表的做法,和这里的分片是类似的概念。

术语

  • “片”:一个独立的MongoDB服务(即mongod服务进程,在开发测试环境中)或一个副本集(在生产环境中)。
  • “片键”:在路由服务器上设置分片时,需要从开启分片的集合中选取一个键,用该键作为数据存放在哪个片的依据。这个键就称为“片键”。对于选择哪个键作为片键?有个原则就是,片键应该有较多变化的值。
  • “配置服务器”:一个mongod服务进程,但这个数据库服务仅仅是为mongos路由服务提供配置信息存储的位置!启动mongos服务时,需要提供一个mongod服务器,以便路由服务访问或存储相关的配置信息。配置信息主要包括:分片与数据的对应关系!(配置服务器必须开启1个或则3个,开启2个则会报错(
  • mongos”服务:MongoDB自带的路由服务进程,它路由所有的客户端请求,并将各个片的结果进行汇聚返回。这个服务进程本身不会存储任何数据或配置信息(有时会缓存配置服务器的相关配置信息)。

示例

环境搭建

启动两台mongodb服务器(2701727018),一台配置服务器(27019)和一个路由服务(27020);

注意: Mongodb3.4版本开始要求配置服务器要是复制集

// 启动分片服务器,注意要加 --shardsvr
./bin/mongod --dbpath shard1/data --logpath shard1/log/0924.log --fork --port 27017 --shardsvr
./bin/mongod --dbpath shard2/data --logpath shard2/log/0924.log --fork --port 27018 --shardsvr// 配置服务器, 注意要加 --configsvr
./bin/mongod --dbpath shard_router_server/data --logpath shard_router_server/log/0924.log --fork --port 27019 --configsvr --replSet config// 启动路由服务
./bin/mongos --port 27020 --configdb config/localhost:27019 --logpath shard_router/log/0924.log --fork

进入路由服务,注册参与分片的节点

mongos> use admin
mongos> db.runCommand({"addshard" : "192.168.1.168:27017"});
mongos> db.runCommand({"addshard" : "192.168.1.168:27018"});

查看分片信息

mongos> sh.status()

查看分片成员

mongos> db.runCommand({listshards: 1})
// 或切换到 config 数据库,查看 shards 集合
mongos> use config
mongos> db.shards.find()

删除分片

mongos> db.runCommand({"removeshard":"192.168.1.168:27017"})

此时后台会自动开启分片数据库的数据迁移;然后需要手动迁移未开启分片数据库的数据;

手动迁移命令,可以参考

mongos> db.runCommand({ movePrimary: "school", to: "192.168.1.168:27018" })

开启分片

如果对应的数据库没有开启分片功能,则通过路由服务新增数据,是会报错的;

笔者开启school数据库的分片功能;

mongos> db.runCommand({"enablesharding" : "school"});
// 或
mongos> sh.enableSharding("school")

那么,如果 school 数据库下的集合没有开启分片功能,那么所有对school数据库下集合的操作都会在school数据库所在的分片上执行;

查看已经在片系统上的数据库列表:

mongos> db.databases.find()

集合开启分片
school数据库下的demo集合开启分片功能;

mongos> sh.shardCollection("school.demo", {"name":1})

开启分片的集合,是以 chunks(块) 为单位;块(chunk)是由多个doc组成的一个分组,在某个索引字段(片键)上是连续的,每个chunk的片键是有一定范围的。块的默认大小是 64 MB。有些chunk会非常大,包含的doc数量非常多,但是,在MongoDB看来,仍然是一个chunk,和没有任何doc的空chunk没有区别。均衡分发保证每个shardchunk数量是大致相同的。因此,片键的选择直接影响分片的好坏。

测试分片效果

因为chunk默认大小是 64 MB(取值范围是 1 MB 到 1024 MB), 不方便查看效果(chunk数目差异较大时的拆分与平衡);

修改chunk块的大小:

mongos> use config
mongos> db.settings.save( { _id:"chunksize", value: 1 } )

此时批量向school数据库下的 demo插入 60W 条数据

mongos> use school
mongos> for(i=0;i<600000;i++){ db.demo.insert({"uid":i,"name":"zhanjindong"+i,"age":13,"data":new Date()}); }

通过命令sh.status(),可以实时查看各片上的chunk数目多少;

附录

参考阅读

  • 悦光阴的博客
  • DrifterJ's Stash的博客

练习 MongoDB 操作 —— 分片篇(五)相关推荐

  1. 练习 MongoDB 操作 —— 备份篇(三)

    2019独角兽企业重金招聘Python工程师标准>>> mongodb数据备份和还原主要分为二种, 一种是针对于库的mongodump和mongorestore, 一种是针对库中表的 ...

  2. Mongodb操作基础 分片

    Mongodb分片 MongoDB分片是MongoDB支持的另一种集群形式,它可以满足MongoDB数据量呈爆发式增长的需求.当MongoDB存储海量的数据时,一台机器可能无法满足数据存储的需求,也可 ...

  3. MongoDB分布式操作——分片操作

    http://www.2cto.com/database/201309/240552.html MongoDB分布式操作--分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作, ...

  4. gizzard mysql_【MongoDB】在window系统下搭建MongoDB的分片系统(一)

    这篇主要讲述分片集群的主要原理 坦白说,刚看到这个分片系统(Sharding)有点蒙,感觉有点太高大上了.看美国作家Kyle Banker<Mongodb in action>没有明白.又 ...

  5. Mongodb数据分片的实现

    转载自 http://www.cnblogs.com/spnt/ 副本集实现了网站的安全备份和故障的无缝转移,但是并不能实现数据的大容量存储,毕竟物理硬件是有极限的,这个时候就需要做分布式部署,把数据 ...

  6. 微信小游戏爆款秘笈 数据库MongoDB攻略篇

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 随着微信小游戏的爆发,越来越多开发者关注到MongoDB与小游戏业务的契合度. ...

  7. 为啥linux分区是nvme0n1,NAS 篇五:尝试达成最终目标: 黑裙+万兆网卡+Nvme 存储空间的实现与测试...

    NAS 篇五:尝试达成最终目标: 黑裙+万兆网卡+Nvme 存储空间的实现与测试 2020-01-18 18:49:23 46点赞 248收藏 80评论 创作立场声明:1. 本系列文章讨论NAS与局域 ...

  8. Android日志[进阶篇]五-阅读错误报告

    Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...

  9. 如何启动MongoDB数据库 - 基础篇

    安装好了之后,我们如何启动MongoDB数据库? 找到默认的安装路径 安装完毕之后,我们找到默认的安装路径,截图如下: 启动的时候,需要初始化一个数据库文件.步骤如下: 安装者自行设定(新建文件夹,自 ...

最新文章

  1. Spring高级程序设计(Spring框架创始人倾情推荐的权威开发指南)
  2. linux内核能否扩展,Linux内核用到的GCC扩展
  3. 性能测试工具—JMeter分布式启动
  4. 天下为公:TCP堵塞控制
  5. new php,PHP: 新特性 - Manual
  6. 书籍《智能交通》-观后感-2021年12月-下期分享
  7. 漫画:混乱的标记语言XHTML2/HTML5
  8. 内网外网同时连接方法
  9. linux sleeping进程多_Linux下找出吃内存的方法总结
  10. Python渗透测试之流量分析:流量嗅探工具编程
  11. foobox 3.8(foobar2000 CUI配置)
  12. QTreeWidget的右键菜单实现
  13. opensuse15.0测试使用snapper
  14. mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解
  15. Apollo(阿波罗)架构深度剖析
  16. Codeforces Round #742 (Div. 2) C. Carrying Conundrum(思维)
  17. java 串讲_Java知识串讲
  18. markdown组合数学公式
  19. 南昌理工学院计算机系考研,南昌理工学院与华东交通大学联合培养硕士研究生...
  20. zend studio php mvc,Zend Studio使用教程:使用Zend Studio和Zend Server进行根本原因分析 (一)...

热门文章

  1. 英特尔全栈解决方案,助推人工智能在多领域的落地发展
  2. 合并代码还在用git merge吗?我们都用git rebase!
  3. 是时候装逼了,试试 IDEA 解决 Maven 依赖冲突的高能神器!
  4. 编写 if 时不带 else,你的代码会更好!
  5. Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
  6. 面试再被问到 ConcurrentHashMap,把这篇文章甩给他!
  7. 一个JDK线程池BUG引发的GC机制思考
  8. 技术人如何做职场沟通?
  9. 超越快手腾讯!度小满NLP模型登顶CLUE榜首
  10. Docker常用命令大全