第6章 分片
6.1 分片集群架构
6.1.1 分片简介
分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于,MongoDB本身就自带了分片管理的能力,对于开发者来说可以做到开箱即用。
为什么要分片?
我们知道,MongoDB副本集实现了数据的多副本复制及高可用,但是一个副本集能承载的容量和负载是有限的。在你遇到下面的场景时,就需要考虑使用分片了。
● 存储容量需求超出单机的磁盘容量。
● 活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能。
● 写IOPS超出单个MongoDB节点的写服务能力。
6.1.2 分片集群架构
在分片模式下,存储这些不同的切片数据的节点被称为分片节点,一个分片集群(shard cluster)内则包含了多个分片节点。当然,除了分片节点,集群中还需要一些配置节点、路由节点,以保证分片机制的正常运作。
图6-1所示是一个典型的分片集群架构。
图6-1 分片集群架构
架构说明
● 数据分片:分片用于存储真正的数据,并提供最终的数据读写访问。分片仅仅是一个逻辑的概念,它可以是一个单独的mongod实例,也可以是一个副本集。图6-1中的Shard0、Shard1都是一个副本集分片。在生产环境中也一般会使用副本集的方式,这是为了防止数据节点出现单点故障。
● 配置服务器(Config Server):配置服务器包含多个节点,并组成一个副本集结构,对应于图6-1中的ConfigReplSet。配置副本集中保存了整个分片集群中的元数据,其中包含各个集合的分片策略,以及分片的路由表等。
● 查询路由(mongos):mongos是分片集群的访问入口,其本身并不持久化数据。mongos启动后,会从配置服务器中加载元数据。之后mongos开始提供访问服务,并将用户的请求正确路由到对应的分片。在分片集群中可以部署多个mongos以分担客户端请求的压力。