mongodb分片集群搭建

发布于:2024-04-24 ⋅ 阅读:(26) ⋅ 点赞:(0)

环境准备

mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集,需要服务器配置支持AVX指令集

mongodb 版本:7.0.8

mongosh 下载

官方文档

最小搭建一个分片集群,需要至少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}