每日一句
Medalist don't grow on trees, you have to nurture them with love, with hard work, with dedication.
金牌选手不会从天而降,你必须用酷爱、刻苦和投入来浇灌他们。
概述
分片(sharding)是一种垮多台机器散布数据的办法,MongoDB应用分片来反对具备十分大的数据集和高吞吐量操作的部署。
分片(sharding)是指将数据拆分,将其扩散存在不同的机器上的过程。有时也用分区(partitioning)来示意这个概念。将数据扩散到不同的机器上,不须要功能强大的大型计算机就能够贮存更多的数据,解决更多的负载。
具备大型数据集或高吞吐量应用程序的数据库系统能够会挑战单个服务器的容量。例如,高查问率会耗尽服务器的CPU容量。工作集大小大于零碎的RAM会强调磁盘驱动器的I / O容量。
有两种解决零碎增长的办法:垂直扩大和程度扩大。
- 垂直扩大意味着减少单个服务器的容量,例如应用更弱小的CPU,增加更多RAM或减少存储空间量。可用技术的局限性可能会限度单个机器对于给定工作负载而言足够弱小。此外,基于云的提供商基于可用的硬件配置具备硬性下限。后果,垂直缩放有理论的最大值。
- 程度扩大意味着划分零碎数据集并加载多个服务器,增加其余服务器以依据须要减少容量。尽管单个机器的总体速度或容量可能不高,但每台机器解决整个工作负载的子集,可能提供比单个高速大容量服务器更高的效率。扩大部署容量只须要依据须要增加额定的服务器,这可能比单个机器的高端硬件的总体老本更低。MongoDB反对通过分片进行程度扩大。
组件
MongoDB分片群集蕴含以下组件:
- 分片(存储):每个分片蕴含分片数据的子集。每个分片都能够部署为正本集。
- Mongos(路由):mongos充当查问路由器,在客户端应用程序和分片集群之间提供接口。
- config servers:配置服务器存储集群的元数据和配置设置。从MongoDB3.4开始,必须将配置服务器部署为正本集(CSRS)
下图形容了分片集群中组件的交互:
MongoDB在汇合级别对数据进行分片,将汇合数据分布在集群中的分片上。
实例
两个分片节点正本集(3+3)+一个配置节点正本集(3)+两个路由节点(2),共11个服务节点。
分片节点正本集的创立
所有的的配置文件都间接放到 sharded_cluster 的相应的子目录上面,默认配置文件名字:mongod.conf
第一套正本集
1 筹备存放数据和日志的目录
#-----------myshardrs01 mkdir -p /mongodb/sharded_cluster/myshardrs01_27018/log \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27018/data/db \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27118/log \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27118/data/db \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27218/log \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27218/data/db
2 新建或批改配置文件:vim /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myshardrs01_27018/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myshardrs01_27018/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27018/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27018 replication: #正本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr
sharding.clusterRole:
Value | Description |
configsvr | Start this instance as a config server. The instance starts on port 27019 by default. |
shardsvr | Start this instance as a shard. The instance starts on port 27018 by default. |
留神:
设置sharding.clusterRole须要mongod实例运行复制。 要将实例部署为正本集成员,请应用
replSetName设置并指定正本集的名称。
3 新建或批改配置文件: vim /mongodb/sharded_cluster/myshardrs01_27118/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myshardrs01_27118/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myshardrs01_27118/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27118/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27118 replication: #正本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr
4 新建或批改配置文件: vim /mongodb/sharded_cluster/myshardrs01_27218/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myshardrs01_27218/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myshardrs01_27218/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27218/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27218 replication: #正本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr
5 启动第一套正本集:一主一副本一仲裁
顺次启动三个mongod服务:
/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27118/mongod.conf/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27218/mongod.conf
6 初始化正本集和创立主节点
应用客户端命令连贯任意一个节点,但这里尽量要连贯主节点: /usr/yltrcc/mongodb/bin/mongo --host 180.76.159.126 --port 27018
执行命令:
# 初始化正本集> rs.initiate()# 查看正本集状况myshardrs01:SECONDARY> rs.status()# 主节点配置查看myshardrs01:PRIMARY> rs.conf()
7 增加正本节点和仲裁节点
# 增加从节点myshardrs01:PRIMARY> rs.add("180.76.159.126:27118")# 增加仲裁节点myshardrs01:PRIMARY> rs.addArb("180.76.159.126:27218")# 查看配置状况myshardrs01:PRIMARY> rs.conf()
第二套正本集
1 筹备存放数据和日志的目录
#-----------myshardrs01 mkdir -p /mongodb/sharded_cluster/myshardrs01_27318/log \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27318/data/db \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27418/log \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27418/data/db \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27518/log \ & mkdir -p /mongodb/sharded_cluster/myshardrs01_27518/data/db
2 新建或批改配置文件:vim /mongodb/sharded_cluster/myshardrs01_27318/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myshardrs01_27318/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myshardrs01_27318/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27318/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27318 replication: #正本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr
3 新建或批改配置文件: vim /mongodb/sharded_cluster/myshardrs01_27418/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myshardrs01_27418/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myshardrs01_27418/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27418/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27418 replication: #正本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr
4 新建或批改配置文件: vim /mongodb/sharded_cluster/myshardrs01_27518/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myshardrs01_27518/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myshardrs01_27518/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27518/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27518 replication: #正本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr
5 启动第一套正本集:一主一副本一仲裁
顺次启动三个mongod服务:
/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27318/mongod.conf/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27418/mongod.conf/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27518/mongod.conf
6 初始化正本集和创立主节点
应用客户端命令连贯任意一个节点,但这里尽量要连贯主节点: /usr/yltrcc/mongodb/bin/mongo --host 180.76.159.126 --port 27318
执行命令:
# 初始化正本集> rs.initiate()# 查看正本集状况myshardrs01:SECONDARY> rs.status()# 主节点配置查看myshardrs01:PRIMARY> rs.conf()
7 增加正本节点和仲裁节点
# 增加从节点myshardrs01:PRIMARY> rs.add("180.76.159.126:27418")# 增加仲裁节点myshardrs01:PRIMARY> rs.addArb("180.76.159.126:27518")# 查看配置状况myshardrs01:PRIMARY> rs.conf()
配置节点正本集创立
1 筹备存放数据和日志的目录
#-----------myshardrs01 mkdir -p /mongodb/sharded_cluster/myconfigrs_27019/log \ & mkdir -p /mongodb/sharded_cluster/myconfigrs_27019/data/db \ & mkdir -p /mongodb/sharded_cluster/myconfigrs_27119/log \ & mkdir -p /mongodb/sharded_cluster/myconfigrs_27119/data/db \ & mkdir -p /mongodb/sharded_cluster/myconfigrs_27219/log \ & mkdir -p /mongodb/sharded_cluster/myconfigrs_27219/data/db
2 新建或批改配置文件:vim /mongodb/sharded_cluster/myconfigrs_27019/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myconfigrs_27019/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myconfigrs_27019/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myconfigrs_27019/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27019 replication: #正本集的名称 replSetName: myconfigrssharding: #分片角色 clusterRole: configsvr
3 新建或批改配置文件: vim /mongodb/sharded_cluster/myconfigrs_27119/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myconfigrs_27119/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myconfigrs_27119/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myconfigrs_27119/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27119replication: #正本集的名称 replSetName: myconfigrssharding: #分片角色 clusterRole: configsvr
4 新建或批改配置文件: vim /mongodb/sharded_cluster/myconfigrs_27219/mongod.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/myconfigrs_27219/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/myconfigrs_27219/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/myconfigrs_27219/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27219 replication: #正本集的名称 replSetName: myconfigrssharding: #分片角色 clusterRole: configsvr
5 启动第一套正本集:一主一副本一仲裁
顺次启动三个mongod服务:
/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27019/mongod.conf/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27119/mongod.conf/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27219/mongod.conf
6 初始化正本集和创立主节点
应用客户端命令连贯任意一个节点,但这里尽量要连贯主节点: /usr/yltrcc/mongodb/bin/mongo --host 180.76.159.126 --port 27219
执行命令:
# 初始化正本集> rs.initiate()# 查看正本集状况myshardrs01:SECONDARY> rs.status()# 主节点配置查看myshardrs01:PRIMARY> rs.conf()
7 增加两个正本节点
# 增加从节点myshardrs01:PRIMARY> rs.add("180.76.159.126:27119")myshardrs01:PRIMARY> rs.add("180.76.159.126:27219")# 查看配置状况myshardrs01:PRIMARY> rs.conf()
路由节点的创立
第一个路由节点
1 筹备存放数据和日志的目录
#-----------mongos01mkdir -p /mongodb/sharded_cluster/mymongos_27017/log
2 新建或批改配置文件:vi /mongodb/sharded_cluster/mymongos_27017/mongos.conf
systemLog: #MongoDB发送所有日志输入的指标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的门路 path: "/mongodb/sharded_cluster/mymongos_27017/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅实用于mongod。 dbPath: "/mongodb/sharded_cluster/mymongos_27017/data/db" journal: #启用或禁用持久性日志以确保数据文件放弃无效和可复原。 enabled: true processManagement: #启用在后盾运行mongos或mongod过程的守护过程模式。 fork: true #指定用于保留mongos或mongod过程的过程ID的文件地位,其中mongos或mongod将写入其PID pidFilePath: "/mongodb/sharded_cluster/mymongos_27017/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,正本集初始化的时候,节点名字会主动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: localhost,192.168.0.2 #bindIp #绑定的端口 port: 27017 sharding: #指定配置节点正本集 configDB: myconfigrs/180.76.159.126:27019,180.76.159.126:27119,180.76.159.126:27219
3 启动mongod服务:
/usr/yltrcc/mongodb/bin/mongod -f /mongodb/sharded_cluster/mymongos_27017/mongos.conf
4 客户端登录mongos: /usr/yltrcc/mongodb/bin/mongo --host 180.76.159.126 --port 27017
通过路由节点操作,当初只是连贯了配置节点,还没有连贯分片数据节点,因而无奈写入业务数据。
5 在路由节点上进行分片配置操作
增加分片:sh.addShard("IP:Port")
# 增加第一套正本集sh.addShard("myshardrs01/192.168.0.2:27018,180.76.159.126:27118,180.76.159.126:2 7218")# 增加第二套正本集sh.addShard("myshardrs02/192.168.0.2:27318,180.76.159.126:27418,180.76.159.126:2 7518")
提醒:如果增加分片失败,须要先手动移除分片,查看增加分片的信息的正确性后,再次增加分片。
移除分片参考(理解):
use admin db.runCommand( { removeShard: "myshardrs02" } )
开启分片性能: sh.enableSharding("库名")
、sh.shardCollection("库名.汇合名",{"key":1})
在mongos上的articledb数据库配置sharding
sh.enableSharding("articledb")# 查看分片状态 sh.status()
汇合分片: 对汇合分片,你必须应用 sh.shardCollection()
办法指定汇合和分片键。
语法格局:sh.shardCollection(namespace, key, unique)
参数阐明:
Parameter | Type | Description |
namespace | string | 要(分片)共享的指标汇合的命名空间,格局: <database>.<collection> |
key | document | 用作分片键的索引标准文档。shard键决定MongoDB如何在shard之间散发文档。除非汇合为空,否则索引必须在shard collection命令之前存在。如果汇合为空,则MongoDB在对汇合进行分片之前创立索引,前提是反对分片键的索引不存在。简略的说:由蕴含字段和该字段的索引遍历方向的文档组成。 |
unique | boolean | 当值为true状况下,片键字段上会限度为确保是惟一索引。哈希策略片键不反对惟一索引。默认是false。 |
6 分片后插入数据测试
7 减少另一个路由节点
美文佳句
电影散场,影院里的观众皆唏嘘而去。我和太太看到最初,直到音乐的休止落下、字幕拉到最底部。我仿佛不能残缺记住险象环生的情节,但那印度电影的唯美音乐,和尽管处于隐线却素来没有放弃追赶的恋情,让我喜爱和回味。
你好,我是yltrcc,日常分享技术点滴,欢送关注我的公众号:ylcoder