MongoDB在Ubuntu上的集群搭建指南(副本集与分片集群)
一、准备工作
1. 系统与环境要求
- Ubuntu版本:建议使用Ubuntu 22.04 LTS及以上(兼容MongoDB最新版本)。
- MongoDB版本:选择稳定版(如6.0+),所有节点需安装相同版本。
- 节点规划:
- 副本集:至少3个节点(1主2从),用于高可用。
- 分片集群:需配置服务器(3个,副本集)、分片服务器(每个分片至少3个节点,副本集)、路由服务器(1个或多个,mongos)。
- 网络要求:节点间网络互通,关闭防火墙或开放MongoDB端口(默认27017,分片集群需额外开放配置服务器27019、mongos 27017等端口)。
- 依赖工具:
apt包管理器、ssh(远程管理)、vim/nano(文本编辑)。
2. 安装MongoDB
在所有节点上执行以下命令,添加MongoDB官方源并安装:
# 导入MongoDB公钥
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
# 添加MongoDB源(Ubuntu 22.04)
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
# 更新包列表并安装
sudo apt update
sudo apt install -y mongodb-org
二、副本集集群搭建(高可用)
副本集是MongoDB的核心高可用方案,通过自动故障转移保证数据一致性。
1. 配置每个节点的mongod.conf
编辑每个节点的/etc/mongod.conf,修改以下关键参数:
storage:
dbPath: /var/lib/mongodb # 数据存储路径(需提前创建:sudo mkdir -p /var/lib/mongodb)
journal:
enabled: true # 启用日志,保证数据持久性
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log # 日志路径
net:
port: 27017 # 监听端口
bindIp: 0.0.0.0 # 允许所有IP连接(生产环境建议指定节点IP,如192.168.1.101)
replication:
replSetName: rs0 # 副本集名称(所有节点必须一致)
2. 启动MongoDB服务
在每个节点上启动mongod并设置开机自启:
sudo systemctl start mongod
sudo systemctl enable mongod
# 检查服务状态
sudo systemctl status mongod
3. 初始化副本集
连接到任意一个节点(如节点1),进入mongo shell并初始化:
mongo --host <节点1_IP> --port 27017
在shell中执行初始化命令(替换为实际节点IP):
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "<节点1_IP>:27017" },
{ _id: 1, host: "<节点2_IP>:27017" },
{ _id: 2, host: "<节点3_IP>:27017" }
]
})
初始化成功后,会返回"ok": 1。
4. 验证副本集状态
在mongo shell中执行rs.status(),检查:
- 所有节点状态为
SECONDARY或PRIMARY(至少1个主节点)。 health字段为1(健康)。
5. 测试数据同步
在主节点插入数据,从节点查询验证:
// 主节点(PRIMARY)插入数据
use testdb
db.testcoll.insert({ name: "MongoDB Replica Set", version: "6.0" })
// 从节点(SECONDARY)查询(需开启slaveOk)
rs.slaveOk() // 允许从节点读取
db.testcoll.find()
三、分片集群搭建(水平扩展)
分片集群通过将数据分散到多个分片,实现水平扩展,适用于大规模数据场景。
1. 配置配置服务器(Config Server)
配置服务器存储集群元数据(如分片信息、chunk分布),需3个节点组成副本集。
1.1 配置每个配置服务器的mongod.conf
编辑每个配置服务器的/etc/mongod.conf:
storage:
dbPath: /var/lib/mongodb/configdb # 配置服务器数据路径
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/configsvr.log
net:
port: 27019 # 配置服务器端口
bindIp: 0.0.0.0
replication:
replSetName: configReplSet # 配置服务器副本集名称
sharding:
clusterRole: configsvr # 指定为配置服务器角色
1.2 启动配置服务器并初始化副本集
# 启动配置服务器(每个节点)
sudo systemctl start mongod
sudo systemctl enable mongod
# 连接到任意配置服务器,初始化副本集
mongo --port 27019
rs.initiate({
_id: "configReplSet",
configsvr: true,
members: [
{ _id: 0, host: "cfg1.example.com:27019" },
{ _id: 1, host: "cfg2.example.com:27019" },
{ _id: 2, host: "cfg3.example.com:27019" }
]
})
2. 配置分片服务器(Shard Server)
每个分片是一个副本集,用于存储实际数据。
2.1 配置每个分片服务器的mongod.conf
编辑每个分片服务器的/etc/mongod.conf(以分片1为例):
storage:
dbPath: /var/lib/mongodb/shard1 # 分片数据路径
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/shard1.log
net:
port: 27018 # 分片端口
bindIp: 0.0.0.0
replication:
replSetName: shard1ReplSet # 分片副本集名称
sharding:
clusterRole: shardsvr # 指定为分片角色
2.2 启动分片服务器并初始化副本集
# 启动分片服务器(每个节点)
sudo systemctl start mongod
sudo systemctl enable mongod
# 连接到任意分片服务器,初始化副本集
mongo --port 27018
rs.initiate({
_id: "shard1ReplSet",
members: [
{ _id: 0, host: "shard1a.example.com:27018" },
{ _id: 1, host: "shard1b.example.com:27018" },
{ _id: 2, host: "shard1c.example.com:27018" }
]
})
3. 配置路由服务器(Mongos)
mongos是应用程序与分片集群的接口,负责路由请求。
3.1 启动mongos服务
编辑/etc/mongod.conf(mongos无需单独配置文件,通过命令行参数启动):
mongos --configdb configReplSet/cfg1.example.com:27019,cfg2.example.com:27019,cfg3.example.com:27019 --port 27017
(若需后台运行,可使用--fork参数,并指定日志路径--logpath /var/log/mongodb/mongos.log)
4. 添加分片到集群
连接到mongos,添加分片:
mongo --port 27017
sh.addShard("shard1ReplSet/shard1a.example.com:27018,shard1b.example.com:27018,shard1c.example.com:27018")
5. 启用数据库与集合分片
5.1 启用数据库分片
sh.enableSharding("mydatabase") // 启用数据库分片
5.2 对集合分片(选择合适的分片键)
sh.shardCollection("mydatabase.mycollection", { "user_id": 1 }) // 按user_id分片
注意:分片键选择至关重要,需根据查询模式选择高区分度、低频率变更的字段(如user_id、order_id)。
四、安全配置(可选但推荐)
1. 创建管理员用户
连接到mongos,创建管理员账户:
mongo --port 27017
use admin
db.createUser({
user: "admin",
pwd: "StrongPassword123!",
roles: ["root"] // 全局管理员
})
2. 启用身份验证
修改所有节点的/etc/mongod.conf,添加:
security:
authorization: enabled
重启mongod服务:
sudo systemctl restart mongod
3. 连接认证
客户端连接时需指定用户名密码:
mongo --port 27017 -u admin -p StrongPassword123 --authenticationDatabase admin
五、验证集群状态
1. 副本集验证
mongo --port 27017
rs.status() # 检查副本集节点状态
2. 分片集群验证
mongo --port 27017
sh.status() # 查看分片集群状态(包括分片、chunk分布)
3. 数据写入与查询
use mydatabase
db.mycollection.insert({ user_id: 1, name: "Alice" })
db.mycollection.find().explain("executionStats") # 查看查询是否路由到正确分片
六、常见问题排查
1. 节点无法连接
- 检查防火墙是否开放对应端口(27017、27019、27017等)。
- 检查
bindIp配置是否允许远程连接(生产环境建议指定节点IP)。
2. 副本集初始化失败
- 确保所有节点
replSetName一致。 - 确保至少3个数据承载节点(或2个数据节点+1个仲裁节点)。
3. 分片集群无法添加分片
- 确保mongos配置了正确的
configdb(3个配置服务器)。 - 确保分片服务器已启动并组成副本集。
通过以上步骤,可在Ubuntu上搭建高可用的MongoDB副本集或水平扩展的分片集群。根据业务需求选择合适的集群类型,并定期监控集群状态(如使用mongostat、mongotop或第三方工具)。