mongodb分片介绍

1.mongodb集群架构

mongodb通过配置sharded cluster实现sharding.


sharded cluster有如下几个组件:分片(shards),查询路由器(query router)和配置服务器(config servers):
shards存储实际数据,为了提高高可用,每个shards可以配置为复制集replica sets,
query router查询路由器即mongos实例,客户端应用程序连接的是mongos实例,发送请求给mongos实例,mongos实例将操作路由到指定的shards,最后再将结果返回给客户端程序.一个分片集群可以有多个mongos实例,这样可以提高客户端的请求负载.一般的分片集群因此有多个mongos实例.
config servers存储了集群的元数据,这些数据保存了每个分片服务器数据的映射表.查询路由器就是通过这些元数据将操作路由到指定的目标分片服务器.
注意,从3.2版本以后,配置服务器也可以配置为复制集.必须运行WiredTiger存储引擎. 现在官方强烈建议所有正式生产的shard和config server都建成复制集.

2.mongodb分片键

Mongdb分布数据或者分片是在集合(表)级别.分片划分数据通过分布键.
shard key
为了给集合分片,需要选择一个分片键,分片键要么是一个索引字段要么是一个混合索引字段,而且必须在集合的所有文档中都存在.mongodb将分片键的值划分成一个一个块,再将每个块平均分布在分片上,mongodb使用range或者hash分区来将shard key的值划分为一个一个的块.
    以范围为基础的分片
对于 基于范围的分片 ,MongoDB按照片键的范围把数据分成不同部分.假设有一个数字的片键:想象一个从负无穷到正无穷的直线,每一个片键的值都在直线上画了一个点.MongoDB把这条直线划分为更短的不重叠的片段,并称之为 数据块 ,每个数据块包含了片键在一定范围内的数据.
在使用片键做范围划分的系统中,拥有”相近”片键的文档很可能存储在同一个数据块中,因此也会存储在同一个分片中.

    基于哈希的分片
对于 基于哈希的分片 ,MongoDB计算一个字段的哈希值,并用这个哈希值来创建数据块.
在使用基于哈希分片的系统中,拥有”相近”片键的文档 很可能不会 存储在同一个数据块中,因此数据的分离性更好一些.



    基于范围的分片方式与基于哈希的分片方式性能对比
基于范围的分片方式提供了更高效的范围查询,给定一个片键的范围,分发路由可以很简单地确定哪个数据块存储了请求需要的数据,并将请求转发到相应的分片中.
不过,基于范围的分片会导致数据在不同分片上的不均衡,有时候,带来的消极作用会大于查询性能的积极作用.比如,如果片键所在的字段是线性增长的,一定时间内的所有请求都会落到某个固定的数据块中,最终导致分布在同一个分片中.在这种情况下,一小部分分片承载了集群大部分的数据,系统并不能很好地进行扩展.
与此相比,基于哈希的分片方式以范围查询性能的损失为代价,保证了集群中数据的均衡.哈希值的随机性使数据随机分布在每个数据块中,因此也随机分布在不同分片中.但是也正由于随机性,一个范围查询很难确定应该请求哪些分片,通常为了返回需要的结果,需要请求所有分片.
MongoDB允许管理员使用 标记 直接决定集群的均衡策略.管理员使用标记与片键的范围做绑定,并将标记与分片直接绑定,之后,均衡器会将满足标记的数据直接分发到与之绑定的分片上,并且确保之后满足标记的数据一直存储在相应的分片上.
标记是控制均衡器行为和数据块分布的首要条件,一般来讲,在拥有多个数据中心时,才会使用标记自定义集群中数据块的分布,以提高不同地域之间数据访问的效率.
注意:片键上的索引不能是多键索引,多键索引即数组的索引, 片键在写入后不能被改变

3.数据均衡的维护

新数据的加入或者新分片的加入可能会导致集群中数据的不均衡,即表现为有些分片保存的数据块数目显著地大于其他分片保存的数据块数.
MongoBD使用两个过程维护集群中数据的均衡:分裂和均衡器.
    分裂

分裂是防止某个数据块过大而进行的一个后台任务.当一个数据块的大小超过 :ref:`设定的数据块大小 <sharding-chunk-size>`时,MongoDB会将其一分为二,插入与更新触发分裂过程.分裂改变了元信息,但是效率很高.进行分裂时,MongoDB 不会 迁移任何数据,对集群性能也没有影响.
     均衡

当集群中数据的不均衡发生时,均衡器会将数据块从数据块数目最多的分片迁移到数据块最少的分片上,举例来讲:如果集合 users 在 分片1 上有100个数据块,在 分片2 上有50个数据块,均衡器会将数据块从 分片1 一直向 分片2 迁移,一直到数据均衡为止.
    在集群中增加或者删除分片
在集群中增加分片时,由于新的分片上并没有数据块,会造成数据的不均衡.此时MongoDB会立即开始向新分片迁移数据,集群达到数据均衡的状态需要花费一些时间.
当删除一个分片时,均衡器需要将被删除的分片上的数据全部迁移到其他分片上,在全部迁移结束且元信息更新完毕之后,你可以安全地将这个分片移除.





















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值