Mongodb分片集合限制,导致一次上线紧急回滚

MongoDB高危漏洞CVE-2025-14847紧急修复实战:72小时应急响应与安全加固指南 内存安全漏洞是软件安全领域的核心威胁之一,其原理通常源于程序对内存资源的分配、使用或释放管理不当,例如出现悬空指针、缓冲区溢出或资源管理错误。这类漏洞一旦被利用,可能导致敏感信息泄露或服务拒绝,对系统机密性、完整性和可用性构成严重风险。在数据库系统中,此类漏洞危害尤甚,因为数据库作为数据存储与处理的核心,直接关系到业务连续性和数据安全。CVE-2025-14847(代号MongoBleed)正是MongoDB中一个典型的资源管理错误漏洞,攻击者可借此触发内存处理缺陷,造成数据泄露或服务崩溃。其技术价值在于揭 阅读详情

bbef70d269bb3f4a82a6be0142236abf.jpeg

背景

    MongoDB 集群分片中某个节点的磁盘使用率已经达到了 75%,发现一个名为 "visitor" 的集合数据量已经达到了 20 多亿条,占用了 260GB 的磁盘空间。我与研发团队讨论后决定清理数据,需要保留最近半年的数据,但是时间字段没有索引。因此采用的方案是新建新的集合、createTime字段添加索引、同时开启集合分片,使用阿里云DTS实时将数据同步到新的集合,然后研发修改代码将调用老集合的地方更改成新集合。上线后服务报错,紧急回滚了。

问题分析

    根据告警信息提示“Query for sharded findAndModify must contain the shard key”找不到分片键,按照常理如果查询、更新、删除等操作不带分片键,无非就是性能慢,耗时久,不会报错的。立即找研发要到了代码调取数据库的语句,发现这个语句是查询并更新操作,查阅mongodb官方文档,分片集合有一些操作限制。

问题报错:

d206600e8673a42c1f7cb8bcc0756d45.png

问题语句:

db.getCollection("el_frequent_visitor_tmp0425").findOneAndUpdate(    
{ "_id": ObjectId("62982c8c5634657e96467e46") },     
{ $set: { "status": "modified" } },     
{ returnDocument: "after" } )

注意事项:

分片环境中的操作不可用

  • $where不允许引用对象 从$where函数。

  • 分片中不支持 geoSearch 命令 环境。

  • 在 MongoDB 4.2 及更早版本中,您不能在 $lookup 阶段的参数中指定分片集合

分片集合中的单个文档修改操作

在MongoDB中,对分片集合进行单个文档修改操作时有一些限制。特别是针对使用了分片键的操作,需要注意以下几点:

  • updateOne()、updateMany()和deleteOne()操作:如果在对分片集合进行这些操作时指定了 upsert: true 或 multi: false 选项,那么操作的查询条件必须包含分片键或查询字段。如果操作中没有包含分片键或查询字段,则会返回错误。这是因为在分片环境下,MongoDB需要确保操作的一致性和可靠性,因此要求操作条件中包含分片键以确保数据的正确性。

  • findOneAndUpdate()操作:如果要对分片集合使用findOneAndUpdate()操作,查询过滤条件必须包含分片键的等值条件,以便比较键和值。换句话说,查询条件中必须包含一个等于分片键的条件,以便MongoDB能够确定要在哪个分片上执行操作。这样可以确保操作的一致性,并避免在分片集合上出现错误或不一致的结果。

分片集合中的唯一索引

1、在MongoDB中,唯一索引在分片集合中有一些限制。通常情况下,MongoDB不支持跨分片的唯一索引,除非唯一索引包含分片键的完整前缀。在这种情况下,MongoDB会在整个键上强制执行唯一性约束,而不是在单个字段上。

 举个例子:

假设我们有一个分片集合,其分片键是{shardKey: 1, otherField: 1}。如果我们在这个集合上创建了一个唯一索引,如{shardKey: 1},MongoDB会在整个{shardKey, otherField}键上强制执行唯一性约束,而不是仅在shardKey字段上。这意味着即使在不同分片上,只要整个键的值都是唯一的,就不会出现重复的值。

2、这个限制是因为MongoDB在分片环境下需要确保数据的一致性和可靠性。如果允许跨分片的唯一索引,那么在不同分片上的数据变更可能会导致数据不一致的情况发生,因为MongoDB无法轻易地在全局范围内验证唯一性。因此,MongoDB要求唯一索引至少包含分片键的完整前缀,以确保分片键的唯一性。

分片现有集合数据大小

在MongoDB中,对已有的集合进行分片操作时,存在一些限制,其中之一是集合的大小不能超过特定的限制。这些限制可以根据所有分片键值的平均大小和配置的分块大小来估算。

使用以下公式计算理论最大值 集合大小:

maxSplits = 16777216 (bytes) / <average size of shard key values in bytes>

maxCollectionSize (MB) = maxSplits * (chunkSize / 2)

  1. 平均分片键值大小(Average Shard Key Size):首先,需要计算所有分片键值的平均大小。这可以通过对所有文档的分片键值进行求和,然后除以文档总数来获得平均值。

  2. 配置的分块大小(Configured Chunk Size):分片集合中数据的划分是以分块为单位进行的。配置的分块大小是在启用分片时定义的。根据这个配置值,MongoDB会将集合数据划分为不同的分块。

在进行初始分片操作时,如果计算结果显示集合的大小接近或略小于目标集合的大小,为了确保成功的初始分片,可以考虑增加分块大小。这是因为在初始分片过程中,分块的大小直接影响了数据的划分和分布,而适当增加分块大小可以确保数据能够充分分散到不同的分片中,从而避免出现过度拥挤或不均匀的情况。

如果对计算结果是否太接近目标集合大小存在疑问,通常更好的做法是增加分块大小,以确保初始分片的成功。这样可以预防潜在的问题,如数据分布不均匀或分片过度拥挤,从而减少后续调整的必要性。

在成功进行了初始分片之后,可以根据实际情况适当减少分块大小。如果稍后需要减少分块大小,可能需要一段时间才能使所有分块都分裂到新的大小。在修改分块大小时,需要注意确保数据的完整性和可用性,以及对数据库性能可能产生的影响。可以参考《在分片集群中修改分块大小》的指南来进行分块大小的修改操作。

69e5b887a86d8710ecefd10b61272ebd.png

注意:

这些限制只适用于初始的分片操作。一旦成功启用了分片,分片集合可以随着数据的增长而扩展到任意大小。

总结:
    在分片集合中进行查询、更改、删除操作时,最好带上分片键,这样可以提高效率并快速定位数据所在的分片。上线时遇到的回滚问题是因为执行了findOneAndUpdate()操作,但该操作没有带上分片键条件,导致出错。为了解决这个问题,一种较好的方法是在该语句中添加分片键条件。然而,并不是每条语句都能带上分片键条件,因此针对这种情况,可以将查询和更新拆分成两条语句。虽然这样做会降低性能,但能确保操作的正确性。

加入数据库技术交流群:

0891b7b023bc6b0d4e34d2b7b5b511ef.png

进群福利:

1、知识共享与学习机会

2、问题求助与解决支持

3、技术沉淀和分享平台

4、及时了解行业动态

MongoDB Schema Validation 实战指南:用 JSON Schema 保障数据质量 MongoDB 的 Schema Validation 是文档数据库中保障数据一致性的核心机制,其本质是基于 JSON Schema 标准对写入文档执行声明式校验。它通过 bsonType 类型约束、required 必填字段、pattern 正则匹配、enum 枚举控制等原理,在内核层实现原子性验证,避免应用层校验导致的一致性断裂与绕过风险。该技术显著提升数据契约的可维护性与跨系统复用能力,广泛应用于用户注册、订单管理、权限控制等强数据规范场景。本文聚焦真实生产环境中的配置方法、性能陷阱(如 ReDoS) 阅读详情

相关推荐

MongoDB Atlas生产环境Mongoose CRUD避坑指南

MongoDB Atlas并非本地数据库的简单云化,而是一个具备连接池限制、网络延迟、自动故障转移和最终一致性模型的托管服务;Mongoose在其中也不仅是ORM,更是连接治理中枢、数据契约守门员与查询优化编译器。理解其与原生驱动的本质差异,才能规避写入丢失、查询错乱与连接雪崩等高频故障。本文聚焦云环境下的CRUD稳定性设计,涵盖连接池调优、Schema校验强化、复合索引策略及事务边界控制等核心实践,适用于电商订单、SaaS用户中心与IoT日志等高并发真实场景。

weixin_34297704的博客 371

mongo 哪些指令条件需要包含分片

MongoDB中,数据根据一个称为分片键(Shared Key) 的字段进行分片。根据指定字段按照指定分片方式(哈希分片、范围分片)将数据拆分到mongo集群里的不同服务器中分片键的选择非常关键,它应该能够确保数据均匀分布,避免热点问题。分片键通常是在文档中的一个字段,MongoDB根据这个字段的值来决定将文档存储在哪个分片上。

笨死的猪Blog 1142

MongoDB备份恢复迁移:Ubuntu 20.04生产环境避坑指南

MongoDB备份不是简单复制文件,而是涉及WiredTiger引擎快照、oplog日志、系统级权限与服务生命周期的综合工程。其核心原理在于利用MVCC多版本并发控制实现时间点一致性,通过mongodump的--archive和--oplog参数捕获原子快照与增量操作,再经mongorestore完成状态重建。技术价值体现在保障RPO(恢复点目标)<5秒、支持跨版本迁移、规避文件系统级不一致风险。典型应用场景包括电商订单库灾备、Ubuntu 20.04 LTS环境升级迁移、以及基于systemd的自动化备份

weixin_30254435的博客 495

MongoDB数据量方面限制和阈值

参考官方文档:MongoDB Limits and Thresholds,本文总结MongoDB中一些容易被忽视的限制和阈值。 BSON文件 文件大小:16M 文件嵌套层数:100 命名 数据库命名规则:不区分大小写 特殊字符:不能包含空格,windows系统不能包含 /\. "$*<>:|? 对于 MongoDB 部署在 Unix 和 Linux 系统上运行,数据库名称不能包含以下任何字符: /\. "$ 集合命名空间的最大长度(包括数据库 name,点(.)分隔符和集合 name(i.e..

Xixoqw的博客 4293

mongodb 库数量限制_mongodb数据库集合数的限制

这个答案是晚了,但其他答案似乎有点…在可靠性和事实信息薄弱,所以我会尝试补救一点。But for some reason mongodb set limit 24000 for the number of namespaces in the database,这只是默认设置。是的,有一个默认设置。但是,对于命名空间文件(http://docs.mongodb.org/manual/referenc...

weixin_36333534的博客 1473

20220211故障-MongoDB最大支持数据量

MongoDB最大支持数据量

IT民工金鱼哥,专注运维技术。 5245

mongodb 库数量限制_MongoDB 集合上限说明

官方网站有关于这个问题的说明(Using a Large Number of Collections)。默认情况下,MongoDB 的每个数据库的命名空间保存在一个 16MB 的 .ns 文件中,平均每个命名占用约 628 字节,也即整个数据库的命名空间的上限约为 24000。每一个集合、索引都将占用一个命名空间。所以,如果每个集合有一个索引(比如默认的 _id 索引),那么最多可以创建 1200...

weixin_39567943的博客 2395

MongoDB实战避坑指南:从日志系统到电商建模的落地经验

NoSQL数据库核心解决的是高写入、无固定模式、低关联性数据的存储难题,其本质在于以数据自然形态匹配访问模式。MongoDB作为典型文档型数据库,依托BSON结构、嵌套文档、动态Schema和分片能力,在用户行为日志、商品页聚合、IoT时序数据等场景中展现出显著优势;但误用嵌套、忽视分片键设计、混淆集合生命周期或忽略索引原理,极易引发16MB文档限制、慢查询、写冲突与连接池耗尽等生产事故。本文结合12个真实NoSQL项目经验,聚焦文档建模逻辑、CRUD性能陷阱与副本集/分片落地要点,为开发者提供可验证、可复

weixin_34174322的博客 487

mongodb复制

锁 在mongo早期版本中,每个链接都会有锁,在服务器级别,使用互斥锁(互相排序)这种允许多个客户端或者多线程访问相同资源的机制。这种情况下的资源是数据库服务器。但是不是同时并行的。这是最坏的锁,尤其是需要大数据数据库引擎时,同时可能有几千个客户端并发访问 在版本2.2以后做了改变,实现了数据库级别的锁。互斥锁应用在数据库级别而不是整个mongodb服务器实例上,这是个重大的改进。但是mong...

哇哦~ 616

MongoDB 从安装到精通:单机·集群·原理·排障全指南

本文介绍了MongoDB的安装与集群部署指南,涵盖单机模式和集群模式(副本集与分片集群)的详细配置步骤。主要内容包括: 单机安装:提供在线/离线两种方式,解决常见依赖问题,特别针对内网环境给出完整离线部署方案; 集群部署:重点讲解3节点副本集的配置流程,包括hosts设置、配置文件修改和初始化命令; 分片集群架构:说明核心组件(Config Server、mongos路由层、Shard分片)的关系; 关键注意事项:强调跨节点解析、防火墙配置、时钟同步等生产环境必须检查的要点; 报错处理:整理典型安装错误的排

qq_45855256的博客 428

MongoDB向量搜索实战:混合查询与embedding存储设计

向量检索已从纯语义匹配演进为融合结构化过滤、权限控制与业务逻辑的智能搜索范式。其核心原理在于将embedding与元数据统一存储,通过向量索引与文档索引协同加速,显著提升召回质量与系统可观测性。技术价值体现在降低架构复杂度、保障数据一致性、支持行级安全及毫秒级混合查询响应。典型应用场景包括RAG知识库、AI客服系统、企业级智能文档中心等需兼顾语义相关性与业务规则的工程实践。本文聚焦MongoDB Atlas Vector Search落地关键——embedding存储结构设计与混合查询(hybrid sea

weixin_30617797的博客 566

Docker 运行 MongoDB 的确定性实践:一致性、隔离性与生产就绪

MongoDB 是一款面向文档的 NoSQL 数据库,其运行稳定性高度依赖环境一致性。Docker 通过容器化技术提供进程隔离、文件系统抽象和声明式配置能力,从根本上解决开发、测试与生产环境间因内核参数、权限模型、libc 版本差异导致的‘在我这能跑,在你那不行’问题。这种确定性不仅提升本地开发效率,更支撑 CI/CD 流水线中数据库状态可复现、初始化脚本可验证、索引策略可收敛等关键工程需求。结合命名卷(Named Volume)实现数据持久化隔离,配合自定义 Docker 网络保障服务发现与安全通信,使

weixin_30892763的博客 539

Ubuntu 20.04下MongoDB四层安全加固实战指南

MongoDB作为主流NoSQL数据库,其默认配置在Ubuntu 20.04中存在严重安全隐患——监听0.0.0.0、禁用认证、无TLS加密。安全加固需遵循分层防御原理:先通过网络隔离(ufw+bindIp)限制访问源,再启用TLS/SSL保障传输机密性,继而开启SCRAM-SHA-256身份认证,最后基于RBAC实施最小权限授权。该方案直击生产环境中最常见风险点,如端口暴露、凭据明文传输、过度授权等,适用于云服务器、混合云及本地IDC部署场景,是DevOps与SRE团队构建高可用、合规数据库基线的必备实践

weixin_34280237的博客 630

MongoDB安全四层防御体系:认证、授权、加密与审计实战

MongoDB安全不是简单开启--auth,而是涵盖身份认证、细粒度授权、传输与静态数据加密、操作行为审计的完整防护链。SCRAM-SHA-256密码机制保障认证强度,RBAC角色模型实现最小权限原则,TLS/SSL和Client-Side Field Level Encryption(CSFLE)分别解决通信安全与数据主权问题,而审计日志则为合规与溯源提供关键证据。在电商、金融、医疗等高敏场景中,四者必须按序部署、协同生效——缺一不可,错位即破防。本文聚焦生产级MongoDB安全落地,覆盖配置陷阱、驱动兼

dianyin7770的博客 461

mongo——复制

复制 复制是跨多个mongodb服务器(节点)分布和维护数据的方法。mongodb可以把数据从一个节点复制到其他节点并在修改时进行同步。这种类型的复制通过一个叫可复制集的机制提供。集群中的节点配置为自动同步数据,并且在服务器出错时自动灾备。mongodb也提供对于旧的复制方法的支持。这个旧方法叫做主从模式,现在已经过时了,但是主从复制仍然可以在mongodb3.0里使用。两种方法类似,主节点接受...

哇哦~ 663

MongoDB生产实战:从文档模型到副本集部署的工程指南

文档数据库是NoSQL的核心范式之一,以灵活Schema和嵌套结构支撑高读写场景;其底层依赖WiredTiger存储引擎、副本集容灾与聚合管道数据处理能力。理解文档模型与关系型数据库的本质差异——如模式宽松性、无JOIN设计、应用层一致性保障——是避免线上数据错乱与查询雪崩的前提。技术价值体现在读写分离、水平扩展与快速迭代上,广泛应用于电商订单、用户行为分析、实时日志等场景。本文聚焦MongoDB在真实SaaS系统中的落地细节,涵盖JSON Schema验证、复合索引设计、聚合分层优化、副本集高可用配置及f

weixin_34323858的博客 376

NoSQL选型本质:从业务读写模式匹配数据模型

NoSQL并非关系型数据库的简单替代,而是基于文档、宽列、键值、搜索四种核心数据模型,对现实业务约束进行结构性解耦的技术范式。其底层原理在于存储结构与查询路径的强绑定——MongoDB的BSON序列化决定IO效率,Cassandra的分区键定义物理磁盘布局,Redis的数据结构即API契约,Elasticsearch的倒排索引重构检索逻辑。这种模型驱动的设计,使NoSQL在高并发、海量时序、亚秒级搜索等场景具备不可替代的技术价值。典型应用场景包括实时风控(Redis)、设备监控(Cassandra)、内容管

weixin_30600197的博客 435

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1103
上一篇: MySQL 8.4: 突破创新,全新特性揭秘
下一篇: Archery 页面配置大揭秘:解锁高效运维新境界!
DBA实战
博客等级 码龄10年 811粉丝 93原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值