环境准备
mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集,需要服务器配置支持AVX指令集
最小搭建一个分片集群,需要至少10台设备,
两个分片数据存储节点共用同一个仲裁服务器
例如:
192.168.2.111:27031 (分片1-主)
192.168.2.112:27031 (分片1-副)
192.168.2.117:27031(分片1-仲裁)
192.168.2.113:27131 (分片2-主)
192.168.2.114:27131 (分片2-副)
192.168.2.117:27131 (分片2-裁决)
192.168.2.115:27231 (配置服务-主)
192.168.2.116:27231 (配置服务-副)
192.168.2.120:27231 (配置服务-副) (配置服务不能有裁决节点)
192.168.2.18:27017 (mongodb路由1)
192.168.2.19:27017 (mongodb路由2)
集群搭建
所有配置的目录(path|dbPath)都必须提前创建好目录
提示:
- 该案例mongodb所在目录为/usr/local/mongodb
- 配置文件目录为/usr/local/mongodb/configs
- 日志目录为/usr/local/mongodb/logs
- 数据目录为/usr/local/mongodb/data/db
1.搭建分片存储副本集
分片存储存储集1配置文件
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/mongodb/logs/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/usr/local/mongodb/data/db"
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/usr/local/mongodb/logs/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP
bindIp: localhost,192.168.2.111
#bindIp
#绑定的端口
port: 27031
replication:
#副本集的名称(分片1节点)
replSetName: myshard1
sharding:
#分片角色
clusterRole: shardsvr
分片存储存储集2配置文件
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/mongodb/logs/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/usr/local/mongodb/data/db"
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/usr/local/mongodb/logs/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP
bindIp: localhost,192.168.2.113
#bindIp
#绑定的端口
port: 27131
replication:
#副本集的名称(分片2节点)
replSetName: myshard2
sharding:
#分片角色
clusterRole: shardsvr
tips:
- sharding.clusterRole固定为shardsvr
- 所有的数据存储节点都使用该配置,仅需要更改net.bindIp的具体ip为当前服务器ip
- replication.replSetName很重要,后在后续添加路由上添加分片存储信息时使用,同个分片存储集节点名称必须唯一,不同分片存储集不一样,例如分片1(192.168.2.111,112,117:27031)使用myshard1,分片2(192.168.2.113,114,117:27131)使用myshard2
启动
配置文件创建完毕后,通过指令启动分片数据存储mongodb
/use/local/mongodb/bin/mongod -f /use/local/mongodb/configs/mongodb.conf
设置分片存储集群信息
初始化分片存储节点1,通过mongosh登录到其中一个节点(例如主节点:192.168.2.111:27031)
mongosh --host <hostname> --port <port>
mongosh -host 192.168.2.111 -port 27031
1. 执行初始化副本集命令:
rs.initiate()
2.添加副本节点:
rs.add("192.168.2.112:27031")
3. 添加裁决节点
rs.addArb("192.168.2.117:27031")
退出
exit
初始化分片存储节点2,通过mongosh登录到其中一个节点(例如主节点:192.168.2.113:27131)
mongosh --host <hostname> --port <port>
mongosh -host 192.168.2.113 -port 27131
1. 执行初始化副本集命令:
rs.initiate()
2.添加副本节点:
rs.add("192.168.2.114:27131")
3. 添加裁决节点
rs.addArb("192.168.2.117:27131")
退出
exit
2.搭建配置节点
配置服务配置文件
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/mongodb/logs/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/usr/local/mongodb/data/db"
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/usr/local/mongodb/logs/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP
bindIp: localhost,192.168.2.115
#bindIp
#绑定的端口
port: 27231
replication:
#副本集的名称(分片节点)
replSetName: myconfig
sharding:
#分片角色
clusterRole: configsvr
tips:
- sharding.clusterRole固定为configsvr
- 所有的配置服务节点都使用该配置,仅需要更改net.bindIp的具体ip为当前服务器ip
- replication.replSetName很重要,后在后续路由节点配置文件上需要用,同个分片存储集节点名称必须唯一
启动
配置文件创建完毕后,通过指令启动配置服务mongodb
/use/local/mongodb/bin/mongod -f /use/local/mongodb/configs/mongodb.conf
设置配置集群信息
初始化配置集群信息,通过mongosh登录到其中一个节点(例如主节点:192.168.2.115:27231)
mongosh --host <hostname> --port <port>
mongosh -host 192.168.2.115 -port 27231
1. 执行初始化副本集命令:
rs.initiate()
2.添加副本节点:
rs.add("192.168.2.116:27231")
rs.add("192.168.2.120:27231")
退出
exit
配置服务器添加节点时报错Reconfig attempted to install a config that would change the implicit defaul… Use the setDefaultRWConcern command to set a cluster-wide write concern and try the reconfig again
解决方法,在登录的节点上修改默认读写关注配置
db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultWriteConcern" : {
"w" : 2
}
})
“w” : 1 只要主节点写入成功,就直接返回成功的响应,而不管副节点的同步情况
“w” : majority 超过节点半数【(节点数+1)/2】写入成功,才返回成功响应
“w” : 0 不等待任何节点确认写操作,只需写入到内存就返回成功,这是最低级别的写安全级别,这个配置可以提供写入性能,但也有一定的风险
“w” : 等待指定数量的节点确认写成功
3.搭建路由节点
路由配置文件
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/usr/local/mongodb/logs/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: /usr/local/mongodb/logs/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP
bindIp: localhost,192.168.2.118
#bindIp
#绑定的端口
port: 27017
sharding:
#指定配置节点副本集
configDB: myconfig/192.168.2.115:27231,192.168.2.116:27231,192.168.2.120:27231
tips:
- 所有的路由节点都使用该配置,仅需要更改net.bindIp的具体ip为当前服务器ip
- sharding.configDB为配置服务的replication.replSetName加对应的ip,多个ip用逗号隔开
启动
配置文件创建完毕后,通过指令启动配置服务mongodb,注意此处使用的是mongos
/use/local/mongodb/bin/mongos -f /use/local/mongodb/configs/mongodb.conf
给路由节点添加分片存储节点信息
如果其中分片节点中存在裁决节点,则需要将写入安全级别调低,在路由上使用以下命令
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 1 }})
“w” : 1 只要主节点写入成功,就直接返回成功的响应,而不管副节点的同步情况
“w” : majority 超过节点半数【(节点数+1)/2】写入成功,才返回成功响应
“w” : 0 不等待任何节点确认写操作,只需写入到内存就返回成功,这是最低级别的写安全级别,这个配置可以提供写入性能,但也有一定的风险
“w” : 等待指定数量的节点确认写成功
将第一个分片存储添加进去
sh.addShard("myshard1/192.168.2.111:27031,192.168.2.112:27031,192.168.2.117:27031")
将第二个分片存储也添加进去
sh.addShard("myshard2/192.168.2.113:27131,192.168.2.114:27131,192.168.2.117:27131")
可通过sh.status()查看分片存储节点信息
分片
1. 启动库的分片
sh.enableSharding("${db}")
2.设置对应库的表执行哈希分片
sh.shardCollection("${db}.${collection}",{"${哈希分片的字段}":"hashed"})
sh.shardCollection("db_a.c_test",{"testId":"hashed"})
2范围分片
sh.shardCollection("${db}.${collection}", { "${分片字段}" : 1, ... } )
仅能有一个字段进行哈希分片
可通过直接在对应节点上执行 db.${collection}.count(); 来查询该分片存储节点的表数据量
springboot连接mongodb时使用逗号隔开个多个路由地址
spring:
data:
mongodb:
uri: ${MONGODB_URI:mongodb://192.168.2.118:27017,192.168.2.119/db_a}