在 PyMongo 中使用 compact 命令进行 MongoDB 碎片回收的完整操作指南如下:

一、核心执行方法

from pymongo import MongoClient
import time# 1. 连接到 MongoDB 实例
client = MongoClient("mongodb://username:password@host:27017/dbname?authSource=admin")# 2. 选择目标数据库和集合
db = client["your_database"]
collection = db["your_collection"]# 3. 执行 compact 命令
try:# 执行碎片回收(返回操作ID)result = db.command("compact", collection.name)print(f"Compact operation started. Operation ID: {result['operationTime']}")# 监控操作进度(可选)operation_id = result["operationTime"]while True:current_ops = db.command("currentOp", {"operationTime": operation_id})if not current_ops.get("inprog", []):breakprint("Compact in progress...")time.sleep(10)print("✅ Compact completed successfully!")except Exception as e:print(f"❌ Compact failed: {str(e)}")
finally:client.close()

二、关键参数配置

# 添加额外参数(副本集secondary节点需要force)
result = db.command("compact", collection.name,force=True,              # 强制在secondary节点运行compression={"type": "zlib"},  # 指定压缩算法paddingFactor=1.1,        # 预留空间因子(0-4.0)maxPaddingBytes=1024,     # 最大填充字节tieredStorage={"useRecycledSpace": True}  # Atlas专用
)

三、集群环境操作方案

1. 副本集自动滚动执行
rs_members = ["rs1/mongo1:27017","rs1/mongo2:27017","rs1/mongo3:27017"
]for member in rs_members:member_client = MongoClient(f"mongodb://user:pass@{member}/admin?replicaSet=rs1")# 检查节点类型is_primary = member_client.admin.command("isMaster").get("ismaster")# 降级主节点(每次处理前)if is_primary:member_client.admin.command("replSetStepDown", 300)  # 降级300秒try:db = member_client["your_db"]db.command("compact", "your_collection", force=True)print(f"✅ Compact completed on {member}")except Exception as e:print(f"❌ Failed on {member}: {str(e)}")finally:member_client.close()
2. 分片集群自动处理
# 通过Config Server获取分片列表
config_client = MongoClient("mongodb://config_server:27019")
shards = config_client.config.shards.find()for shard in shards:shard_name = shard["_id"]shard_host = shard["host"].split("/")[-1]  # 提取主机地址try:shard_client = MongoClient(f"mongodb://{shard_host}/admin")# 确认是分片主节点if shard_client.admin.command("isMaster").get("ismaster"):db = shard_client["your_db"]db.command("compact", "your_collection")print(f"✅ Compact on shard {shard_name} completed")else:print(f"⚠️ {shard_host} is not primary, skipped")except Exception as e:print(f"❌ Shard {shard_name} failed: {str(e)}")finally:shard_client.close()

四、操作结果验证

# 对比前后存储状态
pre_stats = collection.stats()
# ... compact 执行 ...
post_stats = collection.stats()print(f"存储优化报告:")
print(f"- 原始大小: {pre_stats['storageSize'] / 1024**2:.2f} MB")
print(f"- 优化后: {post_stats['storageSize'] / 1024**2:.2f} MB")
print(f"- 节省空间: {(pre_stats['storageSize'] - post_stats['storageSize']) / 1024**2:.2f} MB")
print(f"- 碎片率: {100 * (pre_stats['size'] / pre_stats['storageSize'] - 1):.1f}% → "f"{100 * (post_stats['size'] / post_stats['storageSize'] - 1):.1f}%")

五、安全操作注意事项

  1. 阻塞机制处理

    # 检查当前操作是否被阻塞
    if db.current_op({"command.compact": {"$exists": True}}):print("⚠️ Another compact already running")exit()# 设置超时自动中断
    client = MongoClient(connectTimeoutMS=30000, socketTimeoutMS=3600000)
    
  2. 磁盘空间保障

    # 检查磁盘空间
    disk_stats = client.admin.command("fsInfo")
    free_space = disk_stats["fsUsedSize"] - disk_stats["fsTotalSize"]
    coll_size = collection.stats()["storageSize"]if free_space < coll_size * 1.5:print(f"❌ Insufficient disk space. Need {coll_size*1.5} bytes, only {free_space} available")exit()
    
  3. Atlas 云服务专用

    # Atlas需要特殊授权
    client = MongoClient(connect_string, authMechanism="MONGODB-AWS")# 使用分层存储API
    compact_opts = {"tieredStorage": {"useRecycledSpace": True,"reclaimSpace": True}
    }
    

六、替代方案实现

无损在线重建方案

def online_recompact(db_name, coll_name):temp_name = f"{coll_name}_compact_{int(time.time())}"# 1. 创建临时集合db.command("create", temp_name)# 2. 逐步复制数据(避免大事务阻塞)source = db[coll_name]dest = db[temp_name]batch_size = 1000total_docs = source.count_documents({})for skip in range(0, total_docs, batch_size):docs = source.find().skip(skip).limit(batch_size)dest.insert_many(list(docs))# 3. 原集合原子替换source.rename(f"old_{coll_name}", dropTarget=True)dest.rename(coll_name)db[f"old_{coll_name}"].drop()

最佳实践总结

  1. 执行窗口选择

    # 获取当前时间并判断
    from datetime import datetime
    current_hour = datetime.now().hour
    if 0 <= current_hour < 5:  # 凌晨执行run_compact()
    else:print("⚠️ Operation declined: Not in maintenance window")
    
  2. 定时清理脚本框架

    import schedule
    import timedef weekly_compact():shard_cluster_compact()  # 调用前述集群函数# 每周日凌晨1点执行
    schedule.every().sunday.at("01:00").do(weekly_compact)while True:schedule.run_pending()time.sleep(60)
    
  3. 健康检查指标

    HEALTH_THRESHOLD = 0.8  # 碎片率阈值def needs_compact(collection):stats = collection.stats()fragmentation = 1 - (stats["size"] / stats["storageSize"])return fragmentation > HEALTH_THRESHOLD# 自动检测执行
    if needs_compact(collection):run_compact(collection)
    

关键提示:在MongoDB Atlas中,建议启用https://docs.atlas.mongodb.com/tiered-storage/替代手动compact。对10GB以上的集合操作时,优先采用online_recompact方案确保业务连续性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90480.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90480.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90480.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure DevOps 使用服务主体配置自托管代理 (Self-hosted Agent) 配置指南

Azure DevOps 使用服务主体配置自托管代理配置指南1. 概述2. 在 Azure AD 中创建服务主体 (SP)3. 授予 Azure DevOps 权限3.1. 组织层级&#xff1a;用户身份与访问级别3.2. 组织层级&#xff1a;Agent pools管理员3.3. 在 Linux VM 上安装和配置代理3.4. 启动并设置为系统服务…

Java学习第六十四部分——Nginx

目录 一、前言提要 二、核心特点 三、核心作用 四、架构优势 五、应用场景 六、常用命令 七、性能对比——Nginx vs Apache 八、典型用户 九、配置示例 十、Java应用需配合的配置 十一、性能优化策略 十二、常见问题排查 十三、文件结构配置 十四、总结归纳概述 …

几个常用的Oxygen编辑器插件

Oxygen XML Editor是罗马尼亚的SyncroSoft公司开发的结构化文档编辑和发布软件。 除了Oxygen编辑器带的功能&#xff0c;它还提供了丰富的插件来提供额外的功能来辅助资料开发人员更高效率、更低成本地开发结构化资料。 本文介绍几个比较常用和有用的插件。 - 1 - Git Clie…

基于springboot的软件缺陷管理跟踪平台

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

【LINUX】Centos 9使用nmcli更改IP

1. 查看连接名称 nmcli connection show输出类似&#xff1a; NAME UUID TYPE DEVICE Wired connection 1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ethernet enp1s02. 修改 IP 地址&#xff08;以静态 IP 为例&#xf…

ConvMixer模型:纯卷积为何能够媲美Transformer架构?深入浅出原理与Pytorch代码逐行讲解实现

ConvMixer 是一个简洁的视觉模型&#xff0c;仅使用标准的卷积层&#xff0c;达到与基于自注意力机制的视觉 Transformer&#xff08;ViT&#xff09;相似的性能&#xff0c;由此证明纯卷积架构依然很强大。核心原理&#xff1a;极简的卷积设计&#xff1a;它摒弃了复杂的自注意…

教程:如何通过代理服务在国内高效使用 Claude API 并集成到 VSCode

对于许多开发者来说&#xff0c;直接访问 Anthropic 的 Claude API 存在网络障碍。本文将介绍一个第三方代理服务&#xff0c;帮助你稳定、高效地利用 Claude 的强大能力&#xff0c;并将其无缝集成到你的开发工作流中。 一、服务介绍 我们使用的是 open.xiaojingai.com 这个…

从零开始:Vue 3 + TypeScript 项目创建全记录

一次完整的现代前端项目搭建经历,踩坑与收获并存 📖 前言 最近创建了一个新的 Vue 3 项目,整个过程中遇到了不少有趣的选择和决策点。作为一个技术复盘,我想把这次经历分享出来,希望能帮助到其他开发者,特别是那些刚接触 Vue 3 生态的朋友们。 🛠️ 项目初始化:选择…

[spring6: @EnableWebSocket]-源码解析

注解 EnableWebSocket Retention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE) Documented Import(DelegatingWebSocketConfiguration.class) public interface EnableWebSocket {}DelegatingWebSocketConfiguration Configuration(proxyBeanMethods false) public …

Nacos 封装与 Docker 部署实践

Nacos 封装与 Docker 部署指南 0 准备工作 核心概念​ 命名空间&#xff1a;用于隔离不同环境&#xff08;如 dev、test、prod&#xff09;或业务线&#xff0c;默认命名空间为public。​ 数据 ID&#xff1a;配置集的唯一标识&#xff0c;命名规则推荐为{服务名}-{profile}.{扩…

Vue2——4

组件的样式冲突 scoped默认情况&#xff1a;写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。1. 全局样式: 默认组件中的样式会作用到全局2. 局部样式: 可以给组件加上 scoped 属性, 可以让样式只作用于当前组件原理&#xff1a;当前组件内标签都被…

30天打好数模基础-逻辑回归讲解

案例代码实现一、代码说明本案例针对信用卡欺诈检测二分类问题&#xff0c;完整实现逻辑回归的数据生成→预处理→模型训练→评估→阈值调整→决策边界可视化流程。数据生成&#xff1a;模拟1000条交易数据&#xff0c;其中欺诈样本占20%&#xff08;类不平衡&#xff09;&…

CDH yarn 重启后RM两个备

yarn rmadmin -transitionToActive --forcemanual rm1 cd /opt/cloudera/parcels/CDH/lib/zookeeper/bin/ ./zkCli.sh -server IT-CDH-Node01:2181 查看是否存在残留的ActiveBreadCrumb节点 ls /yarn-leader-election/yarnRM #若输出只有[ActiveBreadCrumb]&#xff08;正常应…

HTML5音频技术及Web Audio API深入解析

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;音频处理在IT行业中的多媒体、游戏开发、在线教育和音乐制作等应用领域中至关重要。本文详细探讨了HTML5中的 <audio> 标签和Web Audio API等技术&#xff0c;涉及音频的嵌入、播放、控制以及优化。特别…

每日面试题13:垃圾回收器什么时候STW?

STW是什么&#xff1f;——深入理解JVM垃圾回收中的"Stop-The-World"在Java程序运行过程中&#xff0c;JVM会通过垃圾回收&#xff08;GC&#xff09;自动管理内存&#xff0c;释放不再使用的对象以腾出空间。但你是否遇到过程序突然卡顿的情况&#xff1f;这可能与G…

【系统全面】常用SQL语句大全

一、基本查询语句 查询所有数据&#xff1a; SELECT * FROM 表名;查询特定列&#xff1a; SELECT 列名1, 列名2 FROM 表名;条件查询&#xff1a; SELECT * FROM 表名 WHERE 条件;模糊查询&#xff1a; SELECT * FROM 表名 WHERE 列名 LIKE 模式%;排序查询&#xff1a; SELECT *…

Spring之SSM整合流程详解(Spring+SpringMVC+MyBatis)

Spring之SSM整合流程详解-SpringSpringMVCMyBatis一、SSM整合的核心思路二、环境准备与依赖配置2.1 开发环境2.2 Maven依赖&#xff08;pom.xml&#xff09;三、整合配置文件&#xff08;核心步骤&#xff09;3.1 数据库配置&#xff08;db.properties&#xff09;3.2 Spring核…

C++STL系列之set和map系列

前言 set和map都是关联式容器&#xff0c;stl中树形结构的有四种&#xff0c;set&#xff0c;map&#xff0c;multiset,multimap.本次主要是讲他们的模拟实现和用法。 一、set、map、multiset、multimap set set的中文意思是集合&#xff0c;集合就说明不允许重复的元素 1……

Linux 磁盘挂载,查看uuid

lsblk -o NAME,FSTYPE,LABEL,UUID,MOUNTPOINT,SIZEsudo ntfsfix /dev/nvme1n1p1sudo mount -o remount,rw /dev/nvme1n1p1 /media/yake/Datasudo ntfsfix /dev/sda2sudo mount -o remount,rw /dev/sda2 /media/yake/MyData

【AJAX】XMLHttpRequest、Promise 与 axios的关系

目录 一、AJAX原理 —— XMLHttpRequest 1.1 使用XMLHttpRequest 二、 XMLHttpRequest - 查询参数 &#xff08;就是往服务器后面拼接要查询的字符串&#xff09; 三、 地区查询 四、 XMLHttpRequest - 数据提交 五、 认识Promise 5.1 为什么 JavaScript 需要异步&#…