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