使用pymongo進行MongoDB的回收

在 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 需要異步&#…