如果Atlas发现集群的主节点 (primary node in the replica set)节点超过写入阻塞 策略阈值,则Atlas会阻止写入集群,直到磁盘利用率低于解锁阈值。当MongoDB收到对集群的写入时,它会将数据批量刷新到磁盘,这可能会导致磁盘利用率大幅跃升。主节点 (primary node in the replica set)节点上的磁盘空间不足可能会导致集群停机,尤其是当所有副本集节点的磁盘空间都级联耗尽时。
为了防止这种情况,当Atlas观察到集群的主节点 (primary node in the replica set)节点磁盘超过关键写入阻塞策略阈值时, Atlas会阻止写入集群的主节点 (primary node in the replica set)节点。Atlas继续阻止写入,直到磁盘利用率低于解锁阈值。
通过在主节点 (primary node in the replica set)节点上激活写入阻塞行为, Atlas可以:
防止由于主节点 (primary node in the replica set)节点上的磁盘耗尽而导致集群不可用。
允许集群以接近最大存储利用率的速度运行,以便在写入量突然激增的情况下保持读取可用性。
写入阻塞和智能工作负载管理
集群写入阻塞行为是MongoDB Atlas中智能工作负载管理 (IWM) 的一部分。IWM 是一种动态资源管理器,可实现实时工作负载监控和自动防护,从而在负载下保持高可用性。
写入阻塞注意事项
写入阻塞行为有以下考虑因素:
Atlas目前会阻止写入运行MongoDB 8.0+ 的专用集群上副本集(非分片集群)的主节点 (primary node in the replica set)节点。
Atlas不会区块对免费集群和 Flex 集群的写入。
Atlas仅监控主节点 (primary node in the replica set)节点上的磁盘利用率。
Atlas不会监控从从节点(secondary node from replica set)、只读节点、搜索或分析节点上的磁盘利用率。
Atlas如何阻止写入主节点
为了区块写入, Atlas使用以下进程:
当主节点 (primary node in the replica set)节点的可用磁盘空间超过写入阻塞策略阈值时, Atlas会阻止写入主节点 (primary node in the replica set)节点。
即使MongoDB 数据库不接受写入,集群仍可用于读取。您可以正常从主节点 (primary node in the replica set)和从节点(secondary node from replica set)读取数据。
当Atlas阻止写入时,它会发送以下警报:
Writes have been blocked on your cluster due to critically low disk space
。操作日志反映此警报。Atlas用户界面中集群页面的顶部会显示一个横幅,其中说明:
"To maintain read availability during critically high disk utilization, Atlas has blocked writes to the following clusters: <clusterName>. Increase disk space or enable storage auto-scaling to unblock writes."
当可用磁盘空间增加 50%,超过阻塞阈值时, Atlas会解除对主节点 (primary node in the replica set)节点的写入阻塞。当Atlas解除阻止写入时,您会收到此警报:
Writes have been unblocked on your cluster
。然后,操作日志反映此警报。无需采取进一步动作。为了避免将来出现写入阻塞行为,请考虑增加集群存储。
如果您手动增加集群的磁盘大小或启用存储自动伸缩, Atlas会根据新的磁盘大小自动调整写入阻塞阈值。
写入阻塞预防
为防止出现写入阻塞行为并使集群低于Atlas写入阻塞策略阈值,我们建议您:
启用存储自动伸缩,在磁盘利用率超过 90% 时自动伸缩集群存储,并确保一致的工作负载可用性和性能。
要在Atlas用户界面中启用存储自动伸缩,请导航到 Cluster Tier 菜单并选中 Auto-scale 部分中的 Storage Scaling 复选框。
对于您在Atlas用户界面中创建的所有新集群, Atlas默认启用存储自动伸缩。
如果您使用API创建集群,则默认下不会选择集群自动伸缩,您必须使用“在一个项目中更新一个集群”端点的
autoScaling
对象中的选项显式启用伸缩。
如果您选择退出存储自动伸缩,并且磁盘利用率接近 90%,则可以在Atlas激活集群上的写入阻塞行为之前发布现有磁盘空间:
删除未使用的数据以释放磁盘空间。删除索引,或删除集合或单个文档。
在每个专用集群节点上使用
autoCompact
命令压缩磁盘空间。
写入阻塞策略阈值参数
Atlas使用以下写入阻塞阈值来适应具有高写入量的磁盘使用场景:
磁盘大小 < 20 GB | 当可用磁盘空间降至 600 MB 以下时, Atlas会阻止写入。当磁盘空间超过 900 MB 时, Atlas会解锁写入。 |
磁盘大小 < 1.25TB | 当可用磁盘空间降至总磁盘大小的 4% 以下时, Atlas会阻止写入。当磁盘空间超过磁盘总大小的 6% 时, Atlas会解锁写入。 |
磁盘大小 ≥ 1.25TB | 当可用磁盘空间降至 50 GB以下时, Atlas会阻止写入。当可用磁盘空间超过 75 GB时, Atlas会解除写入阻止。 |
阈值不可配置。如果磁盘大小由于自动伸缩增加,或者如果您手动增加磁盘大小, Atlas会根据集群的磁盘大小自动调整阈值。
在集群中启用写入阻塞行为后,您可以:
可以从“编辑集群”页面手动增加集群存储,或在Atlas用户界面中启用存储自动伸缩,以避免将来出现任何写入阻塞行为。
无法删除索引或集合,因为Atlas会阻止需要写入数据库的操作。要删除索引和集合,请增加集群存储。
写入阻塞和存储自动伸缩
当主节点 (primary node in the replica set)节点上的可用磁盘空间达到磁盘总大小的96 % 左右时, Atlas会阻止写入,写入阻止策略阈值中会注明针对小型和大型磁盘的注意事项。
相比之下,当磁盘利用率达到磁盘总大小的 90% 时,就会触发自动伸缩。这意味着:
如果您启用自动伸缩,您的集群就有机会在写入阻塞行为激活之前进行扩展。
如果禁用自动伸缩,则必须监控磁盘利用率并采取动作防止激活写入阻塞行为。
写入阻塞故障排除
当Atlas阻止写入集群时,会发生以下操作:
Atlas用户界面中集群页面的顶部会显示一个横幅,表示写入已被阻止。请参阅Atlas如何阻止写入主节点。
项目的操作日志会反映这些警报。
Atlas日志返回类似于以下内容的
MongoServerError
:User writes blocked, reason: DiskUseThresholdExceeded
。serverStatus 命令中的
userWriteBlockMode
参数反映了集群的当前写入阻塞状态。
解除写入阻塞
当可用磁盘空间增加 50% 而超过阻塞阈值时, Atlas会解除写入阻塞。用于解锁写入的额外的缓冲区可确保:
Atlas不会快速连续启用和禁用写入阻塞行为。
集群在开始再次接受写入时保持良好状态。
有关确切参数,请参阅写入阻塞策略阈值。