文章目录
分片集群
分片是一种跨多台机器分布数据的方法,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。
换句话说:分片就是将数据拆分,将其分散到不同的机器上的过程。
分片包含的组件
分片(存储):每个分片包含分片数据的子集。每个分片都可以部署为副本集。
mongos(路由):mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口。
config servers("调度"的配置):配置服务器存储群集的元数据和配置设置。
第一套副本集
准备存放数据和日志的目录
#--------------------myshardrs01 mkdir -p /Users/didi/xzy/sharded_cluster/myshardrs01_27018/log mkdir -p /Users/didi/xzy/sharded_cluster/myshardrs01_27018/data/db mkdir -p /Users/didi/xzy/sharded_cluster/myshardrs01_27118/log mkdir -p /Users/didi/xzy/sharded_cluster/myshardrs01_27118/data/db mkdir -p /Users/didi/xzy/sharded_cluster/myshardrs01_27218/log mkdir -p /Users/didi/xzy/sharded_cluster/myshardrs01_27318/data/db
新建或修改配置文件
vim /Users/didi/xzy/sharded_cluster/myshardrs01_27018/mongod.conf
Myshardrs01_27018
systemLog: #MongoDB发送所有日志输出的目标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径 path: "/Users/didi/xzy/sharded_cluster/myshardrs01_27018/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 logAppend: true storage: #mongod实例存储其数据的目录,storage.dbPath设置仅适用于mongod。 dbPath: "/Users/didi/xzy/sharded_cluster/myshardrs01_27018/data/db" journal: #启用或禁用持久性日志以确保数据文件保持有效和可恢复。 enabled: true processManagement: #启用在后台运行mongos或mongod进程的守护进程模式 fork: true #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID pidFilePath: "/Users/didi/xzy/sharded_cluster/myshardrs01_27018/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip #bindIpAll:true #服务实例绑定的IP bindIp: localhost #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设置并指定副本集的名称。
第二个服务:
新建或修改配置文件:
vim /Users/didi/xzy/sharded_cluster/myshardrs01_27118/mongod.conf
Myshardrs01_27118
systemLog: #MongoDB发送所有日志输出的目标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径 path: "/Users/didi/xzy/sharded_cluster/myshardrs01_27118/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 logAppend: true storage: #mongod实例存储其数据的目录,storage.dbPath设置仅适用于mongod。 dbPath: "/Users/didi/xzy/sharded_cluster/myshardrs01_27118/data/db" journal: #启用或禁用持久性日志以确保数据文件保持有效和可恢复。 enabled: true processManagement: #启用在后台运行mongos或mongod进程的守护进程模式 fork: true #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID pidFilePath: "/Users/didi/xzy/sharded_cluster/myshardrs01_27118/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip #bindIpAll:true #服务实例绑定的IP bindIp: localhost #bindIp #绑定的端口 port: 27118 replication: #副本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr
第三个服务:
新建或修改配置文件:
vim /Users/didi/xzy/sharded_cluster/myshardrs01_27218/mongod.conf
Myshardrs01_27218
systemLog: #MongoDB发送所有日志输出的目标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径 path: "/Users/didi/xzy/sharded_cluster/myshardrs01_27218/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 logAppend: true storage: #mongod实例存储其数据的目录,storage.dbPath设置仅适用于mongod。 dbPath: "/Users/didi/xzy/sharded_cluster/myshardrs01_27218/data/db" journal: #启用或禁用持久性日志以确保数据文件保持有效和可恢复。 enabled: true processManagement: #启用在后台运行mongos或mongod进程的守护进程模式 fork: true #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID pidFilePath: "/Users/didi/xzy/sharded_cluster/myshardrs01_27218/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip #bindIpAll:true #服务实例绑定的IP bindIp: localhost #bindIp #绑定的端口 port: 27218 replication: #副本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr
第二个副本集
创建三个服务,将端口和存储路径以及副本集名称改为myshardrs02即可,其他都相同
配置集
同样创建三个服务
新建或修改配置文件:
vim /Users/didi/xzy/sharded_cluster/myconfigrs_27019/mongod.conf
Myconfigrs_27019:
systemLog: #MongoDB发送所有日志输出的目标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径 path: "/Users/didi/xzy/sharded_cluster/myconfigrs_27019/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 logAppend: true storage: #mongod实例存储其数据的目录,storage.dbPath设置仅适用于mongod。 dbPath: "/Users/didi/xzy/sharded_cluster/myconfigrs_27019/data/db" journal: #启用或禁用持久性日志以确保数据文件保持有效和可恢复。 enabled: true processManagement: #启用在后台运行mongos或mongod进程的守护进程模式 fork: true #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID pidFilePath: "/Users/didi/xzy/sharded_cluster/myconfigrs_27019/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip #bindIpAll:true #服务实例绑定的IP bindIp: localhost #bindIp #绑定的端口 port: 27019 replication: #副本集的名称 replSetName: myconfigrs sharding: #分片角色 clusterRole: configsvr
初始化副本集
与上面连接节点处相同
但是配置集中不需要添加仲裁节点,将两个节点以从节点的方式加入即可。
路由集
是mongos的服务,不是mongod的服务
第一步:准备存放日志的目录:
#-------------------mongos01 路由节点不存放数据,所以不需要存放数据的目录 mkdir /Users/didi/xzy/sharded_cluster/mymongos_27019/log
Mymongos_27017:
新建或修改配置文件:
vim /Users/didi/xzy/sharded_cluster/mymongos_27017/mongos.conf
mongos.conf
systemLog: #MongoDB发送所有日志输出的目标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径 path: "/Users/didi/xzy/sharded_cluster/mymongos_27017/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 logAppend: true storage: #mongod实例存储其数据的目录,storage.dbPath设置仅适用于mongod。 dbPath: "/Users/didi/xzy/sharded_cluster/mymongos_27017/data/db" journal: #启用或禁用持久性日志以确保数据文件保持有效和可恢复。 enabled: true processManagement: #启用在后台运行mongos或mongod进程的守护进程模式 fork: true #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID pidFilePath: "/Users/didi/xzy/sharded_cluster/mymongos_27017/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip #bindIpAll:true #服务实例绑定的IP bindIp: localhost #bindIp #绑定的端口 port: 27017 sharding: #指定配置节点副本集 configDB: myconfigrs/localhost:27019,localhost:27119,localhost:27219
启动mongos:
mongoa -f /Users/didi/xzy/sharded_cluster/mymongos_27017/mongos.conf
此时路由还不能找到分片,所要要添加分片到路由中。
使用命令添加分片:
(1)添加分片:
语法:
sh.addShard("IP:Port")
将第一套副本集添加进来:
mongos> sh.addShard("myshardrs01/localhost:27018,localhost:27118,localhost:27218") #---------------查看分片状况情况 sh.status()
将第二套副本集添加进来:
mongos> sh.addShard("myshardrs01/localhost:27318,localhost:27418,localhost:27518") #---------------查看分片状况情况 sh.status()
(2)开启分片功能
sh.enableSharding(“库名”)、sh.shardCollection(“库名.集合名”,{“key”:1})
sh.enableSharding("")
(3)集合分片
对集合分片,必须使用sh.shardCollection()方法指定集合和分片键
语法:
sh.shardCollection(namespace,key,unique)
Parameter | Type | Description |
namespace | string | 要(分片)共享对目标集合对命名空间,格式:. |
key | document | 用作分片键对所以规则文档。shard键决定MongoDB如何在shard之间分法文档。除非集合为空,否则索引必须在shard collection命令之前存在。如果集合为空,则MongoDB在对集合进行分片之前创建索引,前提是支持分片键的索引不存在。简单来说:由包含字段和该字段的索引遍历方向的文档组成。 |
unique | boolean | 当值为true,片键字段上会限制为确保是唯一索引,哈希策略片键不支持唯一索引,默认为false |
例如在articled库中的comment集合中,以nickname为键,以哈希策略来分片。
#-------------------------首先开启article库的分片功能 sh.enableSharding("articledb") sh.shardCollection("articledb.comment",{"nickname":"hashed"})
增加第二个路由节点:
和创建第一个节点的方式相同,开启服务后不需要再添加分配,会由配置服务自动同步。
安全认证
常用的内置角色:
数据库用户角色:read、readWrite
所有数据库用户角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
数据库管理角色:dbAdmin、dbOwner、userAdmin
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色:backup、restore
超级用户角色:root
内部角色:system
角色说明:
角色 | 权限描述 |
read | 可以读取数据库中任何数据。 |
readWrite | 可以读写所有数据库中任何数据,包括创建、重命名、删除集合 |
readAnyDatabase | 可以读取所有数据库中任何数据(除了数据库config和local之外) |
readWriteAnyDatabase | 可以读写所有数据库中任何数据(除了数据库config和local之外) |
userAdminAnyDatabase | 可以在指定数据库创建和修改用户(除了数据库config和local之外) |
dbAdminAnyDatabase | 可以读取任何数据库以及数据库进行清理、修改、压缩、获取统计信息、执行检查等操作(除了数据库config和local之外)。 |
dbAdmin | 可以读取指定数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行检查等操作。 |
userAdmin | 可以指定数据库创建和修改用户 |
clusterAdmin | 可以对整个集群或数据库系统进行管理操作 |
backup | 备份MongoDB数据最小的权限 |
restore | 从备份文件中还原恢复MongoDB数据(处理system.profile集合)的权限 |
root | 超级账号,超级权限 |