3.4 Sharding(分片)
3.4.1 sharding介绍
MongoDB包括一个自动分片的的模块(“mongos”),从而可以构建一个大的水平可扩展的数据库集群,可以动态地添加和移走机器。如下是一个数据库集群的示意图:
mongod:数据库服务器进程,类似于mysqld。
shards:每个shard有一个或多个mongod,通常是一个master,多个slave组成replication。数据由集合按一个预定的顺序划分,某一个范围的数据被放到一个特定的shard中,这样可以通过shard的key进行有效的范围查询。
shard keys:用于划分集合,格式类似于索引的定义,也是把一个或多个字段作为key,以key来分布数据。如:{ name : 1 [1]}、{ _id : 1 }、{ lastname : 1, firstname : 1 }、{ tag : 1, timestamp : -1 }。如果有100万人同名,可能还需要划分,因为放到一个块里太大了,这时定义的shar key不能只有一个name字段了。划分能够保证相邻的数据存储在一个server(当然也在相同的块上)。
chunks:是一个集合里某一范围的数据,(collection, minkey, maxkey)描述了一个chunk。块的大小有限定,当块里的数据超过最大值,块会一分为二。如果一个shard里的数据过多[2],就会有块迁移到其它的shard。同样,当添加新的server时,为了平衡各个server的负载,也会迁移chunk过去。
config server(配置服务器):存储了集群的元信息,包括每一个shard、一个shard里的server、以及每一个chunk的基本信息。其中主要是chunk的信息,每个config server中都有一份所有chunk信息的完全拷贝。使用两阶段提交协议来保证配置信息在config server间的一致。config database里存放的块信息如下:
mongos:可以认为是一个“数据库路由器”,用以协调集群的各个部分,使它们看起来像一个系统。mongos没有固定的状态,可以在 server需要的时候运行。mongos启动后会从config server里取出元信息,然后接收客户请求,把请求路由到合适的server,得到结果后送回客户。一个系统可以有多个mongos例程,每个例程都需要内存来存储元信息。例程间不需协同工作,每个mongos只需要协同shard servers和config servers工作即可。当然shard servers间也会彼此对话,也会同config servers对话。
3.4.2 sharding的配置和管理
mongod的启动选项中也包含了与sharding相关的参数,如--shardsvr(声明这是一个shard db),--configsvr(声明这是一个config db)。mongos的启动选项--configdb指定config server的位置。下面的链接地址是一个简单的sharding配置例子:http://www.mongodb.org/display/DOCS/A+Sample+Configuration+Session。
像安全和认证一样,如果要sharding,先要允许一个数据库sharding,然后要指定数据库里集合的分片方式,这些都有相应的命令可以完成。
[1] 1代表升序,-1代表降序。
[2] 添加shard时,可以指定这个shard上可以存放的最大数据量maxSize。