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