2014-10-08 37 views
0

我有一個捕獲工具,每秒捕獲大約1000個50字節的數據記錄,將它們有效地存儲到1千兆以太網網絡中的MongoDB集合中。Mongo增加延遲容忍度

我想將服務器帶到互聯網上,也就是說,捕獲源和Mongod數據庫將不再位於同一個LAN中。雖然吞吐量仍然可能是足夠的(我在兩點之間有100Mbps的雙向服務,並且捕獲速率爲1000 * 50 * 8 = 400kbps,所以即使假設大量開銷也有幾個數量級的空間),延遲可能成爲一個問題。

我可以調整Mongo,使其確實不是確認每寫幾秒鐘,從而克服任何延遲問題? Mongo確認每一個寫作?我的工具全部用Python編寫,使用Pymongo,每次發生數據點事件時都會觸發原子寫入。

我需要手動批處理嗎?

回答

1

Mongo擁有write concerns的概念,它基本上讓您指定寫入的重要性,這可能會讓您加速以換取潛在的數據丟失。

具有「未確認」寫入關注的寫入操作不會等待主服務器確認寫入 - 它基本上將數據推入寫入套接字並繼續發送。這非常快,但意味着如果在數據發送之前套接字已關閉,或者在寫入處理之前主要步驟已關閉,則數據可能會丟失。在這種情況下是UDP-ish(儘管它仍然是TCP)。

「已確認」和「日誌記錄」寫入問題將導致mongo驅動程序阻塞,直到服務器收到寫入並確認它爲止(並且在日誌記錄的情況下,一旦它被寫入磁盤日誌)。這比未確認的寫入安全得多(但也比較慢),但是如果主要在將操作複製到輔助節點之前下臺,則仍有數據丟失的可能性。

「多數」寫入問題將導致mongo驅動程序阻塞,直到服務器確認寫入,副本集中的大多數節點已確認寫入。這是最慢的寫入模式,但是是最耐用的,並減輕了許多最終的一致性問題。

爲什麼要將服務器移出局域網?如果你只需要讓它可以從外部訪問,那麼你可以設置一個副本集並使用它複製出局域網。這樣一來,您的寫入仍然可以通過「日誌式」寫入問題寫入本地主服務器,並複製到輔助服務器上,而不必擔心繫統會造成延遲。

+0

謝謝你:這正是我想知道的。是的,這是樣本數據,所以在這裏和那裏的損失幾乎不會有太大問題,因爲如果有永遠存在災難性問題的話,數據點可能會被「歷史地」提取幾天。 如何設置未確認的寫入?這是必須在mongo服務器和pymongo驅動程序中指定的東西嗎? 關於爲什麼要移出數據庫的好問題。他們是商業原因,而不是技術原因。是否有可能有一個輔助服務器以容忍延遲的方式饋送主服務器? – 2014-10-08 15:03:54

+1

請參閱關注[在pymongo文檔中](http://api.mongodb.org/python/current/api/pymongo/mongo_client.html) - tl; dr:'w = 0'。至於第二個問題,是的 - mongo支持「副本集」 - 複製數據的節點集羣。你將有1個主要和N個次級。寫入將轉到主要,然後它會透明地將它們同步到輔助。 – 2014-10-08 15:22:54

+0

好的只是一點反饋。在pymongo.MongoClient初始化中設置w = 0,使我的「通過互聯網」吞吐量(單個mondod實例)增加了4倍以上,因此延遲現在基本上是完全沒有問題的。根據我的用例,對非關鍵(類似樣本)的數據非常有用。 – 2014-10-08 16:02:12