MongoDB 是什么?( 五 )


 
3.分片实战启动两个副本集、三个配置服务器、一个mongos进程
配置分片
sh.help //查看分片相关帮助sh.addShard //添加分片db,getSiblingDB("config").shards.find //查看分片列表sh.status //分片详情sh.enableSharding("cloud-docs") //开启一个数据库上的分片db.getSiblingDB("config").databases,find //查看数据库列表sh.shardCollection("cloud-docs.spreadsheets",{username:1,_id:1}) //使用一个分片键定义一个分片集合spreadsheets,根据用户名进行切分sh.getSiiblingDB("config").collections.findOne //查看集合列表db.chunks.count //查看块的个数db.chunks.findOne //查看块的信息db.changelog.count(}what:"split"|) //查看块切分日志db.changelog.find({what:"moveChunk.commit"}).count //查看日志迁移记录 
4.分片的查询与索引(1)分片查询类型

  • 针对性查询:查询包含分片键
  • 全局查询或分散/聚集查:查询不包含分片键
  • 查询过程:通过分片键将查询路由给指定分片,一旦到了某个分片上,由分片自行决定使用哪个索引来执行该查询
(2)索引
每个分片都维护了自己的索引,当在分片集合上声明索引时,每个分片都会为它那部分集合构建独立的索引,每个分片上的分片集合都应该拥有相同的索引 。
分片集合只允许在_id字段和分片键上添加唯一性索引,其他地方不行,因为这需要在分片间进行通信,实施起来很复杂 。
当创建分片时,会根据分片键创建一个索引 。
 
5.选择分片键(1)分片键是不可修改的、分片键的选择非常重要(2)低效的分片键
  • 分布性差:如使用BSON对象ID,那么会导致所有最新插入的文档都会落到某个很小的连续范围,无法分散插入
  • 缺乏局部性:升序分片键有明确的方向,完全随机的分片键则根本没有方向 。前者无法分散插入,后者插入分散,如使用MD5作为分片键
(3)理想的分片键
  • 将插入数据均匀分布到各个分片上
  • 保证CRUD操作能够利用局部性 有足够的粒度进行块拆分
  • 满足这些要求的分片键通常由两个字段组成,第一个是粗粒度的,第二个粒度较细
 
6.生产环境中的分片(1)部署拓扑
  • 复制mongod:需要独立的部署服务器
  • 配置服务器:配置服务器不需要有自己的机器
根据不同的数据中心划分
MongoDB 是什么?

文章插图
(2)最低要求
  • 副本集每个成员,无论是完整的副本集节点还是仲裁节点,都需要放在不同的机器上 每个用于复制的副本集成员都需要有自己的机器
  • 副本集仲裁节点很轻量级,和其他进程共用一台机器即可
  • 配置服务器也可以选择与其他进程共用一台机器

MongoDB 是什么?

文章插图
(3)配置的注意事项
需要估计集群大小,可使用以下命令对现有集合进行分片处理
sh.splitAt("cloud-docs.spreadsheets",{"username":"chen","_id":ObjectId("")})//手动拆分块sh.moveChunk("cloud-docs.spreadsheets",{username:"chen"},"shardB")//手动将某分块移至分片Bdb.runCommand({removeshard:"shard-1/arete:30100,arete:30101"})//删除分片db.runCommand({moveprimary:"test",to:"shard-0-test-rs"});//移动主分片(4)备份分片集群
备份分片时需要停止均衡器
db.settings.update({_id:"ba;ancer"},{$set:{stopped:true},true});sh.setBalancerState(false);//停止均衡器,此时均衡器将进行最后一轮均衡db.locks.find({_id:"balancer"});sh.isBalancerRunning;//查看均衡器状态,任何状态大于0 的状态值都说明均衡器仍在进行中 
八、部署与管理1.部署(1)部署架构使用64位机器、32位机器会制约mongodb的内存,使其最大值为1.5GB
(2)cpumongodb 只有当索引和工作集都可放入内存时,才会遇到CPU瓶颈,CPU在mongodb使用中的作用是用来检索数据,如果看到CPU使用饱和的情况,可以通过查询慢查询日志,排查是不是查询的问题导致的,如果是可以通过添加索引来解决问题
mongodb写入数据时会使用到CPU,但是mongodb写入时间一次只用到一个核,如果有频繁的写入行为,可以通过分片来解决这个问题(3)内存
大内存是mongodb的保障,如果工作集大小超过内存,将会导致性能下降,因为这将会增加数据加载入内存的动作


推荐阅读