首頁>Club>
10
回覆列表
  • 1 # 天涯辦公

    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之間自動負載均衡等功能。實際使用中功能還不錯。

  • 中秋節和大豐收的關聯?
  • 如何做個內外兼修的女神?