mongodb採用資料檔案預分配模式來生成資料檔案,資料檔案的大小從64M開始,每增加一個檔案,大小翻倍,直到2G,以後每次增加資料就會生成2G左右的資料檔案,結合mongodb的mmap記憶體模型,對於寫資料檔案,將隨機寫轉換為順序寫,一定程度上緩解了磁碟的io壓力。
但在實際使用中,遇到了在預分配2G的資料檔案時,如果磁碟io較慢,則mongodb基本鎖死,無法響應請求的情況。持續時間則根據磁碟io的效能來確定。這個問題在2.0之後版本可能會有些改善,但在磁碟效能低的伺服器上,該問題依舊存在.
這個問題目前沒有太好的解決方案,只能建議使用讀寫效能比較好的伺服器來跑mongodb。
在資料存量大於記憶體大小時,mongodb遇到冷資料查詢速度變慢。
mongodb使用mmap的記憶體管理模式,如果查詢的都是熱資料,那麼會在記憶體中直接查詢,如果遇到冷資料,就需要從磁碟讀取,並將一部分熱資料從記憶體解除安裝掉.
有人曾經說mongodb記憶體管理是載入固定大小的檔案塊到記憶體,即如果冷資料在磁碟上,他會根據請求的資料,載入一定大小的資料塊到記憶體,並解除安裝掉同樣的熱資料,這個操作本身會帶來一定io.
因為mongodb使用的是全域性鎖,在某個操作緩慢時,整個操作佇列會全部變慢。這個問題造成了mongodb會出現偶發性堵塞問題,連帶整個庫的效能下降。
該問題在應用需要儘量避免出現,需要將mongodb的資料大小規劃好,儘量不要使資料量超過記憶體的大小,如果超過記憶體大小後,儘量不要去請求冷資料。
Mongodb全域性鎖機制。
mongodb最大的問題或者可以說是它的鎖機制,在2.2版本之前,一個例項只有一個讀寫鎖,不管有多少資料庫和資料集合,當一個操作進行時其他操作只能等待,在2.2版本後,mongodb鎖降低了粒度,改為按庫鎖。
MongoDB 使用的是“readers-writer”鎖, 可以支援併發但有很大的侷限性,當一個讀鎖存在,許多讀操作可以使用這把鎖,然而, 當一個寫鎖的存在,一個單一的寫操作會exclusively 持有該鎖,同時其它讀,寫操作不能使用共享這個鎖;舉個例子,假設一個集合裡有 10 個文件,多個 update 操作不能併發在這個集合上,即使是更新不同的文件。
修復可能要花費很長的時間,在使用db.repairDatabase()去修復時一定要停掉讀寫,並且mongodb要有備機才可以,不然千萬不要隨便使用db.repairDatabase()來修復資料庫,切記。
但是在修復的過程中如果出現了非正常的mongodb的掛掉,再次啟動時啟動不了的,需要先修復才可以,可以利用./mongod --repair --dbpath=/data/mongo/ 如果你是把資料庫單獨的放在一個資料夾中指定dbpath時就指向要修復的資料庫就可以。
7. replica set一些隱含問題
a) replica set模式最多支援12臺伺服器,而有投票權的伺服器只支援7臺,如果超過7臺伺服器,需設定部分伺服器為無投票權伺服器
b) replica set模式中,一個set伺服器如果小於2臺伺服器,則自動故障恢復不會起作用,如果4臺伺服器出現2/2互相ping不通的情況,同樣不會自動故障恢復。一般來說,一個set中儘量是有單數伺服器。
c). replica set中,因為mongodb是按照時間進行操作,如果set中某個伺服器時間超前或者延遲,很容易出現secondaries不斷嘗試更新oplog或者同步延遲的問題。甚至造成某些操作失敗,如drop操作。
8. 分片模式的一些隱含問題
1. config server儘量按照官方的要求,有3個configserver,如果只有2個configserver,則shard的自動負載均衡和自動切片功能不可用。
2. api中的nearest模式在shard中,判斷的是set到mongos的距離而非set到client的距離,在切片模式下,儘量不要使用nearest模式,可能會造成一些請求延遲增加的問題。
優點
l 文件結構的儲存方式,能夠更便捷的獲取資料
l 內建GridFS,支援大容量的儲存
l 內建Sharding,分片簡單
l 海量資料下,效能優越
l 支援自動故障恢復(複製集)
mongodb是一個介於nosql資料庫和mysql資料庫之間的一個數據儲存系統,它沒有嚴格的資料格式,但同時支援複雜查詢,而且自帶sharding模式和Replica Set模式,支援分片模式,複製模式,自動故障處理,自動故障轉移,自動擴容,全內容索引,動態查詢等功能。擴充套件性和功能都比較強大。
mongodb在資料查詢方面,支援類sql查詢,可以一個key多value內容,可以組合多個value內容來查詢,支援索引,支援聯合索引,支援複雜查詢 ,支援排序,基本上除了join和事務型別的操作外,mongodb支援所有mysql支援的查詢,甚至某個客戶端api支援直接使用sql語句查詢mongodb。
mongodb的sharding功能目前日漸完善,支援自定義範圍分片,hash自動分片等,分片自動擴容,shard之間自動負載均衡等功能。實際使用中功能還不錯。
mongodb採用資料檔案預分配模式來生成資料檔案,資料檔案的大小從64M開始,每增加一個檔案,大小翻倍,直到2G,以後每次增加資料就會生成2G左右的資料檔案,結合mongodb的mmap記憶體模型,對於寫資料檔案,將隨機寫轉換為順序寫,一定程度上緩解了磁碟的io壓力。
但在實際使用中,遇到了在預分配2G的資料檔案時,如果磁碟io較慢,則mongodb基本鎖死,無法響應請求的情況。持續時間則根據磁碟io的效能來確定。這個問題在2.0之後版本可能會有些改善,但在磁碟效能低的伺服器上,該問題依舊存在.
這個問題目前沒有太好的解決方案,只能建議使用讀寫效能比較好的伺服器來跑mongodb。
在資料存量大於記憶體大小時,mongodb遇到冷資料查詢速度變慢。
mongodb使用mmap的記憶體管理模式,如果查詢的都是熱資料,那麼會在記憶體中直接查詢,如果遇到冷資料,就需要從磁碟讀取,並將一部分熱資料從記憶體解除安裝掉.
有人曾經說mongodb記憶體管理是載入固定大小的檔案塊到記憶體,即如果冷資料在磁碟上,他會根據請求的資料,載入一定大小的資料塊到記憶體,並解除安裝掉同樣的熱資料,這個操作本身會帶來一定io.
因為mongodb使用的是全域性鎖,在某個操作緩慢時,整個操作佇列會全部變慢。這個問題造成了mongodb會出現偶發性堵塞問題,連帶整個庫的效能下降。
該問題在應用需要儘量避免出現,需要將mongodb的資料大小規劃好,儘量不要使資料量超過記憶體的大小,如果超過記憶體大小後,儘量不要去請求冷資料。
Mongodb全域性鎖機制。
mongodb最大的問題或者可以說是它的鎖機制,在2.2版本之前,一個例項只有一個讀寫鎖,不管有多少資料庫和資料集合,當一個操作進行時其他操作只能等待,在2.2版本後,mongodb鎖降低了粒度,改為按庫鎖。
MongoDB 使用的是“readers-writer”鎖, 可以支援併發但有很大的侷限性,當一個讀鎖存在,許多讀操作可以使用這把鎖,然而, 當一個寫鎖的存在,一個單一的寫操作會exclusively 持有該鎖,同時其它讀,寫操作不能使用共享這個鎖;舉個例子,假設一個集合裡有 10 個文件,多個 update 操作不能併發在這個集合上,即使是更新不同的文件。
修復可能要花費很長的時間,在使用db.repairDatabase()去修復時一定要停掉讀寫,並且mongodb要有備機才可以,不然千萬不要隨便使用db.repairDatabase()來修復資料庫,切記。
但是在修復的過程中如果出現了非正常的mongodb的掛掉,再次啟動時啟動不了的,需要先修復才可以,可以利用./mongod --repair --dbpath=/data/mongo/ 如果你是把資料庫單獨的放在一個資料夾中指定dbpath時就指向要修復的資料庫就可以。
7. replica set一些隱含問題
a) replica set模式最多支援12臺伺服器,而有投票權的伺服器只支援7臺,如果超過7臺伺服器,需設定部分伺服器為無投票權伺服器
b) replica set模式中,一個set伺服器如果小於2臺伺服器,則自動故障恢復不會起作用,如果4臺伺服器出現2/2互相ping不通的情況,同樣不會自動故障恢復。一般來說,一個set中儘量是有單數伺服器。
c). replica set中,因為mongodb是按照時間進行操作,如果set中某個伺服器時間超前或者延遲,很容易出現secondaries不斷嘗試更新oplog或者同步延遲的問題。甚至造成某些操作失敗,如drop操作。
8. 分片模式的一些隱含問題
1. config server儘量按照官方的要求,有3個configserver,如果只有2個configserver,則shard的自動負載均衡和自動切片功能不可用。
2. api中的nearest模式在shard中,判斷的是set到mongos的距離而非set到client的距離,在切片模式下,儘量不要使用nearest模式,可能會造成一些請求延遲增加的問題。
優點
l 文件結構的儲存方式,能夠更便捷的獲取資料
l 內建GridFS,支援大容量的儲存
l 內建Sharding,分片簡單
l 海量資料下,效能優越
l 支援自動故障恢復(複製集)
mongodb是一個介於nosql資料庫和mysql資料庫之間的一個數據儲存系統,它沒有嚴格的資料格式,但同時支援複雜查詢,而且自帶sharding模式和Replica Set模式,支援分片模式,複製模式,自動故障處理,自動故障轉移,自動擴容,全內容索引,動態查詢等功能。擴充套件性和功能都比較強大。
mongodb在資料查詢方面,支援類sql查詢,可以一個key多value內容,可以組合多個value內容來查詢,支援索引,支援聯合索引,支援複雜查詢 ,支援排序,基本上除了join和事務型別的操作外,mongodb支援所有mysql支援的查詢,甚至某個客戶端api支援直接使用sql語句查詢mongodb。
mongodb的sharding功能目前日漸完善,支援自定義範圍分片,hash自動分片等,分片自動擴容,shard之間自動負載均衡等功能。實際使用中功能還不錯。