一、分片
MongoDB使用分片技术来支持大数据集和高吞吐量操作。
1、分片目的
对于单台数据库服务器,庞大的数据量及高吞吐量的应用程序对它而言无疑是个巨大的挑战。频繁的CRUD操作能够耗尽服务器的CPU资源,快速的数据增长也会让硬盘存储无能为力,最终内存无法满足数据需要导致大量的I/O,主机负载严重。为了解决这种问题,mongodb系统主要采用分片技术。
2、MongoDB中的分片集群
分片:一种数据库体系结构,按键范围对数据进行分区,并在两个或多个数据库实例之间分配数据。分片可实现水平缩放。
分片群集:节点集合包括一个分片的MongoDB部署。分片群集由配置服务器,分片和一个或多个mongos
路由进程组成。
MongoDB通过配置分片集群来支持分片,一个分片集群包括以下几个组件:分片,查询路由,配置服务器
- 分片:用来存储数据,一个生产环境的分片集群,通常每个分片是一个副本集。
- 前端路由:指客户端应用访问每个分片的端口。
- 配置服务器:配置服务器存储群集的元数据和配置设置。从MongoDB 3.4开始,配置服务器必须部署为副本集(CSRS)。
3、数据划分
MongoDB的数据划分,是以集合级别为标准。分片通过shard key来划分集合数据。
- shard key:为了对集合分片,你需要指定一个shard key。shard key既可以是集合的每个文档的索引字段也可以是集合中每个文档都有的组合索引字段。MongoDB将shard keys值按照块(chunks)划分,并且均匀的将这些chunks分配到各个分片上。MongoDB主要使用基于范围划分和基于散列划分来划分chunks的。
- 基于范围划分:MongoDB通过shard key值将数据集划分到不同的范围就称为基于范围划分。对于数值型的shard key:你可以虚构一条从负无穷到正无穷的直线(理解为x轴),每个shard key 值都落在这条直线的某个点上,然后MongoDB把这条线划分为许多更小的没有重复的范围成为块(chunks),一个chunk就是就某些最小值到最大值的范围。
- 基于散列划分:MongoDB计算每个字段的hash值,然后用这些hash值建立chunks。
二、分片集群的实现
分片结构端口如下:
-
按照实践4的步骤创建shard1、shard2两个分片,并在配置文件mongodb.cfg中加入
sharding:
clusterRole: shardsvr
创建配置服务器副本集(按照实践4)
- 配置三个configure服务器实例,并且启动。和实践4不同的是mongod.cfg中
sharding:
clusterRole: configsvr
其中端口27022的服务器配置具体mongod.cfg如下:
# mongod.conf # for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data.
storage:
dbPath: C:\cluster\configure\db
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger: # where to write logging data.
systemLog:
destination: file
logAppend: true
path: C:\cluster\configure\log\mongod.log # network interfaces
net:
port:
bindIp: 0.0.0.0 #processManagement: #security: #operationProfiling:# replication:
replSetName: config
sharding:
clusterRole: configsvr ## Enterprise-Only Options: #auditLog: #snmp:
- 配置服务器副本集
cfg = { _id:"config", members:[
{_id:0,host:"192.168.111.131:27022"},
{_id:1,host:"192.168.111.135:27022"},
{_id:2,host:"192.168.111.138:27022"}
]
}
rs.initiate(cfg)
3. 分别配置路由服务器实例,并且启动。
# mongod.conf # for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/ # where to write logging data.
systemLog:
destination: file
logAppend: true
path: C:\cluster\mongos\log\mongod.log # network interfaces
net:
port:
bindIp: 0.0.0.0 #processManagement: #security: #operationProfiling:# #replication:
sharding:
configDB:
config/192.168.111.131:,192.168.111.135:,192.168.111.138: ## Enterprise-Only Options: #auditLog: #snmp:
注意:加粗部分为上一步配置好的configure服务器。
4.使用mongos启动路由服务器实例,连接端口
5.使用如下指令添加复制集shard1和shard2的主副节点作为分片添加到集群中。
sh.addShard("shard1/192.168.111.131:27020,192.168.111.135:27020,192.168.111.138:27020")
sh.addShard("shard2/192.168.111.131:27021,192.168.111.135:27021,192.168.111.138:27021")
注意:添加的ip或主机名要明确是rs.status()上的name