MongoDB 5.0.9 集群分片模式部署
- 文档材料
- 依赖服务
- 集群架构
- 创建数据路径
- 部署 configsrv
-
- 1. 配置 configsrv.conf
- 2. 启动 configsrv 实例
- 3. 部署 configsrv 复制集
- 部署 shardsrv
-
- 1. 配置 shardsrv.conf
- 2. 启动 shardsrv 实例
- 3. 部署 shardsrv 复制集
- 部署 mongossrv
-
- 1. 配置 mongossrv.conf
- 2. 启动 mongossrv 实例
- 3. 部署 mongossrv
- 启用 Sharding
文档材料
-
官方介质路径:https://www.mongodb.com/try/download/community
-
官方部署文档:https://www.mongodb.com/docs/v5.0
-
官方配置文件描述 - mongod.conf:https://www.mongodb.com/docs/manual/reference/configuration-options
依赖服务
-
numactl:用于关闭 NUMA 功能
-
net-snmp:mongodb 依赖包
-
cyrus-sasl && cyrus-sasl-gssapi:mongodb 管理工具依赖包
-
mongodb-database-tools:mongoDB 官方管理工具
集群架构
主机名 | IP 地址 | MongoDB 角色 | MongoDB 分片 |
---|---|---|---|
redis1 | 10.10.10.21 | mongossrvconfigsvr | sharedsrv1:2311 sharedsrv2:2312 sharedsrv3:2313 |
redis2 | 10.10.10.22 | configsvr | sharedsrv1:2321 sharedsrv2:2322 sharedsrv3:2323 |
redis3 | 10.10.10.23 | configsvr | sharedsrv1:2331 sharedsrv2:2332 sharedsrv3:2333 |
创建数据路径
- 所有节点都需创建
mkdir -p /data/service/mongodb/mongossrv/log mkdir -p /data/service/mongodb/configsrv/{data,log} mkdir -p /data/service/mongodb/shardsrv1/{data,log} mkdir -p /data/service/mongodb/shardsrv2/{data,log} mkdir -p /data/service/mongodb/shardsrv3/{data,log}
部署 configsrv
- configsrv 实例数量必须为奇数
1. 配置 configsrv.conf
-
每个 configsrv 都需部署
-
bindIp 需按节点实际信息调整
-
port 需按上述规划配置
vi /data/service/mongodb/configsrv/configsrv-${configsrv-port}.conf # 系统日志 systemLog: # 日志输出目标,一般配置为file,须于path同时配置 destination: file # 以追加方式写入数据 logAppend: true # 日志存放路径 path: /data/service/mongodb/configsrv/log/configsrv-${configsrv-port}.log # 存储 storage: # 数据存放路径 dbPath: /data/service/mongodb/configsrv/data # 启动持久性日志。以确保数据文件保持有效和可恢复。 journal: enabled: true # 进程 processManagement: # 以守护进程方式运行 fork: true # PID 存放路径 pidFilePath: /data/service/mongodb/configsrv/configsrv-${configsrv-port}.pid # 网络 net: # 指定端口 port: ${configsrv-port} # 指定 IP 地址。多个用逗号分开 bindIp: ${configsrv-ip} # 复制集 replication: # 指定复制集名称 replSetName: config # Sharding 架构 sharding: # 指定集群内此实例的角色 clusterRole: configsvr
2. 启动 configsrv 实例
-
每个 configsrv 都需启动
-
禁用 NUMA,以避免其导致的性能异常
numactl --interleave=all /data/service/mongodb/mongodb5.0.9/bin/mongod --config /data/service/mongodb/configsrv/configsrv-${configsrv-port}.conf
3. 部署 configsrv 复制集
-
可在任意节点进行操作
-
登录 mongodb 交互界面
mongo ${configsrv-ip}:${configsrv-port}
-
配置 configsrv 副本集
-
id 需与配置中 replSetName 参数相同
-
后缀 priority:${number} 可增加权重,更容易被选举为 Primary
-
后缀 arbiterOnly:true 可将实力设置为仲裁实例,则只参与仲裁,不读写数据
-
host 内参数之间,用逗号分开
rs.initiate( { _id : "config", members : [ {_id : 0, host : "${configsrv-ip}:${configsrv-port}" }, {_id : 1, host : "${configsrv-ip}:${configsrv-port}" }, {_id : 2, host : "${configsrv-ip}:${configsrv-port}" } ] } )
- 验证配置状态
rs.status()
部署 shardsrv
1. 配置 shardsrv.conf
-
每个 shardsrv 都需部署
-
bindIp 需按节点实际信息调整
-
port 需按上述规划配置
vi /data/service/mongodb/shardsrv{1-3}/shardsrv-${shardsrv-port}.conf # 系统日志 systemLog: # 日志输出目标,一般配置为file,须于path同时配置 destination: file # 以追加方式写入数据 logAppend: true # 日志存放路径 path: /data/service/mongodb/shardsrv{1-3}/log/shardsrv-${shardsrv-port}.log # 存储 storage: # 数据存放路径 dbPath: /data/service/mongodb/shardsrv{1-3}/data # 启动持久性日志。以确保数据文件保持有效和可恢复。 journal: enabled: true # 进程 processManagement: # 以守护进程方式运行 fork: true # PID 存放路径 pidFilePath: /data/service/mongodb/shardsrv{1-3}/shardsrv-${shardsrv-port}.pid # 网络 net: # 指定端口 port: ${shardsrv-port} # 指定 IP 地址。多个用逗号分开 bindIp: ${shardsrv-ip} # 复制集 replication: # 指定复制集名称 # 3 个 shard 实例为 1 个复制集,而单个复制集内的所有实例需配置同一个复制集名称 replSetName: shard{1-3} # Sharding 架构 sharding: # 指定集群内此实例的角色 clusterRole: shardsvr
2. 启动 shardsrv 实例
-
每个 shardsrv 都需启动
-
禁用 NUMA,以避免其导致的性能异常
numactl --interleave=all /data/service/mongodb/mongodb5.0.9/bin/mongod --config /data/service/mongodb/shardsrv{1-3}/shardsrv-${shardsrv-port}.conf
3. 部署 shardsrv 复制集
-
可在任意节点进行操作
-
登录 mongodb 交互界面
mongo ${shardsrv-ip}:${shardsrv-port}
-
配置 shardsrv 副本集
-
id 需与配置中 replSetName 参数相同
-
shardsrv1
rs.initiate( { _id : "shard1", members : [ {_id : 0, host : "${shardsrv1-ip}:${shardsrv1-port}" }, {_id : 1, host : "${shardsrv1-ip}:${shardsrv1-port}" }, {_id : 2, host : "${shardsrv1-ip}:${shardsrv1-port}" } ] } )
- shardsrv2
rs.initiate( { _id : "shard1", members : [ {_id : 0, host : "${shardsrv2-ip}:${shardsrv2-port}" }, {_id : 1, host : "${shardsrv2-ip}:${shardsrv2-port}" }, {_id : 2, host : "${shardsrv2-ip}:${shardsrv2-port}" } ] } )
- shardsrv3
rs.initiate( { _id : "shard3", members : [ {_id : 0, host : "${shardsrv3-ip}:${shardsrv3-port}" }, {_id : 1, host : "${shardsrv3-ip}:${shardsrv3-port}" }, {_id : 2, host : "${shardsrv3-ip}:${shardsrv3-port}" } ] } )
- 验证配置状态
rs.status()
部署 mongossrv
1. 配置 mongossrv.conf
-
每个 mongossrv 都需部署
-
bindIp 需按节点实际信息调整
-
port 需按上述规划配置
vi /data/service/mongodb/mongossrv/mongossrv-${mongossrv-port}.conf # 系统日志 systemLog: # 日志输出目标,一般配置为file,须于path同时配置 destination: file # 以追加方式写入数据 logAppend: true # 日志存放路径 path: /data/service/mongodb/mongossrv/log/mongossrv-${mongossrv-port}.log # 进程 processManagement: # 以守护进程方式运行 fork: true # PID 存放路径 pidFilePath: /data/service/mongodb/mongossrv/mongossrv-${mongossrv-port}.pid # 网络 net: # 指定端口 port: ${mongossrv-port} # 指定 IP 地址。多个用逗号分开 bindIp: ${mongossrv-ip} # Sharding 架构 sharding: # 指定 Sharding 架构内的 configsrv # 用逗号隔开 configDB: config/${configsrv1-ip}:${configsrv1-port},${configsrv2-ip}:${configsrv2-port},${configsrv3-ip}:${configsrv3-port}
2. 启动 mongossrv 实例
-
每个 mongossrv 都需启动
-
由于 mongossrv 只用于路由,并不存放实际数据。所以无需禁用 NUMA
-
mongossrv 需要通过 mongos 命令启动,而非 mongod
/data/service/mongodb/mongodb5.0.9/bin/mongos --config /data/service/mongodb/mongossrv/mongossrv-${mongossrv-port}.conf
3. 部署 mongossrv
-
在 Sharding 架构中,mongossrv 之间并没有 HA 功能
-
若需要部署 mongossrv HA,需要借助其它服务
启用 Sharding
-
可在任意 mongossrv 实例进行操作
-
登录 mongodb 交互界面
mongo ${mongossrv-ip}:${mongossrv-port}
-
添加分片复制集
-
实例之间用逗号隔开
sh.addShard( "${shard1-repliname}/${shardsrv1-ip}:${shardsrv1-port},${shardsrv2-ip}:${shardsrv2-port},${shardsrv3-ip}:${shardsrv3-port}" ) sh.addShard( "${shard2-repliname}/${shardsrv1-ip}:${shardsrv1-port},${shardsrv2-ip}:${shardsrv2-port},${shardsrv3-ip}:${shardsrv3-port}" ) sh.addShard( "${shard3-repliname}/${shardsrv1-ip}:${shardsrv1-port},${shardsrv2-ip}:${shardsrv2-port},${shardsrv3-ip}:${shardsrv3-port}" )
- 验证分片复制集状态
sh.status()