HubbleDotNet 從 1.2.3 版本以后開始在官方代碼中支持和 Mongodb 對接,Mongodb 是10gen 公司開發的 no-sql 數據庫,其讀寫性能比傳統關系數據庫要快很多,而且可以非常方便的分布式部署。HubbleDotNet 通過支持 Mongodb 也使其本身同時具備了 no-sql 的解決方案。本文將重點概述Hubble+Mongodb 的功能以及和hubble+sql , lucene.net 的一些性能測試對比。
Mongodb 的安裝
在開始本文之前,我們簡單介紹一下 Mongodb 在 windows 下的安裝,其他操作系統下的安裝也是類似的。
首先在這個鏈接 http://www.mongodb.org/downloads 找到對應操作系統的版本,下載下來后解壓。我們假設解壓到 C:\mongodb
我們在 c:\mongodb 下建立一個 data 目錄和 一個 log 目錄。下面是目錄結構:
然后我們在run 中運行 cmd ,然后執行 cd c:\mongodb\bin 進入mongodb可執行程序目錄
接下來執行 mongod --dbpath ../data --logpath ../log/mongodb.log
完成上述步驟后,mongodb 的服務程序就啟動了。
默認端口
如果要遠程訪問 mongodb ,我們需要在防火牆中將 mongodb 的默認端口打開,下面是 mongodb 相關服務的默認端口:
- Standalone mongod : 27017
- mongos : 27017
- shard server (mongod --shardsvr) : 27018
- config server (mongod --configsvr) : 27019
- web stats page for mongod : add 1000 to port number (28017, by default)
安裝為服務
上面說的命令行只是用於調試用的,如果要正式在服務器上部署,我們需要將 mongodb 安裝為服務來運行。
在windows 下安裝mongodb服務的命令行如下:
C:\mongodb\bin>mongod --dbpath c:\mongodb\data --logpath c:\mongodb\log\mongodb.log --logappend –install
這里我們需要注意下面兩點:
- 命令行中的路徑必須是絕對路徑,如果輸入相對路徑,需要修改服務的啟動路徑,否則服務無法運行。
- 如果是在 windows 7 或者 windows 2008 server 操作系統下安裝,必須以 administrator 方式運行 cmd 才行。
卸載服務
如果我們不想要mongodb 了,我們可以通過如下命令行卸載服務:
C:\mongodb\bin>mongod --remove
Hubble中mongodb 數據庫適配器的連接字符串
在HubbleDotNet 中,沒有采用 mongodb 默認的連接字符串來連接mongodb,而是用了標准的連接字符串來連接
無用戶名和密碼連接 mongodb
這個是mongodb沒有設置用戶名和密碼時通過 hubbledotnet 連接mongodb 數據庫適配器的連接字符串
Data Source=127.0.0.1;Initial Catalog=News;Integrated Security=True
我們只要指定服務器IP地址 Data Soruce 和 數據庫名 Initial Catalog 就可以了
通過用戶名和密碼連接 mongodb
這個是mongodb設置用戶名和密碼時通過 hubbledotnet 連接mongodb 數據庫適配器的連接字符串
Data Source=127.0.0.1;Initial Catalog=News;User Id=myUsername;Password=myPassword;
HubbleDotNet+Mongodb 功能一覽
- 支持標准的數據類型如 int, string, double,datetime 等
- 支持對mongodb的指定字符串字段進行全文索引和查詢。mongodb 本身不支持全文查詢,hubbledotnet 通過配置后可以支持對mongodb進行全文查詢,查詢語法和與其他數據庫類型的語法相同。這個是hubble+mongodb 的核心功能。
- 支持主庫為關系數據庫,比如 sql server ,鏡像表用 mongodb。這個是推薦方式,可以做到數據的讀寫分離和分布式部署。
- 支持 mongodb 作為主庫的主動模式索引,這種模式對於實時索引將會比較有用
- 支持 mongodb 作為主庫的被動模式索引。這種模式目前還不支持通過hubble來同步索引,需要自己寫代碼手工同步。原因是mongodb 不支持觸發器。
- 支持通過 mongodb 實現數據的分布式部署
- 支持用SQL語句對mongodb進行非全文查詢。如 select top 10 * from table where price > 100 and price < 200 order by price。這個是 hubbleDotNet 特有的功能。hubbledotnet 實現了一個sql 到 bson 的語法轉換,調用者可以像訪問sql server 那樣來通過標准sql語句訪問 mongodb ,這為不喜歡 bson 查詢的開發者提供了很大的便利。
- 支持通過bson 語句訪問或配置 mongodb。 hubbledotnet 提供了兩個存儲過程 sp_excutesql 和 sp_querysql 來方便用戶通過hubble直接用 bson 操作mongodb
- 對不完整文檔的支持。Mongodb 是文檔型數據庫,它並不強制每條記錄的字段像關系數據庫那樣是固定不變的,可能每條記錄的字段都不一樣。HubbleDotNet 支持這種設計,對於在記錄中沒有出現的字段,作為NULL來處理,如果指定了默認值,則按默認值處理。
- 對 sub-field 的支持。mongodb 是文檔型數據,支持子字段。hubble 將在后續版本中對子字段進行支持。
性能測試
測試環境:
軟件版本
HubbleDotNet 版本 1.2.5.0
Mongodb 版本 2.0.5
SQL SERVER 2008
Lucene.net 2.9.4
系統環境
Intel i5 2430M 2.40GHz 8GB windows 7 64bit
7800 轉機械硬盤
測試數據
測試數據為2000萬行互聯網網頁數據。數據文件大小為4GB。
測試目標:
測試hubble+sqlserver, Hubble+Mongodb 以及 lucene.net 在單機系統高並發時的性能比較。
測試方法:
通過測試代碼每秒鍾查詢10次,查詢840個常用英文單詞的搜索,返回前10條 title 和 content ,按匹配度排序
測試用例1:
在這個測試用例中,我們取消 hubbledotnet 所有的緩存,讓 hubbledotnet 每次都從硬盤讀索引,lucene.net 也設置為從文件讀取。對840個英文單詞的查詢全部是首次查詢。而且每次測試前重啟計算機以清除操作系統的文件緩存。
測試結果如下:
每秒鍾查詢次數 |
最大查詢時間(ms) |
平均查詢時間(ms) |
最小查詢時間(ms) |
|
Hubble+Mongodb |
10 |
1573 |
431 |
3 |
Hubble+SQL SERVER |
10 |
8997 |
931 |
4 |
Lucene.net |
10 |
209196 |
108665 |
9430 |
從這個測試看冷啟動情況下, hubbledotnet+mongodb 的性能是最佳的,而lucene.net 幾乎比 hubbledotnet+mongodb 慢200多倍。lucene.net 比 hubbledotnet 慢這么多的原因主要是lucene.net 訪問IO 的速度較慢,以及lucene.net 的索引大小比hubbledotnet 大4倍多。lucene.net 的索引大小是 3.6GB 而 hubbledotnet 只有 800MB 。HubbleDotNet 1.2.5.0 對於首次查詢的磁盤IO做了一定的優化,也是 hubbledotnet 比 lucene.net 性能高這么的主要原因。
測試用例2:
在這個測試用例中,我們在 hubbledotnet 中指定RamIndex 為Full,即將索引全部加載到內存,lucene.net 也設置為內存索引。這個測試主要是測試內存索引的性能。
測試結果如下:
每秒鍾查詢次數 |
最大查詢時間(ms) |
平均查詢時間(ms) |
最小查詢時間(ms) |
內存(MB) |
|
Hubble+Mongodb |
10 |
148 |
5.53 |
1 |
1,164 |
Hubble+SQL SERVER |
10 |
157 |
6.17 |
0 |
1,170 |
Lucene.net |
10 |
230 |
3.58 |
0 |
3,611 |
從這個測試結果看,平均查詢時間上 lucene.net 要比 hubbledotnet 略快,最大查詢時間上 hubbledotnet 比 lucene.net 快。平均查詢時間 lucene.net 快的原因,我分析是這樣的,lucene.net 是單進程運行,而 hubbledotnet 是3個進程互動,即測試進程,hubble 服務進程 和 mongodb 進程(或 sql server 進程) 。三個進程互動時,每次查詢都會觸發進程的切換,這個過程會消耗一定的系統資源,特別是在查詢時間為微妙級時,這個性能的損耗就會比較突出一些。不過這個查詢速度無論對於那種環境來說都已經足夠,從這個測試來看,如果要達到系統的滿負荷,hubbledotnet 大概可以支持到每秒鍾200次查詢左右,相當於每天查詢1600萬次,這個對於單機系統性能已經非常高了,如果一個網站的訪問量達到這么大,一半是需要考慮分布式解決方案了。
而最大查詢時間hubble比lucene快將近1倍,這個基本反映出查詢算法性能的優劣。這個和我的另外的測試結果(另文闡述)基本是吻合的,即按照score 排序,hubble 的查詢速度大概是 lucene.net 的2倍,按其它字段排序,大概為5倍左右。
內存占用方法,Lucene.net 占用3.6GB內存,hubbledotnet占用 1.1 GB 內存,這個主要是因為 hubbledotnet 的索引比 lucene.net 要小的緣故。HubbleDotNet 的內存占用還可以優化,優化后對於本例來說應該可以減少到800MB 左右。
持久化方面,hubbledotnet的內存索引是可以自動持久化的,就是說運行過程中的增刪改的變化會自動存儲到文件介質中,並更新到內存中,這樣即使機器重啟也不會丟失數據。lucene.net 的內存索引方案是無法自動持久化的,需要另外寫程序持久化。
HubbleDotNet 首頁: http://hubbledotnet.codeplex.com/
HubbleDotNet開源全文搜索數據庫項目--技術詳解HubbleDotNet 微博: http://weibo.com/hubbledotnet