MongoDB集群主要有两种类型:副本集(Replica Set)(提供高可用性)和分片集群(Sharding Cluster)(提供水平扩展能力)。以下分别介绍两者的搭建流程,其中副本集是基础架构,更适合作为入门选择。
副本集通过多个节点(至少3个)同步数据,当主节点故障时自动选举新的主节点,确保服务连续性。
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
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配置文件(/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 # 端口(默认27017,多节点需修改为不同端口,如27018、27019)
bindIp: 0.0.0.0 # 允许所有IP访问(生产环境建议限制为节点IP)
replication:
replSetName: rs0 # 副本集名称(所有节点必须一致)
在所有节点上执行以下命令启动服务并设置开机自启:
sudo systemctl start mongod
sudo systemctl enable mongod
sudo systemctl status mongod # 检查服务状态(需显示"active (running)")
连接到任意一个节点的MongoDB实例(如节点1的27017端口):
mongo --host <节点1_IP> --port 27017
在Mongo Shell中执行初始化命令(将<节点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。
在Mongo Shell中执行以下命令,查看节点角色(PRIMARY/SECONDARY)和同步状态:
rs.status()
正常情况下,会显示3个节点,其中一个为PRIMARY(主节点,处理写请求),另外两个为SECONDARY(从节点,同步主节点数据)。
分片集群将数据分散到多个分片(Shard)上,通过路由节点(Mongos)统一管理,解决单节点数据量过大的问题。需包含配置服务器(Config Server)、**分片服务器(Shard Server)和路由服务器(Mongos)**三部分。
配置服务器存储集群元数据(如分片信息、集合分片规则),需以副本集形式部署(至少3个节点)。
在每个配置服务器上执行(以端口27019为例):
sudo mkdir -p /data/configdb # 数据目录
sudo chown -R `id -un` /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" }
]
})
分片服务器存储实际数据,每个分片也是一个副本集(建议至少3个节点)。
在每个分片服务器上执行(以端口27018为例,分片名称为shard1):
sudo mkdir -p /data/shard1 # 数据目录
sudo chown -R `id -un` /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" },
{ _id: 2, host: "<分片服务器3_IP>:27018" }
]
})
重复上述步骤,创建其他分片(如shard2、shard3)。
路由服务器是应用程序的入口,负责将请求路由到对应的分片。
在路由服务器上执行(需指定配置服务器地址):
mongos --configdb configReplSet/<配置服务器1_IP>:27019,<配置服务器2_IP>:27019,<配置服务器3_IP>:27019 --port 27017
连接到路由服务器:
mongo --port 27017
添加分片(以shard1为例):
sh.addShard("shard1ReplSet/<分片服务器1_IP>:27018,<分片服务器2_IP>:27018,<分片服务器3_IP>:27018")
重复上述命令,添加其他分片。
sh.enableSharding("yourDatabaseName") # 替换为你的数据库名
选择一个分片键(如userId),执行分片操作:
sh.shardCollection("yourDatabaseName.yourCollectionName", { "userId": 1 }) # 1表示升序索引
sh.status() # 查看集群状态(包括分片、配置服务器、路由服务器信息)
security.authorization: enabled)和加密(TLS/SSL)。ntp服务,确保时间一致(sudo apt install ntp)。mongostat、mongotop等工具监控集群性能,定期备份数据。以上流程覆盖了Ubuntu环境下MongoDB集群的基本搭建步骤,可根据实际需求调整节点数量和配置参数。