標籤:

mongodb寫入數據要注意的一些細節

mongodb寫入數據是靠操作系統的緩存來實現的,我們需要清楚這中間發生了什麼?

對於更新操作,可能存在以下兩種狀態。

pre-fsync post-update state 對數據的變更已經寫入journal日誌,但日誌並沒有刷新(fsync)的磁碟上

post-fsync post-update state 對數據的變更已經刷新到日誌文件,這個時候,如果宕機,可以利用journal日誌進行災難恢復。

那麼在pre-fsync post-update state階段,如果宕機了。很可能會丟失數據,因為連日誌都沒有刷新到磁碟。

此時會出現這樣一種情況,用戶讀取到了新的數據,然後宕機了,這個數據被丟失了。 用戶讀到了數據,但這個數據後來又不存在了,這種情況是否有問題呢? 得看應用。

mongodb提供了其他選項,寫入操作可被block,直到從庫應答後(具體機制我不記得了,可能和MySQL的半同步類似的道理)。但主庫上面的讀取操作也許仍然可以讀取到新的值(不必等從庫應答)

注意:由於mmap的機制,如果只是mongod進程掛了。那麼不會丟失數據,因為操作系統沒有掛,操作系統會繼續寫入完數據的。

還有一點需要留意,對於資料庫來說,比如MySQL在讀取和寫入頁塊的時候,會對頁塊進行校驗,但mongodb不會,對於重要的數據來說,這是不能接受的。很可能因為硬體的故障導致數據異常而DBA不知道。


推薦閱讀:

MySQl中JOIN後面的子查詢語句得到的結果叫做「視圖」嗎?
雲資料庫MySQL測試的正確姿勢
哪些互聯網公司的資料庫是選擇Oracle的,為什麼?
注意!Riddle漏洞正在影響低版本Oracle MySQL,請立即更新!
MySQL的基礎架構

TAG:MySQL |