mongo 分片

1 副本集vs分片

副本集是mongo数据的备份镜像集群,主要解决数据备份问题;分片是每一个分片(mongod)都存放有其它分片不同的子集,所有的分片之和,是总的数据,分片主要用于提高读写IO写速度

2 分片组成(3个组件)

2.1 mongs
请求路由到mongd,以及对mongd返回的数据做拼装;mongos会与配置服务器发生读写请求来同步信息;一个web应用可以连接一个mongos

2.2 mongd
存储真正数据的普通mongo;考虑到分片的性能开销,建议分片至少3片以上,否则不如用单个mongo;

2.3 配置服务器
普通的mongd,一般有3台,主要存放集群和分片元信息。数据存储大小可以不用设的置太大,1kb可映射到200M的数据;

3 开发人员最应该关注是数据分发方式

3.1 索引
对数据库分片是对集合分片的前提,对集合分片必须对集合的某个字段(片键)加索引(hash,1,-1)

db.enableSharding("dbName") // 数据库支持分片
sh.shardCollection("dbName.collectionName",{ name, 1}) // 集合分片,name为片键

3.2 数据块和分片均衡

shardCollection操作,会拆分集合为数据块(mongo分片的数据基本单元),然后将块均匀的分布到分片上;这个过程可能持续一段时间;

由于mongo中可能有海量的文档存储在不同的机器上,这样mongo难以操作。因此mongo将文档分组成块,每个块有特定范围的文档组成,每个块只存在在一个分片中,配置服务用比较小的表就能维护分片和块的映射关系

(1) 块的拆分:mongs会记录每个块的数据量,当块的数据数据大小到阈值时,就会在配置服务器上更新块的元数据信息,拆分只需要更新元数据即可

(2) 分片的均衡:当某一个分片的负载比较大(较多的块),那么均衡器会自动把块迁移到块数量较少的分片上

3.3 数据分发

讨论使用某字段作为片键时,分发到数据块的行为

(1) 升序片键

如以自增的ID、自增的timestamp作为片键;缺点是可能会导致插入的IO落在一个块上,数据块会不断的拆分,不断的迁移

(2) 随机分发片键

电话、email、hash等作为片键;有点是IO会随机的分发到块中,并且减少数据块迁移的概率

(3) 位置片键

注意:无论升序键还是随机键,数据块都是随机分发到分片中的

片键策略

1 b-tree 索引(ensureIndex时设置为1,-1)

2 散列片键

对片键字段建立hash索引,这样无论是什么类型的片键,都能随机分发到分片上

db.users.ensureIndex('username','hashed')
db.shardCollection('users,{'username','hashed'}')

缺点是散列片键无法比较大小(mysql的hash索引也是这个问题)
 

猜你喜欢

转载自blog.csdn.net/ShuaiFanPi/article/details/88553408