mongodb寫入數據要注意的一些細節
02-04
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 |