迁移:当分片中的数据大小不一时会产生迁移的动作,比如分片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:需要独立的部署服务器
- 配置服务器:配置服务器不需要有自己的机器
根据不同的数据中心划分

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

(3)配置的注意事项
需要估计集群大小,可使用以下命令对现有集合进行分片处理
- sh.splitAt("cloud-docs.spreadsheets",{"username":"chen","_id":ObjectId("")})
- //手动拆分块
- sh.moveChunk("cloud-docs.spreadsheets",{username:"chen"},"shardB")
- //手动将某分块移至分片B
- db.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 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|