一、MongoDB分片介绍
MongoDB是一款开源的跨平台文档数据库,它提供了一个非常强大的分布式架构方案来处理大规模的数据集和超大规模的访问需求,这就是MongoDB分片。分片是MongoDB的水平扩展方式,通过将单个MongoDB集合的数据分布在多个Shard节点上,提高了云端MongoDB服务的可用性、扩展性和性能。
1.1 分片架构图
如下是一张MongoDB分片的架构图:
+-------+
| Router|
+-------+
|
v
+---------------------------------------+
| | |
+------+ +------+ +------+
|Shard1| |Shard2| |Shard3|
+------+ +------+ +------+
| | |
v v v
+----------------+ +----------------+ +----------------+
| RS1-Primary | | RS2-Primary | | RS3-Primary |
+----------------+ +----------------+ +----------------+
| | |
v v v
+------------+ +------------+ +-----------+
|RS1-Secondary| |RS2-Secondary| |RS3-Secondary|
+------------+ +------------+ +-----------+
二、MongoDB分片策略
2.1 分片键
MongoDB分片策略是通过分片键来达到数据分布的目的的。分片键是一个文档字段或者是包含了多个文档字段的组合,用于将数据分片到MongoDB集合的多个Shard节点上。例如,我们可以根据用户的_id字段进行数据分片,这样相同_id的用户数据会被保存在同一个Shard节点上。
2.2 Chunk切分
为了达到真正的分布式系统的数据均衡,MongoDB通过把数据分解成许多小块(Chunk),再把这些小块分布到许多MongoDB实例上来实现数据的平衡。Chunk是指集合中一段连续的数据区间,每个Chunk默认的大小为64MB。当一个Chunk达到这个大小时,MongoDB就会把它劈成两个更小的Chunk并把其中一个移动到另外一个Shard节点上。
2.3 均衡数据
在初次分片数据之后,MongoDB将会尽量保持均衡的分配Chunk到各个节点上。MongoDB会跟踪Chunk的统计信息来调整哪些Shard节点可以拥有更多的Chunk。如果某个Shard节点的数据过多,MongoDB会把一些Chunk移动到其他Shard节点,以达到均衡分片。
2.4 读写分离
MongoDB分片集群还包括了读写分离的能力,Router会把所有的读、写请求路由到对应的Shard节点,对于只读操作,MongoDB会根据一些负载均衡策略权衡各个Shard节点来缩短查询时间以及增强查询并发性。