1. 首页 > MongoDB教程 > 正文

MongoDB教程FG073-MongoDB数据库分片集群实战

本文主要介绍MongoDB数据库的分片集群设计与实现,包括分片架构、分片键选择和集群管理等核心功能。风哥教程参考MongoDB官方文档Sharding相关章节。

目录大纲

Part01-基础概念与理论知识

Part02-生产环境规划与建议

Part03-生产环境项目实施方案

Part04-生产案例与实战讲解

Part05-风哥经验总结与分享

Part01-基础概念与理论知识

1.1 分片集群概述

分片集群是MongoDB用于处理大规模数据的分布式解决方案。通过将数据分散到多个分片(shard)上,分片集群可以提高系统的存储容量和处理能力,同时提供更好的性能和可用性。

分片集群适用于数据量较大、并发访问较高的场景,是MongoDB应对大数据挑战的重要手段。学习交流加群风哥微信: itpux-com

1.2 分片集群架构

MongoDB分片集群由以下组件组成:

  • 分片(Shard):存储数据的节点,通常是一个副本集
  • 配置服务器(Config Server):存储集群的配置信息
  • 路由服务器(Mongos):客户端的入口点,负责将请求路由到相应的分片

分片集群的工作原理是将数据按照分片键(Shard Key)分散到不同的分片上,实现数据的水平扩展。更多视频教程www.fgedu.net.cn

Part02-生产环境规划与建议

2.1 分片集群规划

分片集群规划包括:

  • 分片数量:根据数据量和性能需求确定
  • 硬件配置:每个分片的硬件资源配置
  • 网络规划:确保分片之间的网络连接稳定
  • 副本集配置:每个分片作为一个副本集,确保高可用性
  • 配置服务器:使用3个配置服务器确保高可用性

风哥提示:合理的规划是分片集群成功部署的基础。

2.2 分片键选择

分片键选择的重要性:

  • 分片键决定了数据如何分布到不同的分片
  • 好的分片键可以实现数据的均匀分布
  • 好的分片键可以提高查询性能

分片键选择原则:

  • 基数高:有足够多的不同值
  • 分布均匀:数据在分片间均匀分布
  • 查询模式匹配:与常见查询模式匹配

更多学习教程公众号风哥教程itpux_com

Part03-生产环境项目实施方案

3.1 分片集群部署

部署配置服务器:

# 创建配置服务器数据目录
mkdir -p /mongodb/config/data

# 启动配置服务器
/mongodb/app/bin/mongod –configsvr –replSet configReplSet –dbpath /mongodb/config/data –port 27019

部署分片:

# 创建分片1数据目录
mkdir -p /mongodb/shard1/data

# 启动分片1
/mongodb/app/bin/mongod –shardsvr –replSet shard1ReplSet –dbpath /mongodb/shard1/data –port 27018

# 创建分片2数据目录
mkdir -p /mongodb/shard2/data

# 启动分片2
/mongodb/app/bin/mongod –shardsvr –replSet shard2ReplSet –dbpath /mongodb/shard2/data –port 27020

部署路由服务器:

# 启动路由服务器
/mongodb/app/bin/mongos –configdb configReplSet/192.168.1.100:27019 –port 27017

3.2 分片配置

初始化配置服务器副本集:

# 连接配置服务器
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27019

# 初始化副本集
rs.initiate({ _id: “configReplSet”, members: [{ _id: 0, host: “192.168.1.100:27019” }] })

初始化分片副本集:

# 连接分片1
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27018

# 初始化副本集
rs.initiate({ _id: “shard1ReplSet”, members: [{ _id: 0, host: “192.168.1.100:27018” }] })

# 连接分片2
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27020

# 初始化副本集
rs.initiate({ _id: “shard2ReplSet”, members: [{ _id: 0, host: “192.168.1.100:27020” }] })

添加分片到集群:

# 连接路由服务器
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27017

# 添加分片1
sh.addShard(“shard1ReplSet/192.168.1.100:27018”)

# 添加分片2
sh.addShard(“shard2ReplSet/192.168.1.100:27020”)

Part04-生产案例与实战讲解

4.1 分片集群实战

启用数据库分片:

# 连接路由服务器
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27017

# 启用数据库分片
sh.enableSharding(“fgedudb”)

# 为集合创建分片键
sh.shardCollection(“fgedudb.fgedu_users”, { “_id”: “hashed” })

测试分片效果:

# 插入测试数据
for (let i = 0; i < 10000; i++) { db.fgedu_users.insertOne({ name: "User" + i, age: Math.floor(Math.random() * 60) + 18, email: "user" + i + "@fgedu.net.cn" }); } # 查看分片分布 db.fgedu_users.getShardDistribution() # 输出日志 Shard shard1ReplSet at shard1ReplSet/192.168.1.100:27018 data : 1.2MB docs : 5023 chunks : 2 estimated data per chunk : 614KB estimated docs per chunk : 2511 Shard shard2ReplSet at shard2ReplSet/192.168.1.100:27020 data : 1.2MB docs : 4977 chunks : 2 estimated data per chunk : 614KB estimated docs per chunk : 2488 Totals data : 2.4MB docs : 10000 chunks : 4 Shard shard1ReplSet contains 50.23% data, 50.23% docs in cluster, avg obj size on shard : 245B Shard shard2ReplSet contains 49.77% data, 49.77% docs in cluster, avg obj size on shard : 246B

from MongoDB视频:www.itpux.com

4.2 分片管理实战

查看分片集群状态:

# 连接路由服务器
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27017

# 查看集群状态
sh.status()

# 输出日志
— Sharding Status —
sharding version: {
“_id” : 1,
“minCompatibleVersion” : 5,
“currentVersion” : 6,
“clusterId” : ObjectId(“60a7b8c9d0e1f2a3b4c5d6e7”)
}
shards:
{ “_id” : “shard1ReplSet”, “host” : “shard1ReplSet/192.168.1.100:27018”, “state” : 1 }
{ “_id” : “shard2ReplSet”, “host” : “shard2ReplSet/192.168.1.100:27020”, “state” : 1 }
active mongoses:
“5.0.0” : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ “_id” : “admin”, “primary” : “config”, “partitioned” : false }
{ “_id” : “config”, “primary” : “config”, “partitioned” : true }
{ “_id” : “fgedudb”, “primary” : “shard1ReplSet”, “partitioned” : true, “version” : { “uuid” : UUID(“12345678-1234-5678-1234-567812345678”), “lastMod” : 1 } }
fgedudb.fgedu_users
shard key: { “_id” : “hashed” }
unique: false
balancing: true
chunks:
shard1ReplSet 2
shard2ReplSet 2
{ “_id” : { “$minKey” : 1 } } –>> { “_id” : NumberLong(0) } on : shard1ReplSet Timestamp(1, 0)
{ “_id” : NumberLong(0) } –>> { “_id” : NumberLong(4611686018427387904) } on : shard1ReplSet Timestamp(1, 1)
{ “_id” : NumberLong(4611686018427387904) } –>> { “_id” : NumberLong(9223372036854775807) } on : shard2ReplSet Timestamp(1, 2)
{ “_id” : NumberLong(9223372036854775807) } –>> { “_id” : { “$maxKey” : 1 } } on : shard2ReplSet Timestamp(1, 3)

风哥提示:定期查看分片集群状态,确保集群正常运行。

Part05-风哥经验总结与分享

5.1 分片集群最佳实践

风哥建议的分片集群最佳实践:

  • 选择合适的分片键,确保数据均匀分布
  • 使用副本集作为分片,提高可用性
  • 配置足够的分片数量,满足数据增长需求
  • 监控分片集群的状态和性能
  • 定期备份分片数据
  • 合理设置块大小(chunk size)
  • 避免在分片键上进行修改操作

学习交流加群风哥QQ113257174

5.2 性能优化建议

分片集群的性能优化建议:

  • 使用合适的分片键,减少跨分片查询
  • 为常用查询创建合适的索引
  • 调整WiredTiger缓存大小,提高内存使用效率
  • 使用SSD存储,提高I/O性能
  • 监控分片集群的性能指标,及时发现和解决问题
  • 合理设置MongoS的数量,平衡负载

更多视频教程www.fgedu.net.cn

注意事项

  • 分片集群的部署和管理比副本集复杂,需要更多的运维经验
  • 分片键一旦选择,不能轻易修改
  • 跨分片查询可能会影响性能
  • 分片集群的备份和恢复比单节点复杂
  • 应根据数据量和性能需求合理规划分片集群
  • 定期监控分片集群的状态,确保集群正常运行

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息