目录
MongoDB学习(六):集群之复制集 提到,复制集(副本集)在数据量过大,以至于无法全部装载到内存中时,分布式架构也很难提升系统性能。MongoDB的方案是分片。
1 概念
所谓分片,就是将大数据集分割为较小的数据集的过程。之前使用MongoDB的过程中,无论是单节点 or 复制集,每个服务器都保存了全量数据。这就带来两个问题:首先,随着数据增长,单台服务器的处理能力逐渐到达极限(内存无法装下所有数据);其次,由于数据过大,新节点进行初始化的全量同步时,很可能出现卡死的问题(I/O导致CPU不足)。
分片集群的相关组件如下:
- 分片(Shards):每个分片存储了完整数据的一部分,实际是一个单节点服务器or复制集。只有路由和管理员可以直接访问分片。
- 路由(Routers):存储了集群元数据,用来查找操作的数据在哪个分片上。
- 配置服务器(Config Servers):持久化集群元数据,例如每个分片存储了哪部分数据。
另一个问题是,MongoDB分片的粒度。在MongoDB中,有数据库、集合、文档等结构,实际上,在集合和文档之间,还存在一中名为“块”的概念,指的是根据一个或多个字段(称为分片键)的值聚集的一系列文档。分片是在数据库和块这两级上进行的。
实际上,数据库级的分片是手动的,即我们必须保证每个分片上的每个数据库所包含的数据都大致均衡。如果有某个数据库存放了过多数据,就需要对其进行分库。
在块上的分片则是自动进行的,根据指定的分片键的值,将整个值域分割为多个区间,每个区间映射到一个分片上。例如一共分两个片,分片键的值以A~Z开头,那么可能A~E分到分片1,F~J分到分片2……
2 建立分片集
建立分片集的步骤如下,这里以两个分片为例: