apt包管理器、ssh(远程管理)、vim/nano(文本编辑)。在所有节点上执行以下命令,添加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的核心高可用方案,通过自动故障转移保证数据一致性。
编辑每个节点的/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 # 副本集名称(所有节点必须一致)
在每个节点上启动mongod并设置开机自启:
sudo systemctl start mongod
sudo systemctl enable mongod
# 检查服务状态
sudo systemctl status mongod
连接到任意一个节点(如节点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。
在mongo shell中执行rs.status(),检查:
SECONDARY或PRIMARY(至少1个主节点)。health字段为1(健康)。在主节点插入数据,从节点查询验证:
// 主节点(PRIMARY)插入数据
use testdb
db.testcoll.insert({ name: "MongoDB Replica Set", version: "6.0" })
// 从节点(SECONDARY)查询(需开启slaveOk)
rs.slaveOk() // 允许从节点读取
db.testcoll.find()
分片集群通过将数据分散到多个分片,实现水平扩展,适用于大规模数据场景。
配置服务器存储集群元数据(如分片信息、chunk分布),需3个节点组成副本集。
编辑每个配置服务器的/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 # 指定为配置服务器角色
# 启动配置服务器(每个节点)
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" }
]
})
每个分片是一个副本集,用于存储实际数据。
编辑每个分片服务器的/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 # 指定为分片角色
# 启动分片服务器(每个节点)
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" }
]
})
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)
连接到mongos,添加分片:
mongo --port 27017
sh.addShard("shard1ReplSet/shard1a.example.com:27018,shard1b.example.com:27018,shard1c.example.com:27018")
sh.enableSharding("mydatabase") // 启用数据库分片
sh.shardCollection("mydatabase.mycollection", { "user_id": 1 }) // 按user_id分片
注意:分片键选择至关重要,需根据查询模式选择高区分度、低频率变更的字段(如user_id、order_id)。
连接到mongos,创建管理员账户:
mongo --port 27017
use admin
db.createUser({
user: "admin",
pwd: "StrongPassword123!",
roles: ["root"] // 全局管理员
})
修改所有节点的/etc/mongod.conf,添加:
security:
authorization: enabled
重启mongod服务:
sudo systemctl restart mongod
客户端连接时需指定用户名密码:
mongo --port 27017 -u admin -p StrongPassword123 --authenticationDatabase admin
mongo --port 27017
rs.status() # 检查副本集节点状态
mongo --port 27017
sh.status() # 查看分片集群状态(包括分片、chunk分布)
use mydatabase
db.mycollection.insert({ user_id: 1, name: "Alice" })
db.mycollection.find().explain("executionStats") # 查看查询是否路由到正确分片
bindIp配置是否允许远程连接(生产环境建议指定节点IP)。replSetName一致。configdb(3个配置服务器)。通过以上步骤,可在Ubuntu上搭建高可用的MongoDB副本集或水平扩展的分片集群。根据业务需求选择合适的集群类型,并定期监控集群状态(如使用mongostat、mongotop或第三方工具)。