前言
分片概述
分片主要是将数据进行划分后,将它们分别存放于不同机器上的过程。通过使用分片可以实现降低单个机器的压力和处理更大的数据负载功能。分片与副本集主要区别在于,分片是每个节点存储数据的不同片段,而副本集是每个节点存储数据的相同副本。
分片策略
MongoDB之所以能够实现自动分片,这是因为其内置了分片策略。MongoDB通过分片键(ShardKey)将集合中的数据划分为多个块(Chunk)(默认大小为64MB,每个块均表示集合中数据的一部分),然后MongoDB根据分片策略将划分的块分发到分片集群中。需要注意,分片键可以是集合文档中的一个或多个字段。
MongoDB的分片策略主要包括范围分片和哈希分片两种,介绍如下:
哈希分片(Hash Sharding)
哈希分片类似于范围分片,两者的区别在于范围分片是MongoDB根据分片键的值直接进行范围划分,而哈希分片则先将分片键的值进行哈希计算后,然后对这些哈希值进行范围划分,从而使得每个分片都包含了哈希值在一定范围内的数据;范围分片可以支持复合分片键,而哈希分片只支持单个字段作为分片键。哈希值的随机性,使得数据随机分布在分片集群中不同分片服务器上。下面,通过一张图介绍哈希分片策略,如图所示。
范围分片
MongoDB根据分片键的值范围将数据划分为不同块,每个分片都包含了分片键在一定范围内的数据。这样的话,若有文档写入时,MongoDB会根据该文档的分片键,从而交由指定分片服务器去处理。下面,通过一张图来介绍范围分片策略,具体如图所示。
分片架构
从图中可以看出,分片集群中主要由三个部分组成,即分片服务器( Shard )、路由服务器
( Mongos )以及配置服务器( Config Server )组成。其中,分片服务器有三个,即 Shard1 、
Shard2 、 Shard3 ;路由服务器有两个,即 Mongos1 和 Mongos2 ;配置服务器有三个,即主、副、副。主要有如下所述三个主要组件:
Shard: 用于存储实际的数据块,实际生产环境中一个shard server 角色可由几台机器组个一个 replica set 承担,防止主机单点故障
Config Server: mongod实例,存储了整个 ClusterMetadata ,其中包括 chunk 信息。
Query Routers: 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。