1、概念:分片是指将数据拆分,分散到不同的数据库实例上进行“负载分流”的做法。

      我们常说的“分表”、“分库”、“分区”等概念都属于分片的实际体现。
2、片键
 2.1、概念:
  设置分片时,需要从集合里面选一个键,用该键的值作为数据拆分的依据。
  这个键称为片键(shard key)。片键就是分片的依据。
 2.2、片键的选择:
 (1)、递增片键:连续、不均匀、写入集中、分流较差。
 (2)、随机片键:不连续、均匀、写入分散、分流较好。
 2.3、普通的集合,利用key为片键进行自动分片后的结果,如下图所示:
         

3、分片架构图,如下所示:

        

    用户:代表客户端。

    路由:代表路由服务器,它会根据管理员设置的“片键”,将数据分摊到自己管理的mongod集群。
    配置服务器:它将存储数据和片的对应关系以及相应的配置信息,即分片集群的配置信息。 
    Shard01片区: 一个普通的数据库实例,如果不分片,我们会直接连上mongod数据库。

4、自动分片

 传统的分片做法是手工分表、分库。
 自动分片技术是根据指定的“片键”,自动拆分数据并维护数据,请求路由的过程。

5、何时使用分片?

 (1)、机器的磁盘空间不足。
 (2)、单个的mongodb服务器已经不能满足大量的插入操作。
 (3)、想把大量数据放到内存中提高性能。
6、建立分片
(1)、创建一个配置服务器
(2)、创建路由服务器,并且连接配置服务器
  路由器是调用mongos命令
(3)、添加两个分片数据库
  1111和2222
(4)、利用路由为集群添加分片(允许本地访问)
 切记之前不能使用任何数据库语句。
 db.runCommand({addshard:"127.0.0.1:1111",allowLocal:true});
 db.runCommand({addshard:"127.0.0.1:2222",allowLocal:true});
(5)、打开数据库分片功能(必须使用admin用户执行命令语句)
 注意:一定要在打开分片功能之后,才创建数据库和集合,否则分片不起作用。
 为业务数据库foobar打开分片功能,示例如下:
 db.runCommand({"enablesharding":"foobar"});
(6)、对集合进行分片(必须使用admin用户执行命令语句)
   db.runCommand({"shardcollection":"foobar.persons","key":{"_id":1}})
(7)、利用大量数据进行测试(800000条)
 function add(){
 for(var i=0;i<800000;i++)
 {
  db.persons.insert({"number":i,"age":10,"name":"Jim"+i})
 }
 }
7、管理分片
7.1、配置集合
 以下命令,需要在配置服务器中config数据库中执行。
 (1)、分片:db.shards.find();
 (2)、数据库:db.databases.find();
 (3)、块:db.chunks.find();
7.2、分片命令
 (1)、获得概要:db.printShardingStatus();
 (2)、删除片:db.runCommand({"removeshard":"127.0.0.1:1111"});

8、生产配置

 8.1、配置服务器集群

 8.2、分片和副本集