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