分片,副本级集群对比
分片 | 副本级集群 | |
---|---|---|
实现意义 | 提升并发性能 | 数据沉余,提升度性能 |
架构上 | 水平化 | 中心化 |
实现原理 | 数据分散 | 数据镜像 |
维护成本 | 相对高 | 较容易 |
分片节点
Shard节点:
存取数据的节点( 单个mongod)
Config server:
储存元数据,为mongos服务,路由到Shard
Mongos
接收请求,进行消息路由
成员节点启动参数
Shard:
mongod --shardsvr
mongod --shardsvr --rpelSet (副本集)
Config server:
mongod --configsvr
Mongos
mongos --configdb <configdb server>
分片步骤
> use admin
> sh.addShard("ip:port")
> db.runCommand({enablesharding:"db"})
> db.runCommand({"shardcollection":"db.collection",key:{"key":1}})
查看shard成员
> use config
> db.shards.find()
产看shard状态
> db.printShardingStatus()
哈希分片
>db.runCommand({"shardcollection":"db.collection","key":{key:hashed}})
范围分片和哈希分片的对比
基于范围的分片方式提供了更高效的范围查询,给定一个片键的范围,分发路由可以很简单地确定哪个数据块存储了请求需要的数据,并将请求转发到相应的分片中.
不过,基于范围的分片会导致数据在不同分片上的不均衡,有时候,带来的消极作用会大于查询性能的积极作用.比如,如果片键所在的字段是线性增长的,一定时间内的所有请求都会落到某个固定的数据块中,最终导致分布在同一个分片中.在这种情况下,一小部分分片承载了集群大部分的数据,系统并不能很好地进行扩展.
与此相比,基于哈希的分片方式以范围查询性能的损失为代价,保证了集群中数据的均衡.哈希值的随机性使数据随机分布在每个数据块中,因此也随机分布在不同分片中.但是也正由于随机性,一个范围查询很难确定应该请求哪些分片,通常为了返回需要的结果,需要请求所有分片.