2013-04-16 34 views
1

我需要在後臺線程中同時更新整個集合,但讀取操作可能同時發生。當我進行基準測試時,需要大約3秒鐘的時間來更新集合。在更新集合時有沒有辦法鎖定集合?我嘗試創建一個新的集合並將所有文檔插入到它中,並使用「dropToTarget = true」將其重命名爲原始集合,但我不確定它在分片方面的安全性和穩定性。我讀了renameCollection與分片不兼容。mongodb - 如何鎖定與MongoDB的客戶端集合

如果有人可以建議是否有一個好主意,這將是很好的。

謝謝。

+0

你想要做什麼,放棄舊的收集數據是好的?你可以用一個字段來版本化你的數據嗎? – WiredPrairie

+0

我們不使用舊數據,所以我們不想將它保存在數據庫中。我們一直爲用戶提供新的數據。 – user826323

+0

我的問題是圍繞它如何使用。如果使用某個版本標記數據,則可以編寫新數據,更新客戶端以從該版本讀取數據,然後在下次更新時刪除最早的版本。 – WiredPrairie

回答

0

您是否提出了兩種可能的策略來更新您的集合,一個是內嵌鎖定,另一個是臨時集合?

由於mongodb文檔明確指出它不適用於分片集合(http://docs.mongodb.org/manual/reference/command/renameCollection/)。根據我的理解,這意味着您要重命名的集合不會被分割,因爲在進行實際重命名之前,您需要刪除其他集合,所以最有可能會丟失之前保存的分片(信息)。所以你需要重新激活分片。我非常不喜歡使用這兩種收集方法,特別是如果您正在分解數據。
您需要從分片集合中獲取所有數據並將其集中存儲,一旦完成更新,您需要重新命名集合並重新分片。這會爲整個系統帶來很多I/O,特別是對於進行更新的客戶端。

取決於您的系統架構(只有一個入口點)。您可以輕鬆掌握一些全局標誌,告訴您是否正在運行集合更新。禁止其他寫操作。
對於MongoDB中的多入口點,您可以嘗試$隔離,但這不適用於分片集合。我不確定它是否允許讀取操作,文檔不是很清楚。

是否嚴格禁止在更新過程中寫入任何數據?你執行什麼類型的更新。他們能互相影響嗎?或者是否可以同時寫入?

+0

客戶端不會寫入或更新數據。它只能從客戶端讀取。只有我的後端組件每天使用新數據更新或寫入一次。我想刪除所有數據並每天插入。所以當我刪除所有數據/寫入新數據時,我希望讓客戶端等待或讀取新數據而不是舊數據。 我不想採用重命名集合的方法。這就是爲什麼我想找出一種方法來鎖定一個集合。 – user826323