zoukankan      html  css  js  c++  java
  • (转)HubbleDotNet+Mongodb 构建高性能搜索引擎--概述

     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 目录。下面是目录结构:

            image

            然后我们在run 中运行 cmd ,然后执行 cd c:mongodbin 进入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:mongodbin>mongod --dbpath c:mongodbdata --logpath c:mongodblogmongodb.log --logappend –install

          这里我们需要注意下面两点:

    1. 命令行中的路径必须是绝对路径,如果输入相对路径,需要修改服务的启动路径,否则服务无法运行。
    2. 如果是在 windows 7 或者 windows 2008 server 操作系统下安装,必须以 administrator 方式运行 cmd 才行。

    卸载服务

          如果我们不想要mongodb 了,我们可以通过如下命令行卸载服务:

          C:mongodbin>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

    image

    从这个测试看冷启动情况下, 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

    image

    从这个测试结果看,平均查询时间上 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 的内存索引方案是无法自动持久化的,需要另外写程序持久化。

    转自:http://www.cnblogs.com/eaglet/archive/2012/05/10/2494073.htm

  • 相关阅读:
    华东交通大学2017年ACM双基程序设计大赛题解
    hdu2010(dfs+剪枝)
    欧拉函数phic以及超大数的快速幂
    想了一天的题目QAQ 毛线数列的最值
    记一下STL的一个题
    hdu1877进制转换
    hdu1002大数相加
    hdu1576逆元的一道水题
    Courses
    CodeForce-813B The Golden Age(数学+枚举)
  • 原文地址:https://www.cnblogs.com/CarreyMu/p/3717776.html
Copyright © 2011-2022 走看看