【MongoDB基础原理】Change Streams 生产建议

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Tair(兼容Redis),内存型 2GB
简介: MongoDB从3.6版本开始提供了Change Stream特性,通过该特性,应用程序可以实时的订阅特定集合、库、或整个集群的数据变更事件,相比该特性推出之前通过监听oplog的变化来实现对数据变更的感知,非常的易用,该特性同时支持副本集和集群场景。

如果您在开启Change Streams的情况下删除或重命名集合或数据库,则Change Streams光标在操作日志 (oplog) 中移到该点时将关闭。使用含有 fullDocument : updateLookup 选项的Change Streams光标可能会为查找文档返回 null 值。


尝试对已删除的集合恢复Change Streams将导致错误。在Change Streams捕捉到的最后一次事件与集合删除事件之间,该集合上发生的任何数据变更都将丢失。


Change Streams响应文档必须遵循 16MB 的 BSON 文档大小限制。根据打开Change Streams集合中的文档大小,若生成的通知文档超出 16MB,则无法发送。例如,对配置为返回完整更新文档的Change Streams更新操作,或对文档大小等于或略低于限制的文档进行插入/替换操作。


副本集

对于带有仲裁器成员的副本集,若没有足够的数据承载成员导致大部分操作无法完成,则Change Streams可能会一直处于空闲状态。


例如,一个带有两个数据承载节点和一个仲裁器的 3 成员副本集。如果次要节点由于故障或升级而不可用,则大部分写入操作无法完成。Change Streams将保持打开的状态,但不会发送任何通知。


在这种情况下,只要应用程序接收到的最后一个操作仍然在副本集的 oplog 里,该应用程序就能同步停机期间的所有操作。


如果预估停机时间会较长(比如升级或重大灾难),则需考虑增加操作日志的大小,从而使操作保留的时间比预计的停机时间更长。可以用 rs.printReplicationInfo()来检索 oplog 的大小以及保存的操作的时间范围等关于操作日志状态的信息。


分片集群

Change Streams通过全局逻辑时钟提供整个分片的变更排序。MongoDB 确保变更顺序得以保留,且Change Streams通知能够按接收时的顺序安全地解释。例如,为 3 个分片集群打开Change Streams光标时会依照这 3 个分片上的变更顺序返回变更通知。


为确保变更的整体排序,mongos会针对每个变更通知检查每个分片,确认该分片是否存在最近的变更。如果分片集群有一或多个分片且分片的集合几乎没有活动或处在“冷”状态,则会给Change Streams的响应时间带来负面影响。这是因为 mongos仍必须检查这些冷分片以确保变更整体排序正确。对于分散的分片或大多数操作发生在集群中分片子集的工作负载来说,这种影响可能会更加明显。


如果分片集合中有高水平活动,mongos可能无法跟上所有分片上的变更。此时应考虑为此类集合使用通知筛选。例如,传递配置为仅筛选插入操作的 $match管道。


对于分片集合,利用 multi : true更新操作可能会导致针对该集合打开的Change Streams为孤立文档发送通知。


从未分片的集合被分片那一刻到Change Streams追上第一批迁移的时间,Change Streams通知文档中的 documentKey 只包含文档的 _id,而不包括完整的分片键。

索引和性能

Change Streams无法使用索引。MongoDB 不支持在 oplog 集合上创建索引。 因此,避免打开大量专门的Change Streams,否则会影响服务器性能。

Change Streams优化

从 MongoDB 5.1 开始,Change Streams会经过优化,实现更高效的资源利用率和加速某些聚合管道阶段的执行。

Change Streams和孤立文档

从 MongoDB 5.3 开始,范围迁移期间,不会生成Change Streams事件来更新孤立文档


免费试用阿里云版MongoDB数据库。

立即加入阿里云MongoDB开发者训练营,带你5天快速入门全球最受欢迎的 NoSQL数据库!

扫码加入钉群,与MongoDB专家一对一沟通,了解更多阿里云MongoDB产品与方案,市场活动及线上培训等内容。

钉钉入群二维码原图.jpeg

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3月前
|
存储 缓存 NoSQL
MongoDB内部的存储原理
这篇文章详细介绍了MongoDB的内部存储原理,包括存储引擎WiredTiger的架构、btree与b+tree的比较、cache机制、page结构、写操作流程、checkpoint和WAL日志,以及分布式存储的架构。
125 1
MongoDB内部的存储原理
|
6月前
|
存储 监控 NoSQL
MongoDB索引解析:工作原理、类型选择及优化策略
MongoDB索引解析:工作原理、类型选择及优化策略
|
5月前
|
存储 NoSQL MongoDB
MongoDB 索引原理与索引优化
MongoDB 索引原理与索引优化
123 1
|
6月前
|
存储 JSON NoSQL
深入解析MongoDB的存储原理
深入解析MongoDB的存储原理
深入解析MongoDB的存储原理
|
7月前
|
缓存 监控 NoSQL
【MongoDB 专栏】MongoDB 的变更流(Change Streams)应用
【5月更文挑战第11天】MongoDB的变更流是实时监控数据库动态的机制,允许应用程序订阅并响应文档的插入、更新和删除事件。它提供实时性、灵活性和解耦性,适用于数据同步、实时通知、缓存更新等多种场景。然而,使用时需注意性能、错误处理和版本兼容性。随着技术发展,变更流将在构建智能实时系统中扮演更重要角色,为数据处理带来新机遇。
282 1
【MongoDB 专栏】MongoDB 的变更流(Change Streams)应用
|
7月前
|
监控 NoSQL 容灾
MongoDB复制集原理:高可用性与数据一致性的保障
【4月更文挑战第30天】MongoDB复制集提供高可用性和数据一致性,通过在多个服务器间复制数据。复制集包含主节点和从节点,写操作在主节点执行,然后异步复制到从节点。优势包括故障切换、数据冗余、负载均衡和容灾备份。当主节点故障,其他节点会选举新主节点,确保服务连续性。配置复制集涉及规划节点、配置复制集、初始化和监控维护。复制集是实现数据库可靠性的核心。
|
7月前
|
存储 NoSQL MongoDB
【MongoDB】MongoDB 索引结构底层原理分析
【4月更文挑战第1天】【MongoDB】MongoDB 索引结构底层原理分析
|
7月前
|
存储 运维 负载均衡
MongoDB详解(二)——MongoDB架构与原理
MongoDB详解(二)——MongoDB架构与原理
281 2
|
7月前
|
NoSQL MongoDB 数据安全/隐私保护
Flink CDC支持MongoDB的CDC(Change Data Capture)连接器
Flink CDC支持MongoDB的CDC(Change Data Capture)连接器
339 4
|
存储 缓存 NoSQL
MongoDB基础及原理介绍
MongoDB基础及原理介绍

相关产品

  • 云数据库 MongoDB 版