如何通过MongoDB分片技术,轻松驾驭海量数据挑战?
- 内容介绍
- 文章标签
- 相关推荐
面对数十亿条记录的存储与查询,传统单节点部署往往会出现读写瓶颈查询延迟甚至宕机风险。说到使用者常抱怨,
- 数据库响应慢,特别是大表查询时。说起来,
- 单台服务器压力过高。导致硬件升级成本飙升,
- 横向 困难,无法快速满足业务增长。按理说,
- 维护成本高。数据迁移和备份变得繁琐,
MongoDB 的分片技术正是为了解决这些痛点而生。其实,它通过将数据均匀分布到多台服务器上,并通过路由层透明地将请求转发到对应的数据节点。实现水平 高可用性与查询性能提高。
什么是 MongoDB 分片?
分片指的是把一个大集合拆成若干子集,每个子集存放在不同的服务器上。每个子集称为一个“Chunk”,所有 Chunk 共同构成整个集合。MongoDB 通过在配置服务器中维护元数据来跟踪 Chunk 的位置,并利用路由服务器将客户端请求路由到正确的 Shard。
说到使用者痛点,为什么需要分片?
- 海量数据压垮单机: 当数据量达到 TB 级别时单机磁盘 IO 与内存压力极大,导致查询响应时间飙升。
- 热点数据集中导致热点失衡: 某些业务字段频繁访问。使得单个 Shard 成为瓶颈,从而影响整体吞吐量。
- 升级与扩容成本高: 传统方案需要停机或复制大量数据,新设备投入后还需手动迁移。
- 运维复杂度提高: 需要监控多台机器、协调备份、处理故障恢复等问题。
分片架构概览
- 配置服务器 : 存储全局元数据,如 Shard 列表、Chunk 分布信息和索引元信息。建议部署至少 3 台以实现 HA。
- Shard 服务器 : 每个 Shard 通常包含两台副本集成员,以保证读写高可用。实际存储业务数据的地方,
- 路由层 : 为应用提供统一入口,将客户端请求根据 Chunk 方法映射到相应 Shard;,只做路由与缓存工作,
如何在 Ubuntu 上实现 MongoDB 分片?
1️⃣ 安装 MongoDB 官方仓库并安装 MongoDB 包
$ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add - $ echo "deb https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list $ sudo apt-get update $ sudo apt-get install -y mongodb-org $ sudo systemctl start mongod $ sudo systemctl enable mongod
2️⃣ 配置 Config Server 集群
Create a replica set named configReplSetName. Each Config Server runs on a separate host.
$ mongo --port 27019 --eval 'rs.initiate({
_id : "configReplSetName",members : })'
$ # 确认状态
$ mongo --port 27019 --eval 'rs.status'
3️⃣ 启动 Shard Replica Sets
Create two shard replica sets each with at least two members.
$ mongo --port 27018 --eval 'rs.initiate({
_id : "sreplsetA"。members : })'
$ mongo --port 27018 --eval 'rs.status'
# Repeat for sreplsetB on port 27118...
4️⃣ 启动 mongos 路由层并连接到 Config Server 集群
$ mongos --configdb configReplSetName/config01.example.com:27019,\ config02.example.com:27019,\ config03.example.com:27019 \ --port 27017 \ --bindipall &
$ netstat -tln | grep ":27017" 127.0.0.1:27017 LISTEN 至于::1,27017 LISTEN
5️⃣ 在 mongos 上添加 Shards 并启用数据库与集合分片化
a) 添加 Shards:
$ mongo --port 27017
b) 创建数据库并开启分片功能:
use myLargeDataDb
6️⃣ 为集合选择合适的 shard key 并开启集合分片化
A good shard key should be:
- #High cardinality & uniform distribution.
- #Frequently used in queries or range scans.
- #Immutable after insertion.
Select a key and shard collection:
db.orders.createIndex # 使用 hashed key 更均匀地散列文档。
常用方法 &️ 运维技巧
- 监控指标:- Chunk 大小 & 数量 - 每个 Shard 的磁盘占用率 - 网络 I/O 与 CPU 利用率 - read/write 延迟趋势
- 定期重平衡:**mongos** 自动启动 balancer。但你可以手动开启或关闭,以避免在批量导入期间产生大量网络流量。
- 读写分离策略:**Replica Set** 提供从节点读取,可进一步降低主节点压力;如使用 WiredTiger 存储引擎,可开启 ReadConcern 等高级功能。
-
备份方案:使用
wiredTigerBackupTool.js` 或第三方工具进行增量快照;不要忘记对 Config Server 做完整备份,因为它保存了全局元数据!老实说,
🚀
面对数十亿条记录的存储与查询,传统单节点部署往往会出现读写瓶颈查询延迟甚至宕机风险。说到使用者常抱怨,
- 数据库响应慢,特别是大表查询时。说起来,
- 单台服务器压力过高。导致硬件升级成本飙升,
- 横向 困难,无法快速满足业务增长。按理说,
- 维护成本高。数据迁移和备份变得繁琐,
MongoDB 的分片技术正是为了解决这些痛点而生。其实,它通过将数据均匀分布到多台服务器上,并通过路由层透明地将请求转发到对应的数据节点。实现水平 高可用性与查询性能提高。
什么是 MongoDB 分片?
分片指的是把一个大集合拆成若干子集,每个子集存放在不同的服务器上。每个子集称为一个“Chunk”,所有 Chunk 共同构成整个集合。MongoDB 通过在配置服务器中维护元数据来跟踪 Chunk 的位置,并利用路由服务器将客户端请求路由到正确的 Shard。
说到使用者痛点,为什么需要分片?
- 海量数据压垮单机: 当数据量达到 TB 级别时单机磁盘 IO 与内存压力极大,导致查询响应时间飙升。
- 热点数据集中导致热点失衡: 某些业务字段频繁访问。使得单个 Shard 成为瓶颈,从而影响整体吞吐量。
- 升级与扩容成本高: 传统方案需要停机或复制大量数据,新设备投入后还需手动迁移。
- 运维复杂度提高: 需要监控多台机器、协调备份、处理故障恢复等问题。
分片架构概览
- 配置服务器 : 存储全局元数据,如 Shard 列表、Chunk 分布信息和索引元信息。建议部署至少 3 台以实现 HA。
- Shard 服务器 : 每个 Shard 通常包含两台副本集成员,以保证读写高可用。实际存储业务数据的地方,
- 路由层 : 为应用提供统一入口,将客户端请求根据 Chunk 方法映射到相应 Shard;,只做路由与缓存工作,
如何在 Ubuntu 上实现 MongoDB 分片?
1️⃣ 安装 MongoDB 官方仓库并安装 MongoDB 包
$ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add - $ echo "deb https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list $ sudo apt-get update $ sudo apt-get install -y mongodb-org $ sudo systemctl start mongod $ sudo systemctl enable mongod
2️⃣ 配置 Config Server 集群
Create a replica set named configReplSetName. Each Config Server runs on a separate host.
$ mongo --port 27019 --eval 'rs.initiate({
_id : "configReplSetName",members : })'
$ # 确认状态
$ mongo --port 27019 --eval 'rs.status'
3️⃣ 启动 Shard Replica Sets
Create two shard replica sets each with at least two members.
$ mongo --port 27018 --eval 'rs.initiate({
_id : "sreplsetA"。members : })'
$ mongo --port 27018 --eval 'rs.status'
# Repeat for sreplsetB on port 27118...
4️⃣ 启动 mongos 路由层并连接到 Config Server 集群
$ mongos --configdb configReplSetName/config01.example.com:27019,\ config02.example.com:27019,\ config03.example.com:27019 \ --port 27017 \ --bindipall &
$ netstat -tln | grep ":27017" 127.0.0.1:27017 LISTEN 至于::1,27017 LISTEN
5️⃣ 在 mongos 上添加 Shards 并启用数据库与集合分片化
a) 添加 Shards:
$ mongo --port 27017
b) 创建数据库并开启分片功能:
use myLargeDataDb
6️⃣ 为集合选择合适的 shard key 并开启集合分片化
A good shard key should be:
- #High cardinality & uniform distribution.
- #Frequently used in queries or range scans.
- #Immutable after insertion.
Select a key and shard collection:
db.orders.createIndex # 使用 hashed key 更均匀地散列文档。
常用方法 &️ 运维技巧
- 监控指标:- Chunk 大小 & 数量 - 每个 Shard 的磁盘占用率 - 网络 I/O 与 CPU 利用率 - read/write 延迟趋势
- 定期重平衡:**mongos** 自动启动 balancer。但你可以手动开启或关闭,以避免在批量导入期间产生大量网络流量。
- 读写分离策略:**Replica Set** 提供从节点读取,可进一步降低主节点压力;如使用 WiredTiger 存储引擎,可开启 ReadConcern 等高级功能。
-
备份方案:使用
wiredTigerBackupTool.js` 或第三方工具进行增量快照;不要忘记对 Config Server 做完整备份,因为它保存了全局元数据!老实说,

