HubbleDotNet+Mongodb 構建高效能搜尋引擎–概述

來源:互聯網
上載者:User

        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

      這裡我們需要注意下面兩點:

  1. 命令列中的路徑必須是絕對路徑,如果輸入相對路徑,需要修改服務的啟動路徑,否則服務無法運行。
  2. 如果是在 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.