MongoDB 分片集群架构详解
1. 分片简介
分片(shard) 是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。
分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于 MongoDB 本身就自带了分片管理的能力。
1.1 为什么要使用分片
MongoDB 复制集实现了数据的多副本及高可用,但是一个复制集能承载的容量和负载是有限的。
在你遇到下面的场景时,就需要考虑使用分片了:
- 存储容量需求超出单机的磁盘容量。
- 活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能。
- 写IOPS超出单个 MongoDB 节点的写服务能力
1.2 垂直扩容(Scale Up)VS 水平扩容(Scale Out)
- 垂直扩容:用更好的服务器,提高 CPU 处理核数、内存数、带宽数等。
- 水平扩容:将任务分配到多台计算机上。
2. 分片集群架构
MongoDB 分片集群(Sharded Cluster)是对数据进行水平扩展的一种方式。MongoDB 使用分片集群支持大数据集和高吞吐的业务场景。在分片模式下,存储不同的切片数据的节点被称为分片节点,一个分片集群包含了多个分片节点。除了分片节点,集群中还需要一些配置节点、路由节点,以保证分片机制的正常运作。
2.1 核心概念
2.1.1 数据分片
分片用于存储真正的数据,并提供最终的数据读写访问。分片仅仅是一个逻辑的概念,它可以是一个单独的 MongoDB 实列,也可以是一个复制集。图中的 Shard 1、Shard 2 都是复制集分片。在生产环境中一般会使用复制集的方式,这是为了防止数据节点出现单点故障。
2.1.2 配置服务器(config Server)
配置服务器包含多个节点,并组成一个复制集结构,对应于图中的 ConfigReplSet。配置复制集中保存了整个分片集群中的元数据,其中包含各个集合的分片策略,以及分片的路由表等。
2.1.3 查询路由(mongos)
mongos 是分片集群的访问入口,其本身并不持久化数据。mongos 启动之后,会从配置服务器中加载元数据,之后 mongos 开始提供访问服务,并将用户的请求正确路由到对应的分片。在分片集群中可以部署多个 mongos 以分担客户端的压力。
3. 环境搭建
3.1 分片集群搭建
3.2 使用 mtools 搭建分片集群
4. 使用分片集群
为了使集合支持分片,需要先开启 database 的分片功能
sh.enableSharding("shop")
执行 shardCollection 命令,对集合执行分片初始化
sh.shardCollection("shop.product",{productId:"hashed"},false,{numInitialChunks:4})
shop.product集合将productId作为分片键,并采用了哈希分片策略,除此以外,
“numInitialChunks:4”表示将初始化4个chunk。 numInitialChunks必须和哈希分片策略配合使
用。而且,这个选项只能用于空的集合,如果已经存在数据则会返回错误。
4.1 向分片集合写入数据
向 shop.product 集合写入一批数据
db=db.getSiblingDB("shop");
var count=0;
for(var i=0;i<1000;i