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()