为什么需要分片
应用层实现的手动分片:
MongoDB分片组件
mongos路由器负责将应用程序的请求指引到合适的分片上。注意到mongos路由器是在应用程序端实现的,因此分片的配置信息需要保存在另外的服务器上,即配置服务器。mongos通过两阶段提交同步更新最新的分片信息。
核心分片操作
Mongo的分片是基于集合的分片,即一个集合中的文档可以分布在不同的机器上。在对集合进行分片时,必须声明一个或多个字段作为分片键,如果选择_id,那么文档会基于对象ID的范围进行分布,由于Mongo的_id字段与时间戳相关,导致该字段是递增的,这样会使得分片不够随机,所以我们可以联合其他字段,比如usernama,与_id组成复合分片键。在讲具体的分片操作之前,我们需要明晰一个概念:
块
块是一个分片中一段连续的分片键的范围。注意,块是一个逻辑概念,块内的分片键是连续的,但物理上,块并不是连续的文档。
比如,如果一个从harris到norris的块存在于分片A上,这代表可以在分片A上找到这个范围的键,而并不代表从harris到norris的文档在分片A上是连续存储的。
拆分与迁移操作
在初始化分片集群时,只有一个块,这个块的范围覆盖了整个分片集群,随着数据的插入,我们不断更新这个块的范围的最大值和最小值。当块大小达到阈值(默认块的最大大小为64MB和100000个文档,先达到哪个就按哪个作为阈值),就会对块进行拆分,拆分很简单,就是对原来的范围一分为二,分为两个块,拆分过程不涉及任何的物理移动,仅仅是逻辑上对块的元数据进行更新。
当这个分片中的块越来越多时,就会由一个名为均衡器的软件进程,将块在不同分片上进行物理迁移。通常来说,当集群中拥有块最多的分片与拥有块最少的分片的块数差大于8时,均衡器就会进行一次均衡处理,块从块较多的分片迁移到块少的分片,直到两个分片的块数大致相等为止。