MongoDB 搭建部署实操教程

张开发
2026/4/11 6:23:28 15 分钟阅读

分享文章

MongoDB 搭建部署实操教程
MongoDB 搭建部署实操教程一、集群规划1.1 架构总览10.6.69.145 ──┬─ mongos :27017 ├─ ConfigSrv :27018 (PRIMARY) ├─ Shard1 :27019 (PRIMARY) ├─ Shard2 :27020 (Secondary) └─ Shard3 :27021 (Secondary) 10.6.69.146 ──┬─ mongos :27017 ├─ ConfigSrv :27018 (Secondary) ├─ Shard1 :27019 (Secondary) ├─ Shard2 :27020 (PRIMARY) └─ Shard3 :27021 (Secondary) 10.6.69.148 ──┬─ mongos :27017 ├─ ConfigSrv :27018 (Secondary) ├─ Shard1 :27019 (Secondary) ├─ Shard2 :27020 (Secondary) └─ Shard3 :27021 (PRIMARY)1.2 端口规划组件端口说明mongos27017客户端接入路由Config Server27018元数据存储副本集Shard127019数据分片1副本集Shard227020数据分片2副本集Shard327021数据分片3副本集二、安装 MongoDB2.1 下载每台机器都要装# 下载 MongoDB 6.0 cd /tmp wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.27.tgz # 解压到 /opt sudo tar -zxf mongodb-linux-x86_64-rhel70-6.0.27.tgz -C /opt sudo mv /opt/mongodb-linux-x86_64-rhel70-6.0.27 /opt/mongodb # 创建软链接方便后续升级 sudo ln -s /opt/mongodb /opt/mongodb6 # 把 bin 目录加到 PATH可选 echo export PATH$PATH:/opt/mongodb6/bin ~/.bashrc source ~/.bashrc # 验证安装 mongod --version2.2 创建目录每台机器都要建# 数据目录 sudo mkdir -p /data/configsrv /data/shard1 /data/shard2 /data/shard3 # 日志目录 sudo mkdir -p /var/log/mongodb # 修改权限mongodb 是运行用户可以创建专用用户 sudo chown -R mongodb:mongodb /data /var/log/mongodb三、Config Server 副本集3节点3.1 启动 Config Server每台机器10.6.69.145 上执行mongod --configsvr \ --replSet configReplSet \ --dbpath /data/configsrv \ --bind_ip 0.0.0.0 \ --port 27018 \ --logpath /var/log/mongodb/configsrv.log \ --fork10.6.69.146 上执行mongod --configsvr \ --replSet configReplSet \ --dbpath /data/configsrv \ --bind_ip 0.0.0.0 \ --port 27018 \ --logpath /var/log/mongodb/configsrv.log \ --fork10.6.69.148 上执行mongod --configsvr \ --replSet configReplSet \ --dbpath /data/configsrv \ --bind_ip 0.0.0.0 \ --port 27018 \ --logpath /var/log/mongodb/configsrv.log \ --fork3.2 初始化 Config Server 副本集连接任意一台 Config Server 执行初始化mongosh --host 10.6.69.145 --port 27018 # 初始化副本集 rs.initiate({ _id: configReplSet, configsvr: true, members: [ { _id: 0, host: 10.6.69.145:27018 }, { _id: 1, host: 10.6.69.146:27018 }, { _id: 2, host: 10.6.69.148:27018 } ] })3.3 验证 Config Server// 连接后查看状态 rs.status() // 查看是否是 PRIMARY db.adminCommand({ isMaster: 1 }) // 输出中 ismaster: true 表示当前节点是主节点四、Shard 副本集3个分片每个分片3节点4.1 启动 Shard1 副本集3台机器的 27019 端口10.6.69.145mongod --shardsvr \ --replSet shard1ReplSet \ --dbpath /data/shard1 \ --bind_ip 0.0.0.0 \ --port 27019 \ --logpath /var/log/mongodb/shard1.log \ --fork10.6.69.146mongod --shardsvr \ --replSet shard1ReplSet \ --dbpath /data/shard1 \ --bind_ip 0.0.0.0 \ --port 27019 \ --logpath /var/log/mongodb/shard1.log \ --fork10.6.69.148mongod --shardsvr \ --replSet shard1ReplSet \ --dbpath /data/shard1 \ --bind_ip 0.0.0.0 \ --port 27019 \ --logpath /var/log/mongodb/shard1.log \ --fork4.2 初始化 Shard1mongosh --host 10.6.69.145 --port 27019 rs.initiate({ _id: shard1ReplSet, members: [ { _id: 0, host: 10.6.69.145:27019 }, { _id: 1, host: 10.6.69.146:27019 }, { _id: 2, host: 10.6.69.148:27019 } ] })4.3 Shard2 和 Shard3重复上面步骤Shard2端口 27020在每台机器启动mongod --shardsvr --replSet shard2ReplSet --dbpath /data/shard2 --bind_ip 0.0.0.0 --port 27020 --logpath /var/log/mongodb/shard2.log --fork初始化 Shard2// 连接 10.6.69.145:27020 初始化 rs.initiate({ _id: shard2ReplSet, members: [ { _id: 0, host: 10.6.69.145:27020 }, { _id: 1, host: 10.6.69.146:27020 }, { _id: 2, host: 10.6.69.148:27020 } ] })Shard3端口 27021在每台机器启动mongod --shardsvr --replSet shard3ReplSet --dbpath /data/shard3 --bind_ip 0.0.0.0 --port 27021 --logpath /var/log/mongodb/shard3.log --fork初始化 Shard3// 连接 10.6.69.145:27021 初始化 rs.initiate({ _id: shard3ReplSet, members: [ { _id: 0, host: 10.6.69.145:27021 }, { _id: 1, host: 10.6.69.146:27021 }, { _id: 2, host: 10.6.69.148:27021 } ] })五、mongos 路由节点3节点5.1 启动 mongos每台机器mongos 需要知道 Config Server 的地址启动时指定mongos --configdb configReplSet/10.6.69.145:27018,10.6.69.146:27018,10.6.69.148:27018 \ --bind_ip 0.0.0.0 \ --port 27017 \ --logpath /var/log/mongodb/mongos.log \ --fork5.2 添加分片到集群连接任意一台 mongos依次添加三个分片mongosh --host 10.6.69.145 --port 27017 // 添加三个分片 sh.addShard(shard1ReplSet/10.6.69.145:27019,10.6.69.146:27019,10.6.69.148:27019) sh.addShard(shard2ReplSet/10.6.69.145:27020,10.6.69.146:27020,10.6.69.148:27020) sh.addShard(shard3ReplSet/10.6.69.145:27021,10.6.69.146:27021,10.6.69.148:27021) // 验证 sh.status()六、创建管理员账号6.1 创建集群管理员// 连接任意 mongos mongosh --host 10.6.69.145 --port 27017 use admin db.createUser({ user: admin, pwd: admin123, roles: [ { role: root, db: admin } ] })6.2 创建应用账号// 连接后认证 db.auth(admin, admin123) // 创建应用数据库和账号 use myapp db.createUser({ user: app_user, pwd: AppPass123, roles: [ { role: readWrite, db: myapp }, { role: dbAdmin, db: myapp } ] })七、启用数据库和分片集合7.1 启用分片// 对数据库启用分片 sh.enableSharding(myapp) // 对集合启用分片Hash分片推荐 sh.shardCollection(myapp.orders, { customer_id: hashed }) // 对集合启用分片Range分片适合时间序列 sh.shardCollection(myapp.events, { timestamp: 1 })7.2 创建集合同时启用分片一步到位// 在 myapp 数据库下 db.createCollection(users) sh.shardCollection(myapp.users, { user_id: hashed }) db.createCollection(products) sh.shardCollection(myapp.products, { category: 1, product_id: 1 })八、验证集群8.1 查看集群全貌// 通过 mongos 查看 mongosh mongodb://admin:admin12310.6.69.145:27017,10.6.69.146:27017,10.6.69.148:27017/admin sh.status()正常输出示例--- shards --- [ { _id: shard1ReplSet, host: shard1ReplSet/10.6.69.145:27019,10.6.69.146:27019,10.6.69.148:27019, state: 1 }, { _id: shard2ReplSet, host: shard2ReplSet/10.6.69.145:27020,10.6.69.146:27020,10.6.69.148:27020, state: 1 }, { _id: shard3ReplSet, host: shard3ReplSet/10.6.69.145:27021,10.6.69.146:27021,10.6.69.148:27021, state: 1 } ] --- active mongoses --- [ { 6.0.27: 3 } ] --- autosplit --- { Currently enabled: yes }8.2 写入测试use myapp // 写入数据自动路由到某个 Shard db.orders.insertMany([ { _id: 1, customer_id: C001, item: iPhone, amount: 8000, status: pending }, { _id: 2, customer_id: C002, item: MacBook, amount: 15000, status: paid }, { _id: 3, customer_id: C003, item: AirPods, amount: 2000, status: shipped } ]) // 查询 db.orders.find({ customer_id: C001 }) db.orders.countDocuments()8.3 查看数据分布// 查看 chunks 分布 db.orders.getShardDistribution() // 查看各 Shard 里的文档数量 db.orders.aggregate([ { $group: { _id: null, total: { $sum: 1 } } } ]) // 通过 explain 看查询是否走了分片 db.orders.find({ customer_id: C001 }).explain()8.4 主从角色验证// 连接某台 Shard 的 Primary看 ismaster mongosh --host 10.6.69.145 --port 27019 db.adminCommand({ isMaster: 1 }) // ismaster: true → PRIMARY // secondary: true → SECONDARY // 查看副本集成员状态 rs.status().members.forEach(function(m) { print(m.name - m.stateStr) })九、客户端连接方式9.1 MongoDB Compass图形化客户端连接串 mongodb://admin:admin12310.6.69.145:27017,10.6.69.146:27017,10.6.69.148:27017/admin?replicaSet__mongosReplSet 注意连接 Compass 时 replicaSet 参数需要跟 mongos 的副本集名称匹配9.2 mongosh命令行客户端# 无认证连接 mongosh --host 10.6.69.145 --port 27017 # 有认证连接 mongosh mongodb://admin:admin12310.6.69.145:27017,10.6.69.146:27017,10.6.69.148:27017/admin # 指定数据库 mongosh mongodb://app_user:AppPass12310.6.69.145:27017,10.6.69.146:27017,10.6.69.148:27017/myapp9.3 Python 连接示例from pymongo import MongoClient # 连接串自动发现mongos uri mongodb://admin:admin12310.6.69.145:27017,10.6.69.146:27017,10.6.69.148:27017/admin?replicaSet__mongosReplSet client MongoClient(uri) # 插入 client.myapp.orders.insert_one({ customer_id: C100, item: Test, amount: 99 }) # 查询 result client.myapp.orders.find_one({customer_id: C100}) print(result)十、生产检查清单部署完成后的必检项// 1. 分片集群状态 sh.status() // 检查项3个shard都是state:13个mong都是同一个版本 // 2. Config Server 副本集 // 连接 10.6.69.145:27018 db.adminCommand({ isMaster: 1 }) // 检查项configReplSet 有 3 个成员其中一个是 ismaster:true // 3. 三个 Shard 副本集 // 分别连接 27019/27020/27021 rs.status() // 检查项每个副本集都有 1 个 PRIMARY2 个 SECONDARY // 4. 数据写入测试 db.test_col.insertOne({ test: hello }) db.test_col.find() // 检查项能写入、能读回 // 5. 开启 autosplit允许自动分裂Chunk sh.getBalancerState() // 应该返回 true // 6. 安全加固 // 创建应用专用账号已完成于第6步 // 确认 bind_ip 不是 0.0.0.0生产应用应限制来源IP快速运维命令速查// 集群 sh.status() // 查看集群全貌 sh.addShard(shard_name/host:port) // 添加分片 sh.enableSharding(db_name) // 启用数据库分片 sh.shardCollection(db.coll, {key:hashed}) // 对集合分片 sh.getBalancerState() // 查看均衡器状态 // 副本集 rs.status() // 副本集状态 rs.isMaster() // 当前节点角色 rs.add(host:port) // 添加节点 rs.remove(host:port) // 移除节点 // 数据 db.collection.insertOne({}) // 插入单条 db.collection.find({}) // 查询 db.collection.updateOne({}, {$set:{}}) // 更新 db.collection.deleteOne({}) // 删除 db.collection.countDocuments() // 统计 // 索引 db.collection.createIndex({field:1}) // 创建索引 db.collection.getIndexes() // 查看索引 db.collection.dropIndex(index_name) // 删除索引十一、常见问题Q1: mongos 启动报错 “Failed to connect to config servers”原因Config Server 没有启动或者副本集没有初始化 解决先启动3台机器的 Config Server执行 rs.initiate()再启动 mongosQ2: sh.status() 看不到 shard原因分片没有添加或者 Shard 副本集没有初始化 解决mongos 里执行 sh.addShard() 添加每个分片Q3: 写入数据后查不到原因没有通过 mongos 写入而是直接写到了某个 Shard 解决所有客户端必须通过 mongos:27017 访问不要直连 Shard 端口Q4: Secondary 节点无法读取原因默认读请求发到 PRIMARYSecondary 需要设置 readPreference 解决mongosh --readPreference secondaryPreferredQ5: Chunk 自动分裂没生效原因Autosplit 默认开启但 Chunk 大小要到阈值才分裂默认 128MB 解决上线初期可以手动预分裂 sh.splitAt(myapp.orders, {customer_id: NumberLong(1000)})

更多文章