MongoDB是什么,怎么用?看完你就知道了( 五 )


迁移:当分片中的数据大小不一时会产生迁移的动作,比如分片A的数据比较多,会将分片A里面的一些块转移到分片B里面去 。分片集群通过在分片中移动块来实现均衡,是由名为均衡器的软件进程管理的,任务是确保数据在各个分片中保持均匀分布,当集群中拥有块最多的分片与拥有块最少分片的块差大于8时,均衡器就会发起一次均衡处理 。
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)cpu
mongodb 只有当索引和工作集都可放入内存时,才会遇到CPU瓶颈,CPU在mongodb使用中的作用是用来检索数据,如果看到CPU使用饱和的情况,可以通过查询慢查询日志,排查是不是查询的问题导致的,如果是可以通过添加索引来解决问题


推荐阅读