分片就是水平的扩展,将数据分拆到不同的机器上,以达到存储更多的数据,处理更大的负载。可以选定将按照指定的文档键值进行分片。
配置
角色
分片一般有三个组成部分:
- 分片服务(Shard Server),mongod 实例,2个以上,负责存储实际的数据分片,生产环境中一个Shard Server可由几台服务器组成一个Replica Set代替,避免主机单点故障;
- 路由服务(Routing Process),mongos实例,1个以上,它负责管理分片,客户端由此前端路由接入,且让整个集群看起来像单一数据库,客户端应用可以透明使用,Routing Process不存储数据,数据来自Config Server;
- 配置服务(Config Server),mongod 实例,1个以上,负责存储整个集群的配置信息:即数据和片的对应关系。

启动
1. 要先启动配置服务器,因为mongos要用到其配置信息:
./mongod --dbpath /data/db/config/ --port 27017
2. 启动mongos服务,启动的时候需要指明配置服务器的地址,可以添加多个配置服务器:
./mongos --port 27018 --configdb 127.0.0.1:27017
3. 添加片,先启动分片实例:
./mongod --dbpath /data/db/shard1 --port 27019
然后连接mongos服务添加片:
./mongo 127.0.0.1:27018/admin
db.runCommand({addshard:'127.0.0.1:27019',allowLocal:true})
返回{ "shardAdded" : "shard0000", "ok" : 1 },表示添加分片成功。allowLocal表示分片实例和mongos服务在同一台机器上,如果是生产环境的话,尽量将两者放在不同的服务器上。按照相同的步骤再添加一个端口为27020的分片实例,注意使用不同的dbpath。
4. 切分数据,比如要将test数据库中的people集合按照name字段进行分片,可以如下配置:
db.runCommand({ enablesharding :"test"} );
db.runCommand( { shardcollection : "test.people",key : {'name':1} });
5. 添加复制集,使用复制集可以保证一个分片挂掉的情况下,分片仍然可用,使用如下命令将shard1这个复制集添加进分片:
db.runCommand({addshard:'shard1/127.0.0.1:27019'})
shard1是复制集名称,后面为复制集中活跃节点地址。
管理命令
查看整个集群的分片情况:
use admin;
db.printShardingStatus();
查看people集合的分片情况:
use test;
db.people.stats();
删除片,删除片并不会影响该分片上的数据,数据会被移植到另外的分片上:
db.runCommand({removeshard:'127.0.0.1:27020'});
该命令会返回操作的状态是ongoing还是completed,ongoing表示该删除的分片是某个数据库的primary片(通过db.printShardingStatus()查看),还得使用moveprimary命令将其它分片设置为该数据库的primary片,例如:
db.runCommand({moveprimary:'test',to:'127.0.0.1:27019'})
确定要删除的分片不再是任何数据库的primary片后再执行removeshard命令,这时返回的状态是completed,表示删除分片成功。