MongoDB的“集群”通常指副本集(Replica Set)(高可用性)或分片集群(Sharded Cluster)(水平扩展)。以下分别介绍两者的搭建步骤:
副本集通过多个节点同步数据,实现故障自动转移,适用于需要高可用的场景。
在所有节点执行以下命令,添加MongoDB官方源并安装:
# 导入MongoDB公钥
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
# 添加MongoDB源(以Ubuntu 22.04为例,若用其他版本替换“jammy”)
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
# 更新软件包并安装
sudo apt update
sudo apt install -y mongodb-org
编辑每个节点的MongoDB配置文件(/etc/mongod.conf
),修改以下参数:
storage:
dbPath: /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)
replication:
replSetName: rs0 # 副本集名称(所有节点必须一致)
保存后重启MongoDB服务:
sudo systemctl restart mongod
sudo systemctl enable mongod # 设置开机自启
连接到任意一个节点的MongoDB Shell(如节点1的27017端口),执行初始化命令:
mongo --host <节点1_IP> --port 27017
在Shell中输入以下命令(将<节点1_IP>
、<节点2_IP>
、<节点3_IP>
替换为实际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 }
。
在Shell中执行以下命令,查看节点角色(PRIMARY/SECONDARY):
rs.status()
正常情况下,会显示3个节点,其中1个为PRIMARY(主节点,处理写请求),2个为SECONDARY(从节点,同步主节点数据)。
分片集群将数据分散到多个分片(Shard)上,解决单节点数据量过大的问题,适用于大规模数据存储。
配置服务器以副本集形式运行,确保元数据高可用。
sudo mkdir -p /data/configdb
sudo chown -R $(whoami) /data/configdb
mongod --configsvr --replSet configReplSet --dbpath /data/configdb --port 27019
mongo --port 27019
rs.initiate({
_id: "configReplSet",
configsvr: true,
members: [
{ _id: 0, host: "<节点1_IP>:27019" },
{ _id: 1, host: "<节点2_IP>:27019" },
{ _id: 2, host: "<节点3_IP>:27019" }
]
})
每个分片也是一个副本集(推荐),以节点1的分片为例:
sudo mkdir -p /data/shard1
sudo chown -R $(whoami) /data/shard1
mongod --shardsvr --replSet shard1ReplSet --dbpath /data/shard1 --port 27018
mongo --port 27018
rs.initiate({
_id: "shard1ReplSet",
members: [
{ _id: 0, host: "<节点1_IP>:27018" },
{ _id: 1, host: "<节点2_IP>:27018" }
]
})
重复上述步骤,配置其他分片服务器(如shard2ReplSet
)。
Mongos负责将请求路由到对应的分片,无需数据存储。
mongos --configdb configReplSet/<节点1_IP>:27019,<节点2_IP>:27019,<节点3_IP>:27019 --port 27017
连接到Mongos Shell:
mongo --port 27017
添加分片(以shard1ReplSet
为例):
sh.addShard("shard1ReplSet/<节点1_IP>:27018,<节点2_IP>:27018")
重复上述命令,添加其他分片。
mydb
):sh.enableSharding("mydb")
mycollection
),并指定分片键(分片键选择至关重要,需均匀分布数据):sh.shardCollection("mydb.mycollection", { "userId": 1 }) // 以userId字段分片
在Mongos Shell中执行以下命令,查看集群状态:
sh.status()
正常情况下,会显示配置服务器、分片服务器及分片信息。
--auth
参数)和TLS加密,防止未授权访问;mongostat
、mongotop
工具监控性能,定期备份数据。以上步骤覆盖了MongoDB Ubuntu版集群搭建的核心流程,可根据实际需求调整节点数量和配置参数。