暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MongoDB-从0到1-分片架构详解与实践

原创 赵师的工作日 2024-12-20
315

Snipaste_20240125_134647.png

作者:赵师的工作日(赵明中)
现役Oracle ACE、MySQL 8.0 ocp、TiDB PCTA\PCTP、Elasticsearch Certified Engineer
微信公众号:赵师的工作日
CSND:赵师的工作日
二维码.png

MongoDB通过自动分片(Sharding)来支持大规模数据集的水平扩展。分片是指将数据分布在多个服务器(节点)上,使得每个节点只存储数据的一部分,从而提高系统的吞吐量、性能和可伸缩性。

什么是分片架构?

分片是指将数据分割成多个小块(称为“分片”),每个分片存储数据集的一部分,并分布在集群的不同节点上。分片架构不仅提高了数据库的容量和性能,还能确保在数据量大到无法单机存储时,依然可以保证系统的可扩展性。

在 MongoDB 分片架构中,有以下几个重要组件:

  • Shard(分片): 每个分片是一个独立的 MongoDB 实例(或副本集)。它存储数据的一个子集。
  • Config Servers(配置服务器): 配置服务器保存分片集群的元数据,包括分片的信息和数据分布情况。一般部署三个配置服务器以确保高可用性。
  • Mongos(路由器): Mongos 是 MongoDB 的分片路由器,它负责将客户端请求路由到正确的分片上。Mongos 充当客户端和分片之间的中介,它从配置服务器获取分片元数据,并根据该信息将请求转发到相应的分片。

分片方式

MongoDB 提供了几种不同的分片策略来处理数据的分片,主要包括:

  • 范围分片(Range Sharding): 基于指定的字段范围进行数据分片,适用于数据按某个字段范围查找的场景。
  • 哈希分片(Hash Sharding): 使用哈希函数将数据映射到不同的分片上,适用于均匀分布数据的场景。
  • 复合分片(Compound Sharding): 基于多个字段来进行分片,适用于多维度查询场景。

为什么需要分片?

随着数据量的增加,单台服务器的存储能力和处理能力将不再足够。这时,MongoDB 的分片架构可以通过以下几种方式帮助我们解决问题:

  • 数据存储扩展: 分片可以将数据分布在多个物理节点上,突破单台服务器的存储限制。
  • 负载均衡: 通过将请求分发到不同的分片节点,MongoDB 可以在多个服务器之间均衡负载,避免某个单节点成为瓶颈。
  • 高可用性: 配合副本集,MongoDB 的分片架构可以实现高可用性,确保即使某个分片或节点宕机,系统依然能够正常工作。

如何搭建 MongoDB 分片集群

  1. 安装 MongoDB
    在搭建 MongoDB 分片集群之前,需要先安装 MongoDB 单实例
  2. 配置配置服务器(Config Servers)
    MongoDB 的配置服务器存储分片集群的元数据。为了保证高可用性,MongoDB 要求配置服务器使用副本集,这里将部署三个配置服务器。
编辑配置文件 /etc/mongod.conf:
yaml
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
net:
  bindIp: 0.0.0.0
  port: 27019   # 配置服务器使用不同的端口
replication:
  replSetName: configReplSet
sharding:
  clusterRole: configsvr
启动配置服务器:
bash
mongod --configsvr --replSet configReplSet --bind_ip 0.0.0.0 --port 27019
初始化配置服务器副本集:
bash
mongo --host 192.168.1.10 --port 27019
rs.initiate()
检查副本集状态:
bash
rs.status()
  1. 配置分片服务器(Shard Servers)
    分片服务器是存储数据实际内容的 MongoDB 实例。每个分片服务器通常也是一个副本集。
编辑每个分片的配置文件 /etc/mongod.conf,设置 sharding 和 replication 参数:
yaml
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
net:
  bindIp: 0.0.0.0
  port: 27018    # 分片服务器使用不同的端口
replication:
  replSetName: shardReplSet
sharding:
  clusterRole: shardsvr
启动每个分片服务器:
bash
mongod --shardsvr --replSet shardReplSet --bind_ip 0.0.0.0 --port 27018
初始化分片副本集:
bash
mongo --host 192.168.1.10 --port 27018
rs.initiate()
  1. 配置路由服务器(Mongos)
    路由服务器(Mongos)是客户端与 MongoDB 集群之间的中介,它负责请求的路由。
启动 Mongos 实例:
bash
mongos --configdb configReplSet/192.168.1.10:27019,192.168.1.11:27019,192.168.1.12:27019
在 MongoDB 客户端连接时,指定 Mongos 作为路由:
bash
mongo --host 192.168.1.10 --port 27017
  1. 将分片添加到集群中
    连接到 Mongos 后,可以将分片添加到集群中:
javascript
sh.addShard("shardReplSet/192.168.1.10:27018")
sh.addShard("shardReplSet/192.168.1.11:27018")
sh.addShard("shardReplSet/192.168.1.12:27018")
  1. 创建分片集合
    选择一个数据库,启用分片并指定分片键:
javascript
use myDatabase
sh.enableSharding("myDatabase")
sh.shardCollection("myDatabase.myCollection", { "_id" : 1 })

此时,数据将根据 _id 字段被分片。

分片集群的管理与监控

搭建完 MongoDB 分片集群后,管理和监控分片集群的健康状态非常重要。

常用的管理命令

查看集群状态:
javascript
sh.status()
查看分片统计信息:
javascript
db.stats()
查看配置服务器状态:
javascript
rs.status()
查看分片的负载均衡:
javascript
sh.getBalancerState()

性能优化

  • 选择合适的分片键: 分片键的选择至关重要。如果分片键选择不当,可能导致数据分布不均,性能瓶颈。
  • 定期检查数据平衡: 可以使用 MongoDB 的自动平衡机制,也可以手动执行数据平衡。
  • 监控和报警: 使用 MongoDB Ops Manager 或开源工具(如 Prometheus)进行集群的实时监控。
最后修改时间:2025-01-02 19:29:12
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论