自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

主流NoSQL數(shù)據(jù)庫(kù)全方位評(píng)測(cè)之MongoDB

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù) MongoDB
本篇要評(píng)測(cè)的NoSQL產(chǎn)品是MongoDB,它是現(xiàn)在開(kāi)源社區(qū)里越來(lái)越受到關(guān)注的一個(gè)NoSQL產(chǎn)品,按照官方的說(shuō)法,是一個(gè)可擴(kuò)展的、高性能的、開(kāi)源的、面向文檔的數(shù)據(jù)庫(kù)。Craigslist、foursquare、國(guó)內(nèi)的淘寶網(wǎng)等知名互聯(lián)網(wǎng)公司都有在他們的生產(chǎn)環(huán)境部署了MongoDB。

本篇要評(píng)測(cè)的NoSQL產(chǎn)品是MongoDB,它是現(xiàn)在開(kāi)源社區(qū)里越來(lái)越受到關(guān)注的一個(gè)NoSQL產(chǎn)品,按照官方的說(shuō)法,是一個(gè)可擴(kuò)展的、高性能的、開(kāi)源的、面向文檔的數(shù)據(jù)庫(kù)。Craigslist、foursquare、國(guó)內(nèi)的淘寶網(wǎng)等知名互聯(lián)網(wǎng)公司都有在他們的生產(chǎn)環(huán)境部署了MongoDB。

一、MongoDB簡(jiǎn)介

mongodb是用C++開(kāi)發(fā)的面向文檔的數(shù)據(jù)庫(kù),也就是反傳統(tǒng)的數(shù)據(jù)庫(kù)范式來(lái)設(shè)計(jì)的,把相關(guān)的對(duì)象都記錄到一個(gè)文檔里,每個(gè)文檔內(nèi)是schema-free的,也就是列名可以自由定義,比較靈活,特別是面對(duì)業(yè)務(wù)邏輯多變的應(yīng)用場(chǎng)景十分給力。數(shù)據(jù)以BSON(類(lèi)似JSON)的格式二進(jìn)制存儲(chǔ)。不好的地方就是可能帶來(lái)一定的數(shù)據(jù)冗余和存儲(chǔ)開(kāi)銷(xiāo)。

很明顯,MongoDB這種面向文檔的數(shù)據(jù)庫(kù)和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的設(shè)計(jì)思路是差別很大的,因?yàn)槊總€(gè)文檔都包含了所有信息,和其他文檔是沒(méi)有關(guān)聯(lián)的,這樣傳統(tǒng)的Join操作就完全沒(méi)必要了,也正是因?yàn)槿コ诉@種“關(guān)系”,使得MongoDB的水平拆分更加容易,這也是面對(duì)海量數(shù)據(jù)的一個(gè)很好的處理思路。另外,MongoDB的索引機(jī)制和MySQL等數(shù)據(jù)庫(kù)是一樣的,可以利用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的經(jīng)驗(yàn)來(lái)使用MongoDB的索引。

不像其他很多NoSQL產(chǎn)品由個(gè)別工程師根據(jù)應(yīng)用場(chǎng)景開(kāi)發(fā)出來(lái),MongoDB是有一個(gè)專(zhuān)門(mén)的公司10gen來(lái)維護(hù)。有一點(diǎn)要注意的是,MongoDB自己是不管理內(nèi)存的,無(wú)法指定內(nèi)存大小,完全交給操作系統(tǒng)來(lái)管理,因此有時(shí)候是不可控的,在生產(chǎn)環(huán)境使用必須在OS層面監(jiān)控內(nèi)存使用情況。

二、測(cè)試說(shuō)明

1、測(cè)試環(huán)境

MongoDB部署在一臺(tái)PC 服務(wù)器上,配置如下:

CPU為Xeon 2.80GHz *4

內(nèi)存為4G

硬盤(pán)為一塊400G SATA盤(pán)

操作系統(tǒng)為64位CentOS 5.3版本

2、測(cè)試方法

這里仍然采用PHP客戶(hù)端進(jìn)行測(cè)試,MongoDB官方為PHP開(kāi)發(fā)了一個(gè)擴(kuò)展包可以操作MongoDB,網(wǎng)址為http://pecl.php.net/package/mongo,可以編譯到PHP運(yùn)行環(huán)境中來(lái)使用。

為了不對(duì)測(cè)試服務(wù)器產(chǎn)生額外的影響,測(cè)試客戶(hù)端部署在另外一臺(tái)獨(dú)立的服務(wù)器上,運(yùn)行的PHP的版本是5.3.5,web server是Nginx 0.8.54,通過(guò)fastcgi的方式調(diào)用PHP服務(wù)。使用apache ab工具實(shí)現(xiàn)多個(gè)請(qǐng)求和并發(fā)操作。

測(cè)試過(guò)程中就使用上文提到的已經(jīng)啟動(dòng)的數(shù)據(jù)庫(kù)實(shí)例,首先是進(jìn)行寫(xiě)操作,通過(guò)500個(gè)請(qǐng)求,每個(gè)請(qǐng)求寫(xiě)入10000條記錄,并發(fā)度為2來(lái)共寫(xiě)入500萬(wàn)條數(shù)據(jù),MongoDB的數(shù)據(jù)格式是BSON方式,不同于其他的NoSQL是key value的方式,因此這里寫(xiě)入的數(shù)據(jù)格式為:{id,data}的形式,ID為數(shù)字1到5000000,data大小為100個(gè)字節(jié)。然后是讀操作,也是用500個(gè)請(qǐng)求,每個(gè)請(qǐng)求隨機(jī)根據(jù)ID值讀出10000條記錄,并發(fā)度為10共讀出500萬(wàn)條記錄,評(píng)測(cè)的重點(diǎn)是寫(xiě)入和讀出數(shù)據(jù)的時(shí)間,以及在此過(guò)程中服務(wù)器的資源使用情況。

需要說(shuō)明的是,MongoDB默認(rèn)會(huì)為每個(gè)記錄建立一個(gè)名字為_(kāi)id的索引,在沒(méi)有索引的情況下MongoDB讀數(shù)據(jù)都要進(jìn)行全表掃描,效率還是很低的,因此在寫(xiě)完500萬(wàn)條記錄后,我在id字段上建立了一個(gè)索引來(lái)加快讀的過(guò)程。

三、安裝和使用

mongodb目前最新的版本是.8.2-rc3,其源碼安裝用了很多第三方的東西,比如JS引擎(目前官方推薦的是mozilla的Spider Monkey,以后可能改成google的V8,和node.js一樣,呵呵)、正則表達(dá)式引擎(pcre)、安裝構(gòu)建工具scons(這東西還要用python來(lái)安裝)、boost C++庫(kù)等等。下面是安裝過(guò)程:

1、下載需要的源文件和相關(guān)軟件包:

  1. [root@localhost mongodb]# wget http://downloads.mongodb.org/src/mongodb-src-r1.8.2-rc3.tar.gz  
  2. [root@localhost mongodb]# wget http://sourceforge.net/projects/scons/files/scons/2.1.0.alpha.20101125/scons-2.1.0.alpha.20101125.tar.gz/download  
  3. [root@localhost mongodb]# wget http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz  
  4. [root@localhost mongodb]# wget http://sourceforge.net/projects/pcre/files/pcre/7.4/pcre-7.4.tar.gz/download  

2、安裝scons:

  1. [root@localhost mongodb]# tar zxvf scons-2.1.0.alpha.20101125.tar.gz  
  2. [root@localhost mongodb]# cd scons-2.1.0.alpha.20101125  
  3. [root@localhost scons-2.1.0.alpha.20101125]# python setup.py install  

3、安裝pcre:

  1. [root@localhost mongodb]# tar zxvf pcre-7.4.tar.gz  
  2. [root@localhost mongodb]# cd pcre-7.4  
  3. [root@localhost pcre-7.4]# ./configure  
  4. [root@localhost pcre-7.4]# make  
  5. [root@localhost pcre-7.4]# make install  

4、安裝Spider Monkey:

  1. [root@localhost mongodb]# tar zxvf js-1.7.0.tar.gz  
  2. [root@localhost mongodb]# cd js/src  
  3. [root@localhost src]# export CFLAGS="-DJS_C_STRINGS_ARE_UTF8" 
  4. [root@localhost src]# make -f Makefile.ref  
  5. [root@localhost src]# JS_DIST=/usr make -f Makefile.ref export 

5、安裝boost,yum方式比較偷懶:

  1. [root@localhost src]# yum -y install boost boost-devel  

6、安裝mongodb:

  1. [root@localhost mongodb]# tar zxvf mongodb-src-r1.8.2-rc3.tar.gz  
  2. [root@localhost mongodb]# cd mongodb-src-r1.8.2-rc3  
  3. [root@localhost mongodb-src-r1.8.2-rc3]# scons all  
  4. [root@localhost mongodb-src-r1.8.2-rc3]# scons --prefix=/usr/local/mongodb --full install  

這樣就安裝完畢了,可以簡(jiǎn)單的啟動(dòng)mongod進(jìn)程來(lái)驗(yàn)證一下:

  1. [root@localhost bin]# ./mongod --dbpath /tmp  
  2. Wed Jun 8 11:57:38 [initandlisten] MongoDB starting : pid=29700 port=27017 dbpath=/tmp 64-bit  
  3. Wed Jun 8 11:57:38 [initandlisten] db version v1.8.2-rc3, pdfile version 4.5  
  4. Wed Jun 8 11:57:38 [initandlisten] git version: nogitversion  
  5. Wed Jun 8 11:57:38 [initandlisten] build sys info: Linux localhost.localdomain 2.6.18-128.el5 #1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64 BOOST_LIB_VERSION=1_33_1 
  6. Wed Jun 8 11:57:38 [initandlisten] waiting for connections on port 27017  
  7. Wed Jun 8 11:57:38 [websvr] web admin interface listening on port 28017  

可見(jiàn)mongod默認(rèn)在27017端口監(jiān)聽(tīng),而28017端口是web管理的端口,可通過(guò)http方式來(lái)訪問(wèn)。為了規(guī)范,我們用以下命令啟動(dòng)一個(gè)mongod進(jìn)程:

  1. [root@localhost data]# /usr/local/mongodb/bin/mongod --fork --dbpath /home/mongo/data/ --logpath /home/mongo/mongo.log --logappend --directoryperdb --journal --rest  

這樣一個(gè)mongod進(jìn)程就啟動(dòng)了,它監(jiān)聽(tīng)27017端口來(lái)提供服務(wù),可以在應(yīng)用程序中進(jìn)行建立數(shù)據(jù)庫(kù)等操作,它不像傳統(tǒng)的Oracle等關(guān)系數(shù)據(jù)庫(kù)那樣,建庫(kù)是個(gè)很慎重的工作。要了解更詳細(xì)的使用MongoDB的信息,讀者可以參看官方文檔,這里就不提及了。

四、測(cè)試結(jié)果

1、寫(xiě)操作

成功寫(xiě)入416萬(wàn)條記錄,寫(xiě)入失敗84萬(wàn)條記錄,共耗時(shí)525秒,平均每秒寫(xiě)入數(shù)據(jù)7924筆。數(shù)據(jù)文件大小近4G。寫(xiě)入過(guò)程中,服務(wù)器內(nèi)存、CPU和磁盤(pán)等資源使用情況如下圖所示:

 

 

 

可見(jiàn),內(nèi)存使用呈階梯狀上升,最后占用了近3.5個(gè)G,主要用來(lái)緩存數(shù)據(jù),對(duì)比數(shù)據(jù)文件的大小可以設(shè)想,在操作系統(tǒng)內(nèi)存可用的情況下,內(nèi)存的分配和數(shù)據(jù)文件的大小是大致相當(dāng)?shù)?。CPU和磁盤(pán)IO都表現(xiàn)出周期性的上下波動(dòng),估計(jì)和操作系統(tǒng)mmap緩存數(shù)據(jù)和刷新到磁盤(pán)的實(shí)現(xiàn)機(jī)制有關(guān)。從圖表可見(jiàn)本次測(cè)試的瓶頸同樣出現(xiàn)在磁盤(pán)IO上,磁盤(pán)的使用率最后達(dá)到100%,導(dǎo)致無(wú)法成功寫(xiě)入數(shù)據(jù)。

2、讀操作

成功讀出500萬(wàn)條記錄,共耗時(shí)432秒,平均每秒讀出數(shù)據(jù)11574筆。

讀數(shù)據(jù)過(guò)程中沒(méi)有發(fā)生磁盤(pán)IO。CPU較繁忙,Idle值穩(wěn)定在27左右,等待CPU資源的進(jìn)程一直在5到10個(gè)之間。內(nèi)存表現(xiàn)平穩(wěn)沒(méi)有波動(dòng)。

 

五、總結(jié)

通過(guò)以上測(cè)試結(jié)果可以看出,MongoDB占用的磁盤(pán)空間很大,這是因?yàn)槠湔加玫拇疟P(pán)空間是預(yù)分配的,每次以上一個(gè)數(shù)據(jù)文件的兩倍大小來(lái)預(yù)分配空間,并以0來(lái)填充,以避免在繁忙時(shí)期分配磁盤(pán)空間導(dǎo)致性能下降,因此我們看到的數(shù)據(jù)文件大小并不是實(shí)際占用的空間大小。另外其內(nèi)存是由操作系統(tǒng)管理的,自身并不管理內(nèi)存使用。從功能角度看MongoDB提供的查詢(xún)等操作接口是最為豐富的,在面對(duì)海量數(shù)據(jù)的拆分等可擴(kuò)展方面也有很好的設(shè)計(jì)思路,是一個(gè)很好的將數(shù)據(jù)模型從面向關(guān)系轉(zhuǎn)向面向文檔的NoSQL產(chǎn)品,相信將來(lái)會(huì)看到更多的線(xiàn)上產(chǎn)品選用MongoDB。

【編輯推薦】

  1. 主流NoSQL數(shù)據(jù)庫(kù)評(píng)測(cè)之Tokyo Cabinet
  2. 主流NoSQL數(shù)據(jù)庫(kù)評(píng)測(cè)之HandlerSocket

 

 

責(zé)任編輯:艾婧 來(lái)源: ITPUB
相關(guān)推薦

2011-07-13 09:58:15

HBase

2011-05-16 10:29:44

HandlerSockNoSQL

2011-05-30 09:27:35

NoSQL評(píng)測(cè)

2011-07-06 16:36:40

Redis

2015-03-03 14:08:39

Oracle數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)靜態(tài)分析

2011-03-21 15:08:56

MongoDBCouchDB

2011-09-21 11:21:00

NoSQL

2019-03-20 15:59:11

NoSQLRedis數(shù)據(jù)庫(kù)

2011-08-02 16:08:52

NoSQLMongoDBCassandra

2023-09-05 10:25:35

數(shù)據(jù)庫(kù)性能

2024-02-02 10:51:53

2019-03-27 14:54:05

NoSQL數(shù)據(jù)庫(kù)Forreste

2022-12-08 10:33:48

2013-12-03 11:00:48

2016-12-14 14:43:11

ButterknifeAndroid

2018-01-15 08:52:35

2012-08-10 09:44:06

2021-09-28 09:25:05

NoSQL數(shù)據(jù)庫(kù)列式數(shù)據(jù)庫(kù)

2011-10-09 09:38:03

OracleNoSQL

2011-10-26 09:28:28

紅帽大數(shù)據(jù)Gluster
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)