關于MongoDB的全局鎖

fmms 12年前發布 | 41K 次閱讀 MongoDB NoSQL數據庫

MongoDB有所了解的人都知道,MongoDB有一個讓人頭疼的全局鎖讀寫鎖,允許并發讀,而寫會阻塞所有的讀寫),要命的是這個鎖不是表級的,不是庫級的,而是整個Server級別的,這讓人聽起來是不是非常的蛋疼。

在2.0版本以前,這一問題一直沒有得到解決,于是有人提出,在可預見某個update操作的記錄可能在磁盤上時,為了減少寫鎖占用的時間,可以采 用先讀后寫的方式,通過先讀一次,將要操作的記錄加載到內存中,再進行內存中的update,這樣寫鎖就不包括將數據從磁盤加載到內存的時間了。

在可預見數據冷熱的情況下,這種操作能夠有一定的效果,但是很明顯,這種變態的方法不應該是一個終極解決方案。

值得慶幸的是,在2.0版本中,MongoDB宣稱有很大程度的并發性能提升,而這一提升的基礎正是解決了這個全局鎖的問題。

解決的方法并不是通過減少鎖粒度來解決,雖然collection級別的鎖機制也正在開發中。(SERVER-1240)

解決方法是通過對一些可能造成長時間鎖占用的操作進行鎖抑制。比如和我們上面的方法類似,在進行update操作時,如果發現需要更新的記錄在磁盤上,那么這個鎖就不會一直占用,而是等到將數據從磁盤加載到內存后再添加寫鎖進行update。

而同理,對于其它一些可能耗時比較長的操作也可以采用類似的方法,通過將長時間占用的全局鎖拆分成多個細粒度的小鎖來使需要獲取鎖來進行的操作能夠交錯的執行,從而避免一夫當關萬夫莫開的情況,主要包括下面一些操作:

  • 查詢操作
  • 批量更新操作
  • 批量刪除操作
  • 批量insert寫入操作

如果你還在使用2.0以前的版本,并且在并發性能上出現問題,可以考慮在2.0.x版本上進行一些性能測試并對你的MongoDB進行升級。

參考: www.mongodb.org
出處: nosqlfan

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!