本文主要介绍MongoDB数据库的分表分库策略,包括分表分库的概念、实施方法和最佳实践等核心内容。风哥教程参考MongoDB官方文档Sharding相关章节。
目录大纲
Part01-基础概念与理论知识
1.1 分表分库概述
分表分库是一种数据库水平扩展的方法,通过将数据分散到多个表或多个数据库中,提高系统的存储容量和处理能力。在MongoDB中,分表分库主要通过分片(Sharding)来实现。
分表分库的主要目的是解决单表数据量过大、性能下降的问题,适用于数据量较大、并发访问较高的场景。学习交流加群风哥微信: itpux-com
1.2 分表分库策略
MongoDB的分表分库策略包括:
- 范围分片:根据分片键的范围将数据分布到不同的分片
- 哈希分片:根据分片键的哈希值将数据分布到不同的分片
- 标签分片:根据标签将数据分布到特定的分片
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 分表分库规划
分表分库规划包括:
- 数据量评估:评估现有数据量和增长趋势
- 分片数量:根据数据量和性能需求确定分片数量
- 硬件规划:为每个分片规划足够的硬件资源
- 网络规划:确保分片之间的网络连接稳定
- 备份策略:制定分片集群的备份策略
风哥提示:合理的规划是分表分库成功实施的基础。
2.2 分片键选择
分片键选择的重要性:
- 分片键决定了数据如何分布到不同的分片
- 好的分片键可以实现数据的均匀分布
- 好的分片键可以提高查询性能
分片键选择原则:
- 基数高:有足够多的不同值
- 分布均匀:数据在分片间均匀分布
- 查询模式匹配:与常见查询模式匹配
更多学习教程公众号风哥教程itpux_com
Part03-生产环境项目实施方案
3.1 分表分库实施
启用数据库分片:
# 连接路由服务器
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27017
# 启用数据库分片
sh.enableSharding(“fgedudb”)
# 为集合创建分片键
sh.shardCollection(“fgedudb.fgedu_users”, { “_id”: “hashed” })
sh.shardCollection(“fgedudb.fgedu_orders”, { “order_date”: 1 })
3.2 分片集群配置
配置分片集群:
# 启动配置服务器
/mongodb/app/bin/mongod –configsvr –replSet configReplSet –dbpath /mongodb/config/data –port 27019
# 启动分片1
/mongodb/app/bin/mongod –shardsvr –replSet shard1ReplSet –dbpath /mongodb/shard1/data –port 27018
# 启动分片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
Part04-生产案例与实战讲解
4.1 分表分库实战
测试分片效果:
# 连接路由服务器
/mongodb/app/bin/mongosh –host 192.168.1.100 –port 27017
# 插入测试数据
use fgedudb
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)
fgedudb.fgedu_orders
shard key: { “order_date” : 1 }
unique: false
balancing: true
chunks:
shard1ReplSet 1
shard2ReplSet 1
{ “order_date” : { “$minKey” : 1 } } –>> { “order_date” : ISODate(“2026-04-01T00:00:00Z”) } on : shard1ReplSet Timestamp(2, 0)
{ “order_date” : ISODate(“2026-04-01T00:00:00Z”) } –>> { “order_date” : { “$maxKey” : 1 } } on : shard2ReplSet Timestamp(2, 1)
风哥提示:定期查看分片集群状态,确保集群正常运行。
Part05-风哥经验总结与分享
5.1 分表分库最佳实践
风哥建议的分表分库最佳实践:
- 选择合适的分片键,确保数据均匀分布
- 使用副本集作为分片,提高可用性
- 配置足够的分片数量,满足数据增长需求
- 监控分片集群的状态和性能
- 定期备份分片数据
- 合理设置块大小(chunk size)
- 避免在分片键上进行修改操作
学习交流加群风哥QQ113257174
5.2 性能优化建议
分表分库性能优化建议:
- 使用合适的分片键,减少跨分片查询
- 为常用查询创建合适的索引
- 调整WiredTiger缓存大小,提高内存使用效率
- 使用SSD存储,提高I/O性能
- 监控分片集群的性能指标,及时发现和解决问题
- 合理设置MongoS的数量,平衡负载
更多视频教程www.fgedu.net.cn
注意事项
- 分表分库的部署和管理比单节点复杂,需要更多的运维经验
- 分片键一旦选择,不能轻易修改
- 跨分片查询可能会影响性能
- 分表分库的备份和恢复比单节点复杂
- 应根据数据量和性能需求合理规划分表分库
- 定期监控分表分库的状态,确保集群正常运行
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
