MongoDB分片集群包含以下组件:
1、分片(存储):每个分片包含分片数据的子集。每个分片都可以部署为副本集
2、mongos(路由):mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口。
3、config servers(“调度”的配置):配置服务器存储群集的元数据和配置设置。从mongoDB3.4开始必须将配置服务器部署为副本集(CSRS)
下图描述了分片集群中组件的交互:
按照以下结构搭建分片集群 (192.168.1.118主机上,端口号不同):
1个 路由服务(2个mongs服务)+1个配置服务(3个mongod服务)+2个分片服务(共6个mongod服务)
一、搭建分片1服务
1、创建配置文件
shard01_27016.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myshardrs01_27016.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myshardrs01_27016"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myshardrs01_27016.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27016
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myshardrs01"
sharding:
#指定分片角色
clusterRole: shardsvr
shard01_27017.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myshardrs01_27017.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myshardrs01_27017"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myshardrs01_27017.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27017
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myshardrs01"
sharding:
#分片角色
clusterRole: shardsvr
shard01_27018.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myshardrs01_27018.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myshardrs01_27018"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myshardrs01_27018.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27018
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myshardrs01"
sharding:
#分片角色
clusterRole: shardsvr
2、启动mongod服务
新建日志和数据库文件夹
mkdir -p /usr/local/mongodb4/datasource/pid
mkdir -p /usr/local/mongodb4/datasource/log
mkdir -p /usr/local/mongodb4/datasource/data/db/myshardrs01_27016
mkdir -p /usr/local/mongodb4/datasource/data/db/myshardrs01_27017
mkdir -p /usr/local/mongodb4/datasource/data/db/myshardrs01_27018
启动服务
mongod -f shard01_27016.yaml
mongod -f shard01_27017.yaml
mongod -f shard01_27018.yaml
3、选择主节点进入:
mongo 192.168.1.118:27016
4、初始化副本集
rs.initiate()
5、添加备节点
rs.add("192.168.1.118:27017")
6、添加仲裁节点
rs.add("192.168.1.118:27018",true) 或者rs.addArb("192.168.1.118:27018")
7、查看服务状态
rs.config()
二、搭建分片2服务
shard01_27116.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myshardrs02_27116.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myshardrs02_27116"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myshardrs02_27116.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27116
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myshardrs02"
sharding:
#分片角色
clusterRole: shardsvr
shard01_27117.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myshardrs02_27117.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myshardrs02_27117"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myshardrs02_27117.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27117
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myshardrs02"
sharding:
#分片角色
clusterRole: shardsvr
shard01_27118.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myshardrs02_27118.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myshardrs02_27118"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myshardrs02_27118.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27118
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myshardrs02"
sharding:
#分片角色
clusterRole: shardsvr
2、启动mongod服务
新建日志和数据库文件夹
mkdir -p /usr/local/mongodb4/datasource/pid
mkdir -p /usr/local/mongodb4/datasource/log
mkdir -p /usr/local/mongodb4/datasource/data/db/myshardrs02_27016
mkdir -p /usr/local/mongodb4/datasource/data/db/myshardrs02_27017
mkdir -p /usr/local/mongodb4/datasource/data/db/myshardrs02_27018
启动服务
mongod -f shard02_27116.yaml
mongod -f shard02_27117.yaml
mongod -f shard02_27118.yaml
3、选择主节点进入:
mongo 192.168.1.118:27116
4、初始化副本集
rs.initiate()
5、添加备节点
rs.add("192.168.1.118:27117")
6、添加仲裁节点
rs.add("192.168.1.118:27118",true) 或者rs.addArb("192.168.1.118:27118")
7、查看服务状态
rs.config()
三、搭建配置服务
configserver27216.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myconfigrs_27216.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myconfigrs_27216"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myconfigrs_27216.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27216
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myconfigrs"
sharding:
#分片角色
clusterRole: configsvr
configserver27217.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myconfigrs_27217.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myconfigrs_27217"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myconfigrs_27217.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27217
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myconfigrs"
sharding:
#分片角色
clusterRole: configsvr
configserver27218.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/myconfigrs_27218.log"
logAppend: true
storage:
#存储数据库的数据目录
dbPath: "/usr/local/mongodb4/datasource/data/db/myconfigrs_27218"
#启用或禁用持久性日志以确保数据文件保持有效和恢复
journal:
enabled: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/myconfigrs_27218.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27218
setParameter:
#认证设置
enableLocalhostAuthBypass: false
#副本集名称
replication:
replSetName: "myconfigrs"
sharding:
#分片角色
clusterRole: configsvr
2、启动mongod服务
新建日志和数据库文件夹
mkdir -p /usr/local/mongodb4/datasource/pid
mkdir -p /usr/local/mongodb4/datasource/log
mkdir -p /usr/local/mongodb4/datasource/data/db/myconfigrs_27216
mkdir -p /usr/local/mongodb4/datasource/data/db/myconfigrs_27217
mkdir -p /usr/local/mongodb4/datasource/data/db/myconfigrs_27218
启动服务
mongod -f configserver27216.yaml
mongod -f configserver27217.yaml
mongod -f configserver27218.yaml
3、选择主节点进入:
mongo 192.168.1.118:27216
4、初始化副本集
rs.initiate()
5、添加备节点
rs.add("192.168.1.118:27217")
rs.add("192.168.1.118:27218")
6、查看服务状态
rs.config()
四、搭建路由服务
router27316.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/router_27316.log"
logAppend: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/router_27316.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27316
setParameter:
#认证设置
enableLocalhostAuthBypass: false
sharding:
#设置配置服务的副本集名称和ip端口
configDB: myconfigrs/192.168.1.118:27216,192.168.1.118:27217,192.168.1.118:27218
router27317.yaml
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#指定日志文件路径
path: "/usr/local/mongodb4/datasource/log/router_27317.log"
logAppend: true
processManagement:
#支持后台启动
fork: true
#记录进程id
pidFilePath: "/usr/local/mongodb4/datasource/pid/router_27317.pid"
net:
#设置绑定ip地址
bindIp: 192.168.1.118
#绑定端口号
port: 27317
setParameter:
#认证设置
enableLocalhostAuthBypass: false
sharding:
#指定配置集群的副本集名称和IP地址端口
configDB: myconfigrs/192.168.1.118:27216,192.168.1.118:27217,192.168.1.118:27218
2、启动mongos服务
创建日志保持路径
mkdir -p /usr/local/mongodb4/datasource/pid
mkdir -p /usr/local/mongodb4/datasource/log
启动服务
mongos -f router27316.yaml
mongos -f router27317.yaml
3、进入client端
mongo 192.168.1.118:27316
4、添加分片
sh.addShard("myshardrs01/192.168.1.118:27016,192.168.1.118:27017,192.168.1.118:27018")
sh.addShard("myshardrs02/192.168.1.118:27116,192.168.1.118:27117,192.168.1.118:27118")
注意:如果添加分片失败,需要手动移除分片,检查添加分片的信息正确性后,再次添加分片。
移除分片:
use admin
db.runCommand({removeShard:"myshards02"})
如果只剩下最后一个shard,是无法删除的,移除时会自动转移分片数据,需要一个时间过程。完成后,再次执行删除分片命令才能真正删除。
5、查看状态
sh.status()
6、此时分片还是不可以使用的,必须开启分片功能才可以。sh.enableSharding("库名")、sh.shardCollection("库名.集合名",策略)。
分片规则有两个,一个是哈希策略(hashed)另一个是范围策略({"关键字",1})