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

然后我们在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
的内存索引方案是无法自动持久化的,需要另外写程序持久化。

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

时间: 2024-10-03 08:03:10

(转)HubbleDotNet+Mongodb 构建高性能搜索引擎--概述的相关文章

浅入深出ElasticSearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构  课程学习地址:http://www.xuetuwuyou.com/course/161 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 ElasticSearch5.0.0 Spring Tool Suite 3.8.2.RELEASE Maven3.0.5 Spring4 Netty4 Hadoop2.7.1 Kibana5.0 JDK1.8.0_111 二.课程目标 1.快速学习Elastic

【读书笔记】2016.12.10 《构建高性能Web站点》

本文地址 分享提纲: 1. 概述 2. 知识点 3. 待整理点 4. 参考文档 1. 概述 1.1)[该书信息] <构建高性能Web站点>: -- 百度百科 -- 本书目录: 第1章 绪论 1.1 等待的真相 1.2 瓶颈在哪里 1.3 增加带宽 1.4 减少网页中的HTTP请求 1.5 加快服务器脚本计算速度 1.6 使用动态内容缓存 1.7 使用数据缓存 1.8 将动态内容静态化 1.9 更换Web服务器软件 1.10 页面组件分离 1.11 合理部署服务器 1.12 使用负载均衡 1.1

构建高性能数据库缓存之redis主从复制

一.什么是redis主从复制? 主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致:且实现Redis的主从复制非常简单. 二.redis主从复制特点 1.同一个Master可以拥有多个Slaves. 2.Master下的Slave还可以接受同一架构中其它slave的链接与同步请求,实现数据的级联复制,即Master->Slave->Slave模式: 3.Master以非阻塞的方式同步数据至slave,这将

构建高性能服务(三)Java高性能缓冲设计 vs Disruptor vs LinkedBlockingQueue--转载

原文地址:http://maoyidao.iteye.com/blog/1663193 一个仅仅部署在4台服务器上的服务,每秒向Database写入数据超过100万行数据,每分钟产生超过1G的数据.而每台服务器(8核12G)上CPU占用不到100%,load不超过5.这是怎么做到呢?下面将给你描述这个架构,它的核心是一个高效缓冲区设计,我们对它的要求是: 1,该缓存区要尽量简单 2,尽量避免生产者线程和消费者线程锁 3,尽量避免大量GC 缓冲 vs 性能瓶颈 提高硬盘写入IO的银弹无疑是批量顺序

《构建高性能 Web站点》笔记

书名:构建高性能Web站点 出版社: 电子工业出版社 ISBN:9787121170935 一  绪论 等待的时间: (1) 数据在网络上的传输时间 (2) 站点服务器处理请求并生成回应数据的时间 (3) 浏览器本地计算和渲染的时间 二  数据的网络传输 数据如何发送 (1) 应用程序通过系统函数库接口(如send)向内核发出系统调用 (2) 系统内核将数据从用户态内存区复制到由内核维护的内核缓冲区(这块地址空间的大小有限,需要发送的数据以队列的形式进入) (3) 内核通知网卡来取数据,网卡将数

《构建高性能web站点》随笔 无处不在的性能问题

前言– 追寻大牛的足迹,无处不在的“性能”问题. 最近在读郭欣大牛的<构建高性能Web站点>,读完收益颇多.作者从HTTP.多级缓存.服务器并发策略.数据库.负载均衡.分布式文件系统多个方面娓娓道来,洋洋洒洒,甚是精彩,想来让人心旷神怡.     但“纸上得来终觉浅,绝知此事要躬行”,要消化本书的内容,绝不是一件简单的事情,更重要的还是实践.在实践和学习的过程中,我会把自己的经验和感悟分享出来,一方面权当做笔记,另一方面,对于后来的童鞋,希望能提供一丝一毫的帮助,不胜欣慰.     由于是读书

HAProxy + Keepalived + Flume 构建高性能高可用分布式日志系统

一.HAProxy简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理. HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接.并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上. 二.Keepalived简介 它是一个基于VRRP协议来实现的WEB服务高可用方案,

构建高性能服务(二)java高并发锁的3种实现

构建高性能服务(二)java高并发锁的3种实现 来源:http://www.xymyeah.com/?p=46 提高系统并发吞吐能力是构建高性能服务的重点和难点.通常review代码时看到synchronized是我都会想一想,这个地方可不可以优化.使用synchronized使得并发的线程变成顺序执行,对系统并发吞吐能力有极大影响,我的博文 http://maoyidao.iteye.com/blog/1149015 介绍了可以从理论上估算系统并发处理能力的方法. 那么对于必须使用synchr

构建高性能服务

构建高性能服务  ConcurrentSkipListMap和链表构建高性能Java Memcached 场景 缓存服务器是互联网后端服务中常用的基础设施. 场景(一)图片服务器上存储了大量图片,为了提高图片服务的吞吐量,希望把热门的图片加载到内存中. 场景(二)分布式存储服务,为提高访问吞吐,把大量的meta信息存储在内存中. 问题 但是使用Java语言开发缓存服务,不可避免的遇到GC问题.无论使用ehcache是基于Map实现的缓存,都会产生大量Minor GC无法回收的对象,最终导致CMS