在所有节点上执行以下命令安装MongoDB官方版本:
sudo apt update
sudo apt install -y mongodb-org
安装完成后,MongoDB服务会自动启动,可通过systemctl status mongod验证状态。
副本集是MongoDB实现高可用的核心组件,至少需要3个节点(1主2从)。
编辑每个节点的/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 # 副本集名称(所有节点需一致)
sudo systemctl restart mongod
sudo systemctl enable mongod # 设置开机自启
连接到任意一个节点(如节点1)的MongoDB shell:
mongo --host <node1_ip> --port 27017
在shell中执行初始化命令(替换为实际节点IP/主机名):
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "<node1_ip>:27017" },
{ _id: 1, host: "<node2_ip>:27017" },
{ _id: 2, host: "<node3_ip>:27017" }
]
})
rs.status()
正常情况下,会显示所有节点状态为SECONDARY(从节点)或PRIMARY(主节点)。
分片集群用于水平扩展数据存储,由配置服务器(存储元数据)、分片服务器(存储实际数据)、mongos(路由请求)三部分组成。
配置服务器存储集群元数据,必须为副本集。
在每个配置服务器节点上执行:
mongod --configsvr --replSet configReplSet --dbpath /data/configdb --port 27019
连接到任意配置服务器节点:
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" }
]
})
在每个分片节点上执行(以分片1为例):
mongod --shardsvr --replSet shard1 --dbpath /data/shard1 --port 27018
连接到分片1的节点:
mongo --port 27018
执行初始化命令:
rs.initiate({
_id: "shard1",
members: [
{ _id: 0, host: "shard1a.example.com:27018" },
{ _id: 1, host: "shard1b.example.com:27018" },
{ _id: 2, host: "shard1c.example.com:27018" }
]
})
重复以上步骤,配置其他分片(如shard2、shard3)。
mongos是应用程序与分片集群的接口,需指向配置服务器副本集。
在mongos节点上执行:
mongos --configdb configReplSet/cfg1.example.com:27019,cfg2.example.com:27019,cfg3.example.com:27019 --port 27017
连接到mongos节点:
mongo --port 27017
添加分片(以shard1为例):
sh.addShard("shard1/shard1a.example.com:27018,shard1b.example.com:27018,shard1c.example.com:27018")
重复以上命令,添加所有分片。
sh.enableSharding("mydatabase") // 替换为实际数据库名
sh.shardCollection("mydatabase.mycollection", { "shardKey": 1 }) // 替换为实际集合名和分片键
注意:分片键选择至关重要,直接影响分片效率(如使用_id、user_id等高频查询字段)。
rs.status()。sh.status(),确认所有分片、配置服务器已加入集群。mongodump或MongoDB Ops Manager)。