集群规划
三节点部署架构:
| 角色 | 端口 | 说明 |
|---|---|---|
| mongos | 20000 | 路由器,客户端连接入口 |
| Config Server | 21000 | 存储集群元数据 |
| Shard1 | 27001 | 数据分片1 |
| Shard2 | 27002 | 数据分片2 |
| Shard3 | 27003 | 数据分片3 |
前置条件: 关闭防火墙和 SELinux,三节点配置 SSH 互信。
第一步:安装 MongoDB
# 下载并解压
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.0.tgz
tar xzf mongodb-linux-x86_64-*.tgz -C /usr/local/
ln -s /usr/local/mongodb-linux-x86_64-* /usr/local/mongodb
# 配置环境变量
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile
# 创建数据目录
mkdir -p /data/mongodb/{config,shard1,shard2,shard3,mongos}
mkdir -p /data/mongodb/logs
第二步:启动 Config Server 副本集
# /etc/mongodb/config.conf
systemLog:
destination: file
path: /data/mongodb/logs/config.log
storage:
dbPath: /data/mongodb/config
net:
port: 21000
bindIp: 0.0.0.0
replication:
replSetName: configReplSet
sharding:
clusterRole: configsvr
mongod -f /etc/mongodb/config.conf --fork
# 初始化副本集(在主节点执行)
mongosh --port 21000
rs.initiate({
_id: "configReplSet",
configsvr: true,
members: [
{ _id: 0, host: "node1:21000" },
{ _id: 1, host: "node2:21000" },
{ _id: 2, host: "node3:21000" }
]
})
第三步:启动 Shard 副本集
每个 Shard 在三个节点上各启动一个实例,以 Shard1 为例:
# /etc/mongodb/shard1.conf
storage:
dbPath: /data/mongodb/shard1
net:
port: 27001
replication:
replSetName: shard1ReplSet
sharding:
clusterRole: shardsvr
mongod -f /etc/mongodb/shard1.conf --fork
# 初始化 Shard1 副本集
mongosh --port 27001
rs.initiate({
_id: "shard1ReplSet",
members: [
{ _id: 0, host: "node1:27001" },
{ _id: 1, host: "node2:27001" },
{ _id: 2, host: "node3:27001" }
]
})
第四步:启动 Mongos 路由器
# /etc/mongodb/mongos.conf
net:
port: 20000
sharding:
configDB: configReplSet/node1:21000,node2:21000,node3:21000
mongos -f /etc/mongodb/mongos.conf --fork
第五步:添加 Shard 到集群
mongosh --port 20000
sh.addShard("shard1ReplSet/node1:27001,node2:27001,node3:27001")
sh.addShard("shard2ReplSet/node1:27002,node2:27002,node3:27002")
sh.addShard("shard3ReplSet/node1:27003,node2:27003,node3:27003")
sh.status()
第六步:启用安全认证
# 生成 keyfile
openssl rand -base64 756 > /etc/mongodb/keyfile
chmod 400 /etc/mongodb/keyfile
# 在所有节点的配置文件中添加
security:
keyFile: /etc/mongodb/keyfile
authorization: enabled
# 创建管理员账号
use admin
db.createUser({
user: "admin",
pwd: "your_password",
roles: ["root"]
})
验证分片效果
# 启用数据库分片
sh.enableSharding("testdb")
# 对集合启用分片(按 _id 哈希分片)
sh.shardCollection("testdb.users", { _id: "hashed" })
# 插入测试数据后查看分布
db.users.getShardDistribution()