分片概念数据库
若是把MongoDB只是当作一台服务器在使用,每一个mongod实例都包含应用程序数据的完整副本.就算是使用了复制,每一个副本也都是完整克隆了其余副本的数据.对于大多数应用程序而言,在一台服务器上保存完整数据是彻底能够接收的.服务器
可是随着数据量的增加,以及应用程序对读写吞吐量的要求愈来愈高.普通服务器渐渐显得捉襟见肘了,尤为是这些服务器可能没法分配足够的内存.或者没有足够的CPU 核数来有效的处理工做负荷.除此以外,随着数据量的增加,要在一块网络
磁盘或一组RAID阵列上保存和管理备份如此大规模的数据集也变得不太现实了,若是还想继续使用普通硬件或者虚拟硬件来托管数据库,那么针对这类问题的解决方案就是将数据库分布在多台服务器上,这种方法称为分片.spa
分片组件设计
分片集群由分片,mongos路由器和配置服务器组成.接口
- 分片 MongoDB 分片集群将数据分布在一个或多个分片上,每一个分片都部署成一个MongoDB副本集,该副本集保存了集群总体数据的一部分.由于每一个分片都是一个副本集.因此它们拥有本身的复制机制,可以自动进行故障转移.你能够直接链接大哥分片,就像链接单独的副本集那样,可是若是链接的副本集是分片集群的一部分,那么你只能看到部分数据
- mongos路由器 若是每一个分片都包含部分集群数据,那么还须要一个接口链接整个集群,这个就是mongos.mongos进程是一个路由器,将全部的读写请求指引到合适的分片上,若是此以来,mongos为客户端提供了一个合理的系统视图,mongos进程是轻量级且非持久化的,它们一般运行于与应用服务器相同的机器上,确保对任意分片的请求只通过依次网络跳转,换而言之,应用程序链接本地的mongos,而mongos管理了指向单独分片的链接.
- 配置服务器 若是mongos进程是非持久化的,那么必须有地方能持久保存集群的公认状态,这就是配置服务器的工做,其中持久化了分片集群的元数据,该数据包括:全局集群的配置;每一个数据库,集合和特定范围数据的位置;一份变动记录,保存了数据在分片之间进行迁移的历史信息.配置服务器中保存的元数据是某些特定功能和集群维护的重中之重
核心分片操做进程
- 分片一个集合 MongoDB的分片是基于范围的,也就是说分片集合里面的每一个文档都必须落在指定键的某个范围内,MongoDB使用的所谓的分片键让每一个文档在这些范围里找到本身的位置.位于一个分片中的一段连续的分片键范围称为块,块是逻辑上的划分,非物理上的,换而言之,块并非磁盘上的连续文档.
- 拆分与迁移 分片机制的核心就是块的拆分和迁移 在初始化分片集群的时候只存在一个块,这个块的范围涵盖了整个分片集合,当这个块的大小达到某个阀值时会对块进行拆分,默认块的最大尺寸是64MB或者100000个文档,先达到哪一个标准就以哪一个为准,在向新的分片集群添加数据时,原始的块最终会达到某个阀值,触发块的拆分,这是个简单的操做,基本就是把原来的范围一分为二,这样就有了两个块,每一个块都有相同数量的文档,须要注意的是块的拆分是个逻辑操做,当MongoDB进行块拆分时,它只是修改块的元数据就能让一个块变成两个块,所以,拆分一个块并不影响分片集合里面文档的物理顺序,也就是说拆分既简单有快捷,设计分片系统最大的困难就是保证数据始终均匀分布,MongoDB的分片集群是经过在分片中移动块来实现均衡的,这个操做称为迁移,这是一个真实的物理操做.迁移是由名为均衡器的(balancer)的软件进程管理的,它的任务就是确保数据在各个分片中保存均匀分布,经过跟踪各个分片上块的数量,就能实现这个功能,当集群中拥有块的最多的分片与拥有块最少的分片的块数差大于8时,均衡器就会发起依次均衡处理,在均衡处理的过程当中,块会从块较多的分片迁移到块较少的分片上,直到两个分片的块数大体相等为止.