mongodb的優缺點

mongodb的優缺點

對比mysql, mongo的優缺點有:html

缺點mysql

l  不支持事務操做sql

l  佔用空間過大mongodb

l  MongoDB沒有如MySQL那樣成熟的維護工具數據庫

l  沒法進行關聯表查詢,不適用於關係多的數據api

l  複雜聚合操做經過mapreduce建立,速度慢服務器

| 模式自由,  自由靈活的文件存儲格式帶來的數據錯誤併發

|負載均衡

  1. 預分配模式帶來的磁盤瓶頸。

mongodb採用數據文件預分配模式來生成數據文件,數據文件的大小從64M開始,每增長一個文件,大小翻倍,直到2G,之後每次增長數據就會生成2G左右的數據文件,結合mongodb的mmap內存模型,對於寫數據文件,將隨機寫轉換爲順序寫,必定程度上緩解了磁盤的io壓力。nosql

但在實際使用中,遇到了在預分配2G的數據文件時,若是磁盤io較慢,則mongodb基本鎖死,沒法響應請求的狀況。持續時間則根據磁盤io的性能來肯定。這個問題在2.0以後版本可能會有些改善,但在磁盤性能低的服務器上,該問題依舊存在.

這個問題目前沒有太好的解決方案,只能建議使用讀寫性能比較好的服務器來跑mongodb。

 

  1. 在數據存量大於內存大小時,mongodb遇到冷數據查詢速度變慢。

mongodb使用mmap的內存管理模式,若是查詢的都是熱數據,那麼會在內存中直接查詢,若是遇到冷數據,就須要從磁盤讀取,並將一部分熱數據從內存卸載掉.

有人曾經說mongodb內存管理是加載固定大小的文件塊到內存,即若是冷數據在磁盤上,他會根據請求的數據,加載必定大小的數據塊到內存,並卸載掉一樣的熱數據,這個操做自己會帶來必定io.

由於mongodb使用的是全局鎖,在某個操做緩慢時,整個操做隊列會所有變慢。這個問題形成了mongodb會出現偶發性堵塞問題,連帶整個庫的性能降低。

         該問題在應用須要儘可能避免出現,須要將mongodb的數據大小規劃好,儘可能不要使數據量超過內存的大小,若是超過內存大小後,儘可能不要去請求冷數據。

  1. Mongodb全局鎖機制。

mongodb最大的問題或者能夠說是它的鎖機制,在2.2版本以前,一個實例只有一個讀寫鎖,無論有多少數據庫和數據集合,當一個操做進行時其餘操做只能等待,在2.2版本後,mongodb鎖下降了粒度,改成按庫鎖。

MongoDB 使用的是「readers-writer」鎖, 能夠支持併發但有很大的侷限性,當一個讀鎖存在,許多讀操做可使用這把鎖,然而, 當一個寫鎖的存在,一個單一的寫操做會exclusively 持有該鎖,同時其它讀,寫操做不能使用共享這個鎖;舉個例子,假設一個集合裏有 10 個文檔,多個 update 操做不能併發在這個集合上,即便是更新不一樣的文檔。

 

  1. 刪除數據集合後空間不會自動釋放

mongodb刪除集合後磁盤空間不釋放,只有用db.repairDatabase()去修復才能釋放。

修復可能要花費很長的時間,在使用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之間自動負載均衡等功能。實際使用中功能還不錯。

相關文章
相關標籤/搜索