2010-08-31 39 views
3

我該如何做一個「安全」的寫入,從JavaScript立即刷新到磁盤?我希望能夠從shell和存儲的JavaScript「CRUD」過程中做到這一點。這只是一個問題:從mongodb外殼安全寫入

db.foo.insert({stuff: "yes", meta: "physics"}); 
db.runCommand("getlasterror") ; 

這個維基目前還不清楚。

+1

shell在每次插入後都會調用getlasterror,但它不會自動刷新到磁盤。 – kristina 2010-09-02 19:55:32

回答

3

是的,你會使用Last Error command,但你需要設置FSYNC標誌(和/或replication parameter,這取決於你的「安全」的定義):

# force fsync 
> db.runCommand({getlasterror:1,fsync:true}) 

# wait for replication to one other server (w = 2) 
> db.runCommand({ getlasterror : 1 , w : 2 }) 

如果你正在做的更多而不是一次寫入,您可以在最後一次請求之後請求fsync或複製。這將使所有先前的寫入「安全」(因爲它們按順序應用)。您不必爲每次寫作都支付費用(除非您需要單獨安全地進行安裝,而不僅僅是一組安全)。

+0

Thilo,我沒有碎片,沒有副本集,除了每天一次的備份之外,沒有其他的事情,我測試過。所以安全的是「寫入這臺服務器」。 我知道「單一服務器耐久性」即將到來1.8,但我其實不確定這意味着什麼。 – 2010-08-31 03:31:42

+0

單個服務器的耐用性意味着你不會在fsync之間丟失數據。這也許意味着更快的數據庫恢復(現在你只會丟失一分鐘的數據,但數據庫修復可能需要很長時間才能恢復在線)。在傳統的數據庫(如Oracle)中,這是通過使用重做日誌來實現的:即使您沒有在每次提交時將整個數據庫同步到磁盤,仍然會編寫足夠的日誌信息以重建丟失的內容。不過,不知道這是否是1.8計劃的方法。 – Thilo 2010-08-31 03:51:34

+1

單臺服務器的耐用性仍然要求您沒有磁盤崩潰(它只能防止停電等)。如果您丟失了磁盤,並且沒有複製(或RAID),則會丟失自上次外部備份以來的所有數據。 – Thilo 2010-08-31 03:57:05