1. 首页 > MongoDB教程 > 正文

MongoDB教程FG081-MongoDB数据库分表分库实战

本文主要介绍MongoDB数据库的分表分库策略,包括分表分库的概念、实施方法和最佳实践等核心内容。风哥教程参考MongoDB官方文档Sharding相关章节。

目录大纲

Part01-基础概念与理论知识

Part02-生产环境规划与建议

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

Part04-生产案例与实战讲解

Part05-风哥经验总结与分享

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

联系我们

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

微信号:itpux-com

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