集群规划

三节点部署架构:

角色端口说明
mongos20000路由器,客户端连接入口
Config Server21000存储集群元数据
Shard127001数据分片1
Shard227002数据分片2
Shard327003数据分片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()