分片是 MongoDB 用来将大型集合分割到不同服务器(或者说一个集群)上所采取的方法。
分片是集群中负责数据某一子集的一台或多台服务器
目标
- 集群无感知:采用proxy模式,MongoDB 自带了 mongos 专有路由进程,对应用的请求进行转发。
- 可用性: 通过冗余存储,以便当一个进程/机器/数据中心宕机了,其他副本能够接替其工作。
- 可扩展性:MongoDB支持按需扩充系统容量。
自动化分片
MongoDB 能自动维护数据在不同服务器之间的平衡。
为了在分区间均匀地分配数据,MongoDB 会在不同分片间移动数据子集。会根据片键来决定移动哪些数据。
分片逻辑
当一个块变得越来越大时,MongoDB会自动将其分割为 两个较小的块。如果分片间比例失调,则MongoDB会通过迁移块来确保均衡。
如果存在多个可用的分片,只要块的数量足够多,MongoDB就会把数据迁移到其他分片上。这个迁移过程就做平衡,由叫做平衡器的进程负责执行。
平衡器的目标不仅是要保持数据均匀分布,还要最小化被移动的数据量。
升序片键
所有的数据总是被添加到最后一个数据块上,即所有数据都会被添加到一个分片上,这个片键创造了一个单一且不可分散的热点。
随机分片
mongos
mongos是用户和集群间的交互点,其职责是隐藏分片内部的复杂性并向用户提供一个简洁的单服务器接口。
集群
一个MongoDB集群有三类进程组成,即实际存储数据的分片、负责把请求路由到正确数据的 mongos 进程,以及用于追踪集群状态的配置服务器。