简介
MongoDB的分片和复制都是MongoDB为了提供大数据高负载为我们提供的提高性能的方式。两者都是使用类似集群(多个节点)的方式部署。不同之处在于,副本集中所有节点的存储的数据时一致的。而分片中的每个节点存储的数据一般都是不同的,类似于关系数据库中的水平切分,或DB2中的分区表。而且和复制一样,MongoDB可以自动化的处理分片、负载均衡,当然也可以人为的手动分片。
分片说明
上文提到过,分片的基本思想是类似于水平切分,即根据集合中文档的某个key将整个集合切分为多个结构相同,值不同的集合并将他们分布式的部署到多个mongoDB实例中。
当不使用分片的时候,与应用程序交互的MongoDB进程是mongod,当使用分片之后,与应用程序交互的是mongos进程,mongos下边是多个mongod进程。而mongos、mongod对于应用程序来看都是一样的。没有区别。
片键
设置分片的时候,需要从集合文档中选择一个key,该key作为对集合的分片依据,同时该key称为片键。
片键的选择
片键的选择决定了插入到集合的数据分布,而我们最期望的是均衡的分布片键,所以在选择片键的时候我们需要认真考虑。
片键一般都是索引。
片键的选择应遵循以下几条规则:
- 不选取小基数片键
- 不选取具有明显升、降序特征的片键,例如时间
- 不选取随机片键
详细的片键选择,可以参阅《深入学习MongoDB》一书。
片键对查询的影响
如果对key1分片,那么在查询的时候如果按key1为条件查询,那么可以很好的利用分片,但是如果没有将key1作为查询条件,那么所有的分片都会被查询,低效。
片
片就是保存子集合的容器,可以是集群中的某个mongod实例,也可以是一个副本集。所以每个片中只能有一台活跃(主)服务器。
Mongos
mongos是分片中的路由进程,负责与应用程序直接交互,分发客户端请求,并将结果聚合后返回。它本身并不保存数据。
配置服务器
配置服务器存储了分片集群的配置信息:数据和片的对应关系。mongos进程会缓存、同步配置服务器的配置信息。同时,配置服务器并不需要很多空间和资源。
创建分片
启动服务器
- 首先启动配置服务器:
mongod --dbpath 数据目录 --port 端口号
- 启动mongos路由进程,mongos路由进程不需要数据目录,只需要指定配置服务器链接:
mongos --port 端口号 --configdb ip:port
- 启动所有分片实例:
mongod --dbpath 数据目录 --prot 端口号
- 将分片实例添加到集群中:
登录shell,链接mongos进程,使用db.funCommand({addShard:'IP:PORT',allowLocal:true})
上边的allowLocal属性只有在开发环境,也就是单机多个MongoDB实例的时候才会使用,生产中一般不会使用。
- 开启数据库分片功能
使用db.runCommand({'enablesharding':数据库名})
- 设定片键
使用db.runCommand({'shardcollection':'集合名称','key':{key名称:1}})
生产环境配置
上边的操作是在开发环境中的分片配置,但是在生产环境中,需要更加健壮、稳定的配置。需要满足一下条件:
- 多个配置服务器。
- 多个mongos服务器
- 每个片都是一个副本集
- 正确设置w,阻塞复制