2014-10-06 40 views
0

有一個MongoDB有我想研究的有趣數據。不幸的是,由於尺寸問題,每48小時一次,數據庫就會被清除「舊」記錄。攔截或過濾來自MongoDB的oplog事務

我創建一個副本與具有優先級0和表決0,以便不與主數據庫性能干擾次級數據庫系統的設置。這可以很好地工作,因爲我可以查詢輔助數據並獲取我的數據。但是,在很多情況下,我的系統無法及時處理所有記錄,並且如果我在48小時內未找到它們,將會丟失一些舊記錄。

有沒有一種方法,我可以高速緩存的另一個系統,然後我就可以處理我的休閒,可能過濾掉刪除,直到我準備在OPLOG?

我考慮過slavedelay參數,但這會影響所有交易。我還將Tungsten Replicate作爲解決方案進行了研究,以便實際上可以緩存oplog,但是,它們不支持MongoDB作爲數據源。

是純文本格式存儲在次級,這樣我可以閱讀和提取我從中得到想要的OPLOG。

這個任何指針將是有益的,不幸的是我無法找到MongoDB的網站上OPLOG多文檔。

回答

1

MongoDB的OPLOG存儲爲所謂的「oplog.rs」在你的本地數據庫封頂集合:

use local 
db.oplog.rs.find() 

如果你想存儲在OPLOG供以後使用更舊的數據,你可以試着加大該集合的大小。請參閱http://docs.mongodb.org/manual/tutorial/change-oplog-size/

或者,您可以將oplog.rs重新創建爲不加限制的集合(儘管不建議這樣做,因爲您必須全面清理oplog)。按照相同的步驟上面增加規模,但重新創建OPLOG時,使用此命令

db.runCommand({ create: "oplog.rs", capped: false}) 

另一種解決方案是創建一個具有以下命令轉儲OPLOG到該文件夾​​YYYYMMDD一個cron作業:

mongodump --db local --collection oplog.rs -o $(date +%Y%m%d) 

希望有幫助。

0

我想知道爲什麼你會這樣做手動。做到這一點的「典型」方法是確定記錄的生命週期或到期日期。如果是一輩子,你會做某物像

db.collection.insert({'foo':'bar' [...], created: ISODate("2014-10-06T09:00:05Z")}) 

db.collection.ensureIndex({'created':1},{expireAfterSeconds:172800}) 

通過這樣做,一個叫TTLMonitor線程將喚醒每分鐘,並刪除其中有一個創建場是所有文件兩天以上。

如果你對每個文檔一個固定的到期日,你基本上做的是相同的:

db.collection.insert({'foo':'bar' [...], expirationDate: ISODate("2100-01-01T00:00:00Z"}) 

db.collection.ensureIndex({expirationDate:1},{expireAfterSeconds:0}) 

這將清除文檔後TTLMonitor的第一次運行expirationDate

你可以調整expireAfterSeconds的值,安全地讓您處理記錄被清除之前,保持整體尺寸在可接受的需求,並確保即使應用程序的清除工作過程中出現故障,記錄被刪除。 (更不用說你不需要自己維護清除邏輯了)。

這樣說和希望它可能對你有用,我認爲你的問題是一個概念。

你有縮放問題。您的系統無法處理峯值,因此偶爾無法及時處理所有數據。而不是擺弄MongoDB的內部(這可能是相當危險的,正如@chianh正確指出的那樣),你應該通過確定你的瓶頸並根據你的峯值來調整瓶頸。

+0

感謝Markus,您提供的信息很有趣。在我的情況下,我不擁有這些數據,我需要輕輕一點。我會建議他們使用到期方式作爲替代方案。至於我的系統,我可以非常快速地獲取他們的數據,但它正在開發中,可能會有很多中斷,因此我將在後面運行並且不想錯過任何數據。 – 2014-10-06 18:42:32