MongoDB分片集群 Shard Cluster

文章目录
1. 什么是分片
分片()是用来将大型集合水平分割到不同服务器(或者复制集)上所采用的方法 。不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载 。
2. 为什么要分片 存储容量需求超出单机磁盘容量 。活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能 。IOPS超出单个节点的服务能力,随着数据的增长,单机实例的瓶颈会越来越明显 。副本集具有节点数量限制 。
垂直扩展:增加更多的CPU和存储资源来扩展容量 。
水平扩展:将数据集分布在多个服务器上 。水平扩展即分片 。
3. 分片的工作原理
分片集群由以下3个服务组成:
: 每个shard由一个或多个进程组成,用于存储数据 。
: 数据库集群的请求入口,所有请求都通过()进行协调,不需要在应用程序添加一个路由选择器,()就是一个请求分发中心它负责把应用程序的请求转发到对应的 Shard服务器上 。
: 配置服务器 。存储所有数据库元信息(路由、分片)的配置 。
片键(shard key)
为了在数据集合中分配文档,使用分片主键分割集合 。
区块(chunk)
在一个shard 内部,还是会把数据分为,每个chunk代表这个shard 内部一部分数据 。分割分片数据到区块,每一个区块包含基于分片主键的左闭右开的 区间范围 。
分片策略
范围分片是基于分片主键的值切分数据,每一个区块将会分配到一个范围 。
范围分片适合满足在一定范围内的查找,例如查找X的值在[20,30)之间的数据,mongo 路由根据 中存储的元数据,可以直接定位到指定的shard的Chunk中 。
缺点: 如果shard key有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法扩展写的能力 。
Hash分片是计算一个分片主键的hash值,每一个区块将分配一个范围的hash值 。
Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围 分片的不足,缺点是不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找 出满足条件的文档 。
数据库中没有比较合适的片键供选择,或者是打算使用的片键基数太小(即变化少如星期只有7天 可变化),可以选另一个字段使用组合片键,甚至可以添加冗余字段来组合 。一般是粗粒度+细粒 度进行组合 。

MongoDB分片集群 Shard Cluster

文章插图
无非从两个方面考虑,数据的查询和写入,最好的效果就是数据查询时能命中更少的分片,数据写入时 能够随机的写入每个分片,关键在于如何权衡性能和负载 。
4. 分片集群搭建
4.1 配置 并启动 节点集群
节点1 -17017.conf
# 数据库文件位置 dbpath=/usr/local/mongodb/config/config1 #日志文件位置 logpath=/usr/local/mongodb/config/logs/config1.log # 以追加方式写入日志 logappend=true# 是否以守护进程方式运行 fork = true bind_ip=0.0.0.0port = 17017# 表示是一个配置服务器 configsvr=true #配置服务器副本集名称 replSet=configsvr
节点2 -17018.conf
# 数据库文件位置 dbpath=/usr/local/mongodb/config/config2#日志文件位置 logpath=/usr/local/mongodb/config/logs/config2.log # 以追加方式写入日志 logappend=true# 是否以守护进程方式运行 fork = true bind_ip=0.0.0.0port = 17018# 表示是一个配置服务器 configsvr=true #配置服务器副本集名称 replSet=configsvr
节点3 -17019.conf
# 数据库文件位置 dbpath=/usr/local/mongodb/config/config3 #日志文件位置 logpath=/usr/local/mongodb/config/logs/config3.log # 以追加方式写入日志 logappend=true# 是否以守护进程方式运行 fork = true bind_ip=0.0.0.0port = 17019# 表示是一个配置服务器 configsvr=true #配置服务器副本集名称 replSet=configsvr