1、概述
MongoDB在1.6版本中提供分片和复本集技术使得MongoDB真正具备了生产环境部署的能力。
MongoDB 包含一个自动分片模块 ("mongos")。自动分片可以用于构建一个大规模的可扩展的数据库集群,这个集群可以并入动态增加的机器,自动建立一个水平扩展的数据库集群系统,将数据库数据存储在sharding的各个节点上。
应用程序可以通过mongos process登陆shard集群,mongosprocess负责进行路由调度,将请求分发到合适的shard server上。对应用来说shard 端就像一个单节点数据库,但是数据库的存储空间无限扩大。假如要写大量数据到某个集合,这些数据会分发到多个shared server中,查询也是如此,因此查询效率会较高。
shard的分片单元是集合,而不是整个数据库。2、原理
(1)工作原理
MongoDB分片的基本原理是把集合分成更小的chunks。这些chunks可以分散到不同的shards,每个shard负责集合的一部分。应用程序不会知道哪个分片有哪些数据,甚至不知道数据被放到了不同的shards。只有在shards的前端运行的路由进程mongos,才知道所有的数据放在哪,应用程序连接mongos,就可像平常一样发起查询。
(2)chunks
分割按有序分割方式,每个shard上的数据为某一范围的数据块(一个shard含有一个集合的多个chunk),故可支持指定分片的范围查询。数据块有指定的最大容量,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。
(3) shared key
分片的关键在于shard key。通过shard key划分每个shard上的chunk。比如,根据集合的title字段做shard key,分为三个shard,那么,分成A-F开头的文档chunk,G-N开头的文档chunk,及O-Z开头的文档chunk,将分别存储于三个shard中。当增加或者删除一个shard时,chunk块将重新划分,不过,mongodb会使每一个shard在负载和总量上保持平衡。一个高访问量的shard拥有的数据可能比一个低访问量的shard少。
对已经存在的集合,如果该集合都在一个shard上,增加一个新的shard,按照集合的title作为shard key分片,那么,mongodb会按照title的开头字母将这个集合分成两个chunk,其中一个chunk将会被移动到新增的shard中。
被查询的数据,不论来自于1台shard,还是在所有shard中获取,都是由mongos来统一整理的。