MongoDB Sharding及数据库设计

本文探讨MongoDB分片的基本原理与最佳实践,包括分片键的选择、Chunk大小配置的影响、以及如何优化数据分布与查询性能。同时,还介绍了MongoDB数据库设计原则,如禁用自动分片、开启库级分片等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、MongoDB Sharding
  • 基本共识
    • 随机I/O转为顺序I/O;
    • 步骤越少,查询越简单,性能越高。多做不如少做,少做不如不做;
    • 大数据查询,分布式并行查询能力高;
  • 三个注意事项
    • 插入文档必须带上sharding key
    • 不接受修改片键值(读取、删除、插入新文档)
    • 如果文档中包含不同类型的值,排序规则,按照类型排序,同类型与大家期望相同;
  • ChunkSize选择
    • 默认64M;
    • 与线上实际引用有关;
    • Chunk的分裂与迁移非常消耗IO资源;
    • 分裂时机(插入更新、更新文档时,读数据不会产生分裂)
    • ChunkSize(数据预填充、浪费空间但是只在最初进行分裂,获取平滑的查改性能);
    • 小的迁移速度块、分布均匀,但是数据均衡比较频繁、块分裂更频繁、路由节点消耗更多资源定位;
    • 优点:块分裂小、路由定位块、避免虚假迁移;缺点:迁移时资源消耗比较大,抖动,数据分布不均匀;
    • 通常100-200M,不同系统磁盘介质不同(前十几块为64M,数据量大时将会变成设置);Read10;centos,xfs
    • MonogoDB支持修改ChunkSize;请测试确认后再进行调整;线上调整ChunkSize可能会导致灾难性I/O;调小可能会引起过多分裂;调大时可能在达到阈值才进行调整;
2、MongoDB Sharding存在问题及建议;
  • 重要两点
    • 优化均衡器时间
    • mongodb很lazy,但是脑残;(均衡器执行器的执行过程可能很长,导致影响应用)
  • Balacer设置(问题)
    • count值布准确;
    • 唯一值不唯一
    • update更新的记录数出现问题;
    • 0~7点进行均衡,mongos进行设置,使用config表进行设置,$set,$unset;
  • Sharding key选择
    • 指定sharding key;
    • chunk分布不均衡时导致chunk迁移;
  • 集群角色
    • Mongos数据读写;
    • config保存映射:key-》chunk,chunk-》node;
    • 路由节点通过config server获取数据;
    • 路由节点判定是否超过具体大小;
    • 分片key路由到update进行操作;
    • 按分片查询进行具体操作;
    • 不同分片会分别进行操作,然后进行结果聚合;
  • Sharding key选择
    • 递增sharding key;数据文件挪动少(优势);数据文件递增所以insert都会会放在最后一个分片,成为热点;随着最后的扩大导致分裂;
    • 随机sharding key;数据分布均匀(优势);大量的随机IO,磁盘压力比较大;
    • 混合型sharing key,大范围递增key+随机分布的key;大方向但调增不断写入新的文件,尽量不要让写放在多个节点上;小方向随机分布保证数据均匀分布在分片上分摊写压力;
  • Sharding key总结
    • 单一Sharding key导致分布不均匀,无法充分利用分片性能;
    • 使用复合Sharding key,符合Sharding key不可更改,并且在MapReduce性能消耗;
    • count在chunk移动时计数偏大,务必减少chunk移动;
    • Balance稳定性不够智能、稳定;
  • Auto-Sharding key并不是很靠谱;
3、MongoDB库设计原则及实践
  • 线上环境禁用Auto-Sharding;
  • 开启库级分片;
  • 特定库制定到固定分片上;
  • Collection级别手动Sharding;
  • MongoDB数据模型选择
    • CAP原则
    • CP,w=Replica Set,开启SlaveOK
    • w=1,slaveOk开启;
    • w=1,不开启slaveOK;
  • 库设计
    • 判断业务增长速度,什么量级,之后是什么增长速度;
    • sharding分片数;
    • memory>index+hot data;
    • 索引和热门数据要大于内存;
    • local库存放oplog,oplog需要消耗内存;
    • 高插入高更新,并带有延时库需要设置较大oplog
    • 如果没有延时可选用小一些oplog
### MongoDB 分片实现与最佳实践 #### 什么是分片? 分片是指将数据水平分割成较小的部分并分布到多个服务器上的过程。通过这种方式,可以显著提高系统的可扩展性和性能[^1]。 #### 如何配置分片集群? 为了设置MongoDB分片环境,通常需要三个主要组件: - **配置服务器**:存储有关整个集群元数据的信息。 - **查询路由器 (mongos)** :作为客户端应用程序访问分片数据的接口。 - **分片节点**:实际保存被切分的数据副本集实例。 创建一个简单的两成员复制集,并将其注册为新的shard之前,应该先启动至少一台`mongos`路由服务以及三台用于管理状态信息的config server。之后就可以利用admin数据库下的addShard命令来增加新加入的资源了[^3]。 ```bash # 启动 mongos 路由器 mongos --configdb <replica-set-name>/<host1>:<port>,<host2>:<port> # 添加 shard 到集群中 use admin; sh.addShard("<hostname_or_ip_of_shard_member>:<port>") ``` #### 数据库集合启用分片功能 一旦建立了基本架构,则可以通过指定特定字段作为键来进行更细粒度的操作——即开启某个collection级别的共享支持;这一步骤同样是在全局性的Admin命名空间下完成的。选择合适的shard key对于优化读写效率至关重要,因为它决定了文档如何分布在不同的物理位置上。 ```javascript // 开启 collection 的 sharding 支持 sh.enableSharding("yourDatabaseName"); // 对具体表应用 Shard Key sh.shardCollection( "yourDatabaseName.yourCollectionName", { "_id": "hashed" } // 使用哈希方式分配记录 ); ``` #### 最佳实践建议 当设计和部署基于MongoDB的应用程序时,遵循一些指导原则可以帮助确保良好的表现力和服务质量: - 尽量选取具有高基数特性的属性作为shard key候选者; - 预估未来增长趋势合理规划初始硬件资源配置; - 定期监控系统健康状况并对瓶颈做出及时响应调整; - 测试不同场景下的事务处理能力以验证稳定性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值