一. 簡介。
Mongo是一個高性能,開源,無模式的文檔型資料庫。其名字來自humongous這個單詞的中間部分,從名字可見其野心所在就是海量資料的處理。
和mysql一樣,一個mongod服務可以建立多個資料庫。每個資料庫可以有多張表,這裡的表成為collection,每個collection可以存放多個文檔(document),每個文檔都以bson(binary json)的形式存放于硬碟中。跟關系型資料庫不一樣的地方時,他是以單文檔為機關存儲的,你可以任意的給一個或一批文檔新增或删除字段,而不對其他文檔造成影響,這就是所謂的schema-free,也是文檔型書苦苦最主要的優點。跟一般的key-value資料庫不一樣的是,它的value中存儲了結構資訊,是以你也可以像關系型資料庫那樣對某些域進行讀寫、統計等操作。可以說是兼備了key-value資料庫的友善高效與關系型資料庫的強大功能。
和關系型資料庫類似,mongodb可以對某個字段建立索引,可以建立組合索引、唯一索引,當然建立索引就以為着增加空間開銷。是以個人建議就是将一個文檔作為一個對象來考慮,線上上應用中通常隻對對象id建立一個索引就可以了、根據id取出對象資料放在memcache中。預設情況下每個collection隊會有一個唯一索引:_id,如果插入資料時沒有指定_id,服務會自動生成一個_id,為了充分利用已有索引,減少空間開銷,最好是自己指定一個unique的key為_id,通常用對象的id比較合适。
Mongodb允許在建表之初就指定一定的空間大小,接下來的插入操作會不斷的按照順序append資料再這個預配置設定好的空間中,如果超出這個大小,則回到檔案頭覆寫原來的資料繼續插入。這種結構保證了插入和查詢的高效性,它不允許删除單個記錄,更新的也有限制:不能超過原有記錄的大小。
Monogodb的複制架構和mysql很類似,除了包括master-slave構型和master-master構型之外,還有一個replica pairs構型,這種構型在平常可以像master-slave那樣工作,一旦master出現問題,應用會自動連接配接slave。
千萬級的資料mongodb的性能插入效率是mysql的20倍,查詢效率也是好幾倍。缺點是磁盤空間占用率。
GridFS是mongodb一個很有趣的類似檔案系統的東西,它可以用一大塊檔案空間來存放大量的小檔案,不過性能以及其他方面還沒有作深入的嘗試。
Monogodb不支援事務操作。支援分片不過還未研究。
總結:面向集合的存儲、動态查詢、完整的索引支援、查詢監視、複制及自動故障轉移、搞笑的傳統存儲方式、自動分片以及支援雲級别的伸縮性。
二. 場景。
适合于
1. 網站資料,mongo非常适合實時的插入.
2. 緩存,由于性能很高,Monogo也适合作為資訊基礎設施持久化的緩存層。
3. 大尺寸、低價值的資料。這類資料用傳統的關系型資料庫代價比較大。
4. 高伸縮的場景,Monogo非常适合由數十台或數百台伺服器組成的資料庫。
5. 用于對象及json資料的存儲。
不适于
高度事務性的系統。
三. 性能分析
1. 先從單線程的角度來測試
模式:單master。非嵌入式。目标位址192.168.140.2,端口27017
空間初始大小:
插入速度:
初始狀态
插入動作執行10秒後:
平均每秒插入1w6條資料,每條資料的大小在4k以内。
插入後占用空間:
讀取速度:
大概在3500-4000間浮動
資料的場合
模式:主從master-slave。非嵌入式。目标位址192.168.140.2,端口主27017,從27018
空間初始大小:
主:
從:
插入速度:
插入動作執行10秒後:(隻插入主庫)
影響不大
30w資料占用的空間
讀取速度:
模式對性能上的影響不大。
下面再看看mm模式,雙向同步
模式:主從master-master。非嵌入式。目标位址192.168.140.2,端口主27017,主27018
初始空間:
插入速度:
性能大概降低了一半
32w資料占用的空間
讀取速度:
大體不變。
下面拿ms模式來試下多線程的情況
開了3個線程10秒插入資料量
開了2個程序10秒插入資料量
讀取資料不變。
在伺服器端直接安裝程式讀寫本地庫
讀取速度相當可觀相當贊。
10秒寫入速度不變
測試中發現的不穩定問題點:
開啟2個程序測試讀取速度時程式堵塞過一次。
删除操作時,ms模式同步不及時
從
本文轉自 熬夜的蟲子 51CTO部落格,原文連結:http://blog.51cto.com/dubing/712438