簡體   English   中英

MongoDB刪除速度非常慢

[英]MongoDB very slow deletes

我有一個三個mongod服務器的小副本集(每個16GB RAM,至少4個CPU核心和真正的硬盤驅動器)和一個專用仲裁器。 復制的數據目前有大約100,000,000條記錄。 幾乎所有這些數據都在一個集合中,其中包含_id (自動生成的Mongo ID)和date的索引,這是一個本地Mongo日期字段。 我會定期使用日期索引刪除此集合中的舊記錄,類似這樣(來自mongo shell):

db.repo.remove({"date" : {"$lt" : new Date(1362096000000)}})

這確實有效,但運行速度非常慢。 我的一個節點的I / O比其他兩個節點慢,只有一個SATA驅動器。 當此節點為主節點時,刪除以約5-10個文檔/秒運行。 通過使用rs.stepDown(),我降低了這個較慢的主要版本並強制選舉以獲得具有更好I / O的主要版本。 在那台服務器上,我得到大約100個docs / sec。

我的主要問題是,我應該擔心嗎? 在我介紹復制之前,我沒有這些數字,但我知道刪除速度要快得多。 我想知道副本集同步是否導致I / O等待,或者是否有其他原因。 在刪除語句完成之前暫時禁用同步和索引更新我會非常滿意,但我目前還不知道有什么方法可以做到這一點。 出於某種原因,當我禁用三個節點中的兩個,只留下一個節點和仲裁器時,剩下的節點被降級並且寫入是不可能的(不是仲裁者應該解決這個問題嗎?)。

為了給出一般性能的一些指示,如果我刪除並重新創建日期索引,則掃描所有100M文檔大約需要15分鍾。

這是因為即使如此

db.repo.remove({"date" : {"$lt" : new Date(1362096000000)}})

看起來像一個命令,它實際上在許多文檔上運行 - 只要滿足這個查詢。

使用復制時,必須將每個更改操作寫入local數據庫中名為oplog.rs的特殊集合 - 簡稱oplog。

oplog必須為每個已刪除的文檔都有一個條目,並且每個條目中的每一個都需要應用於每個輔助節點上的oplog,然后才能刪除相同的記錄。

我可以建議您考慮的一件事是TTL索引 - 它們將根據您設置的到期日期/值“自動”刪除文檔 - 這樣您就不會有一次大量刪除,而是能夠隨着時間的推移更多地分散負載。

另一個可能不適合您的建議,但它對我來說是最佳解決方案:

  1. 從集合中刪除indeces
  2. 迭代收集的所有條目並存儲記錄的id以刪除到內存數組中
  3. 每次數組都足夠大(對我而言是10K記錄),我用ID去掉了這些記錄
  4. 重建indeces

這是最快的方法,但它需要停止適合我的系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM