- 浏览: 150088 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (69)
- Maven (1)
- lucene (22)
- bobo zoie (6)
- eclipse (5)
- Nexus (1)
- Git (1)
- trac (1)
- RMI (2)
- svn (0)
- Protocol buffer (0)
- sensei (6)
- JMX (2)
- Faceted search (1)
- Linux (1)
- Cassandra (1)
- Zookeeper (3)
- zoie (1)
- jmap (1)
- mongodb (2)
- 百度百科 (2)
- 词库 (2)
- 抓取 (2)
- IndexTank (1)
- LinkedIn (4)
- norbert (3)
- 分布式 (2)
- senseidb (2)
- Thrift (1)
- scala (1)
- 搜索引擎 (1)
- 质量 (1)
- Nosql (1)
- Jaccard (1)
- Mahout (1)
最新评论
-
bluky999:
@Mark
怎样量化评价搜索引擎的结果质量 -
baso4233:
非常感谢,我跑通了。途中出现了,java.lang.Unsup ...
norbert 高并发分布式服务例子 examples (二) -
yangsong158:
rabbit9898 写道xiansuanla 写道我运行 m ...
JMX 入门例子 -
rabbit9898:
xiansuanla 写道我运行 main方法以后 cmd 里 ...
JMX 入门例子 -
xiansuanla:
我运行 main方法以后 cmd 里面运行 jconsole ...
JMX 入门例子
看来自己很懒,发现前同事的sensei 研究了
转载: http://johnnychenjun.blog.163.com/blog/static/1374934062011621111441102/
接上节的SenseiServer相关的概念,想必对sensei里面从Server启动到各种server/client的概念有所了解了。本次间隔了一周多来记录一下sensei做分布式search的过程,一周来每次重新跟进去看这些代码每次都有一些新发现和新体会,希望与大家分享,也期望更多的开发者能够了解并加入到分布式实时搜索的讨论中来。
言归正传
sensei分布式搜索流程
1. jetty启动后初始化的SenseiHttpInvokerServiceServlet,接受请求,交由ClusteredSenseiServiceImpl的doQuery方法处理。
2. ClusteredSenseiServiceImpl中集成了_clusterClient是获取zookeeper信息的,也就是那些node可以提供查询服务。其中成员变量SenseiBroker具体来执行brower的方法
3. senseibroker是一个中间层,通过clusterClient与zookeeper的通信,获取当前提供服务的node信息,并且提供loadbalance的服务,将不同的request根据patition的均衡策略,下发到具体的执行node上
4. 每个Node上的senseiServer是提供本node服务的,其成员变量里_networkServer是提供本地node查询服务的。_clusterClient与zookeeper来注册或者移除本地node。
_networkServer注册了提供服务的SenseiCoreServiceMessageHandler,coreSenseiService才是实际提供service的类。每个node通过coreSenseiService执行本node的多个patition的查询结果,本地合并。
5. 各node将查询的结果反馈给senseibroker,在broker这个层级上进行了mergeResult。合并结果反馈给用户显示。
这个图由于工作机无visio就用Edraw画的,没想到导出还有这个trial的标签,凑合着看先。换了张不带trial的图,截图下来的,应该好点。该图上方的虚线以上是我加的,nginx来均衡负载至不同的jettyServer上,提供外部搜索服务的是jettyServer,而在sensei内部的分布式搜索的过程,上述jettyServer, senseibroker,searchNode都是虚拟的,用虚线框起来的部分其实是在一台物理机上。通过norbert框架来实现node的服务提供,broker与node之间的消息序列化和反序列化由protobuf提供。
上面流程是个概要,里面具体值得展开描述的部分,一个是所谓分布式的请求和负载均衡的实现;另一个是在每个node里多patition搜索的实现。
分布式请求的分发和负载均衡
流程3当中的分布请求的发送细节的过程其实是这样的:
a) senseiBroker 初始化的时候作为ClusterListener被加入到clusterClient里了,也就是说zookeeper发现有其他node改变的时候,都会通知到senseiBroker,从而其掌握了最新的patition和node的信息。
b) 进行分布搜索的调用的时候,首先通过_loadBalancer.route来对多个patition的分片数据进行路由,对每个patition指定对应的node,然后做个汇集,按照node聚合patition的信息。也就是确定,向哪个node
的哪几个分区进行搜索的请求。
c) 将req发送至不同的server上,此时的req发送至node时加入了patition的信息。也就是说从broker发送至node上的senseiRequest是带patition信息的。
d) Node上的networkserver接受到请求handlePartitionedRequest,由于req已经包含了partition的信息,AbstractSenseiCoreService在执行execute的时候会将分区信息交给readerFactory,_core.getIndexReaderFactory(partition);来获得
indexreader来进行查询。
那么loadbalance的策略是怎样的呢?Sensei提供了两种,默认是UniformPartitionedLoadBalancer,其实是随机的挑node,而RingHashLoadBalancer则是一致性hash的方式来挑,当然也可以自己定制loadbalance的策略。
单个Node的Search流程
然后再说 流程4中的一个node提供搜索的实现:
a) SenseiServer里的_networkServer接受到senseibroker的请求的时候,交给了coreSenseiService来执行请求。
b) AbstractSenseiCoreService在执行execute方法时,根据请求req中的patition信息来判断是否需要search本地的多个分区,如果查多分区的话,则根据要查的分区数目来进行了多线程的查询调用,该处使用了java concurrent包里面的多线程池来进行_executorService调用。如果只有一个分区就直接执行handleRequest。
c) handleRequest里面来调用handlePartitionedRequest进行每一片索引的查询。
本处值得注意的是在做分区索引查询的时候,首先获取了分区下所有的segmentReaders,采用SenseiIndexPruner来对这些segmentReaders进行裁剪。也就是说根据SenseiRequest中的一些参数来对segment进行选择,减少对segment的查询。不过默认是DefaultSenseiIndexPruner不做任何裁剪,但也可以通过BoboSelectionSenseiIndexPruner裁剪, 即通过只查询包含某个或某几个fact的segment,来减少search的查询时间。 当然还可以通过扩展indexPruner接口来实现适合自己应用的裁剪方案。
d) 裁剪后的validatedReaders来执行bobo的browse查询。
但这个地方做bobo裁剪本身是否效率高或者说是否值得,我想sensei的工程师也有doubt,所以代码中可以看到一个PruneTimer来记录该耗时。
几点细节
1. sensei中需要自己实现 queryBuilder,根据应用需求对从用输入的query转化为lucene中的query,AbstractSenseiCoreService在执行execute方法时将req中的query转为senseiQuery,并执行bobo的browse动作。
2. 分布查询请求发送分布问题
在发送分布式请求的时候,召回的count数的分布,sensei目前是执行的保守策略,前端需要从start获取offset条记录的时候,将向每一个patition发送start+offset条记录的请求。如,需要前5页数据,每页20条。则senseibroker会向每个patition发送从0,开始取100条的req,假设5个patition下来就是会收到500条记录的反馈,然后进行mergeresult,这个地方倒并未做优化。
建议:在我们的实际开发中,则可能通过一些策略或者patition的规则来进行start,offset的粗略计算预测100条的结果分布,这样通过减少需要merge的条目数来降低查询的负载。
3. 对于结果的merge有两种,我们上面看到在一个node的多patition涉及合并,在broker上合并来自多个node间的结果,因此也可以看到ResultMerger 的merge函数是带参数boolean onSearchNode,true为在node上的patition的合并,而false时是在broker上的各个node节点的合并。
4. 在sensei的各种执行的过程中,都会有详细的timer来记录执行时间,这点非常nice,如:PruneTimer,GetReaderTimer, SearchTimer,MergeTimer等,这些都是通过了Yammer开源的一个metric ,通过记录下这些状态信息后,通过JMX来进行调用来监控系统的状态。
总体上说来,sensei的search过程还是集中了很多的高并发,分布式,容错的内容在里面,也使用了多种开源的东东,如zookeeper,protobuf,netty,jetty,nobert,metric,zoie,bobo等。内容还是相当的丰富,对于学习分布式系统而言也很有意义。
下一部分内容,将对分布索引这块进行解读。
发表评论
-
[转载]sensei分布式实时搜索系统源码解析(三) 分布式index
2012-04-26 15:22 1100sensei分布式实时搜索系统源码解析(三) 分布式inde ... -
基于sensei+lucene的分布式搜索终于上线了-2012-12-08
2011-12-08 13:26 1630基于sensei+lucene的分布式搜索终于上线了 ... -
[转载] sensei分布式实时搜索系统源码解析(一) senseiServer的启动及若干概念
2011-07-22 14:55 1781看来自己很懒,发现前同事的sensei 研究了 转载:htt ... -
lucene分布式搜索sensei的使用及完善
2011-07-22 14:32 3548原创文章,转载请注明 ... -
LinkedIn 的分布式搜索sensei编译安装
2011-04-11 11:37 1783Sensei是LinkedIn的一个分布式搜索系统。安装步骤 ... -
转载:几种常见的基于Lucene的开源搜索解决方案对比
2011-04-06 14:38 1334一 直接使用 Lucene ( http://lucene ... -
转载: Apache Zookeeper入门1
2011-04-06 14:36 1905源: http://www.javabloger.com/ar ... -
转载:Lucene查询语法详解
2011-04-02 10:33 1103英文原文地址:http: ... -
各种字符串Hash函数比较
2011-02-12 14:54 4126Java自带的字符串hash函数: public ... -
Lucene MoreLikeThisQuery 例子 备注
2011-01-06 11:22 14541。 编码问题: MoreLikeThisQuery中的 ... -
Lucene MoreLikeThisQuery 例子
2011-01-04 13:42 2830要做一个跟文章标题相关的新闻,本来想简单做一下,就是把标 ... -
lucene 3.0 分词例子 转载
2010-12-27 17:30 1931源:http://hxraid.iteye.com/blog ... -
lucene基本概念
2010-12-03 15:51 1159一、lucene索引的建立 1 ... -
[转载] lucene使用与优化
2010-12-03 10:14 1057源:http://www.cnblogs.com/bysshi ... -
[转载] 几种常见的基于Lucene的开源搜索解决方案对比
2010-12-02 16:07 906源:http://blog.fulin.org/201 ... -
lucene中的Token, TokenStream, Tokenizer, Analyzer
2010-11-22 10:41 1350转载: Token: 如果一个字段被token化,这表示它经 ... -
Lucene3.0的几种分词系统
2010-11-17 17:25 12861、 StopAnalyzer StopAnalyze ... -
当前几个主要的Lucene中文分词器的比较
2010-11-17 12:35 13241. 基本介绍: paoding :Lucene中 ... -
lucene score explain 评分解释说明
2010-11-16 17:29 2260通过Searcher.explain(Query qu ... -
lucene 排序 (Sort SortField 构造函数)
2010-11-09 13:58 4115注意: 在lucene2.9中,排序的字段域必须inde ...
相关推荐
sensei, 分布式实时搜索数据库 什么是 Sensei( http://www.senseidb.com/ )Sensei是一个分布式的弹性实时搜索数据库。维基维基在以下位置可用:http://linkedin.jira.com/wiki/display/SENS
Sensei mac版,是一款系统性能优化及清理工具,提供了一些与硬件和软件相关的功能,例如超级易于使用的应用程序卸载程序,快速的磁盘清理程序,电池和存储驱动器的运行状况信息等等,帮助您优化,监控和清洁Mac,以...
Sensei.unitypackage
Sensei是一个高性能、可扩展的数据搜索引擎和分析框架,特别适用于大数据处理场景。版本1.6.0可能包含了一系列优化和增强,旨在提高索引效率和查询性能。 【描述】"Global Session Filter" 描述中提到的"global-...
分布式文件系统 受GFS启发的分布式文件系统。 目录 系统应如何工作 用户PC上有一个客户端。 在远程服务器上也有一个Sensei服务器。 而且在不同的计算机上有很多文件服务器。 客户 CLI是否可以使用文件名称空间并获取...
- 提及了多种开源搜索引擎产品如Solr/SolrCloud、ElasticSearch、IndexTank、Sensei和云搜索服务如Amazon CloudSearch和阿里云搜索。 - 专门提到了淘宝的通用搜索产品TSearcher。 2. 网易通用搜索系统的实现 - ...
赛睿SteelSeries Sensei游戏鼠标驱动程序,是赛睿鼠标的官方驱动程序,支持WINXP/WIN7/WIN8驱动【32/64位】有需要的小伙伴赶紧下载吧。Steelseries Sensei游戏鼠标拥有一个32位的ARM处理器,运算速度相当于英特尔...
【标题解析】 "Sensei:WooThemes Sensei 插件" 是一个基于WordPress的教育平台插件,由WooThemes开发。WooThemes是一家知名的WordPress主题和插件提供商,而Sensei则是他们专为在线教学和学习设计的一款工具。 ...
但是,我们确实要求,如果您在实时网站上使用该插件,请从该网站购买有效的许可证。 我们无法为没有有效许可证密钥的任何人提供支持或一键式更新。 建筑 Sensei LMS结构模型可以分为几个部分。 这些组件在当前版本...
Sensei是为前端React开发人员构建的UI组件库。 主要重点是快速创建干净的响应式仪表板! 安装 Sensei依赖于整个应用程序被包装在带有单个主题道具的SenseiProvider组件中。 1.安装react-sensei Sensei现在可以通过...
Sensei,像鲁大师一样
### 墨鱼AI导航源码解析与应用 #### 一、系统概述 近年来,随着人工智能技术的迅猛发展,各种AI应用层出不穷,为人们的工作生活带来了极大的便利。在这个背景下,“墨鱼AI导航”应运而生,它不仅是一款集成了众多...
下一代Mac性能工具 绩效仪表板 详细的电池报告器 磁盘清理器 散热仪表板 主题支持 应用程式解除安装程式 详细的硬件信息 温度监控器 GPU显示器 性能优化 CPU监控器 定制设计 ...GPU固件导出器
次电子噪声Skipper CCD实验仪器(SENSEI)使用最新开发的Skipper-CCD技术,从次GeV暗物质粒子与硅中... SENSEI是第一个致力于从暗物质中搜索电子反冲的实验,这些结果证明了Skipper-CCD技术在暗物质搜索中的强大作用。
Sensei Grid 是简单的数据网格库,使用 JavaScript 编写。i 目标: 简单 极小的代码基础 扩展性 稳定性 在线演示 标签:Sensei
适用于OPNSense和Sensei的Grafana仪表板适用于OPNsense和插件Sensei的Grafana仪表板要求ELK堆栈7+ OPNsense的Telegraf配置Grafana和InfluxDBGrafana插件镁字云面板flant-statusmap-panel 格拉纳纳-皮埃哈特(panana...
-q, --query <query> Specifies query to search documentation. 标志 -h, --help Prints help information -l, --local Tries to open local documentation. 例子 打开板条箱的文档。 sensei rand 打开板条箱的...
《Sudoku Sensei——开源的数独导师》 数独,一种广受欢迎的逻辑游戏,以其独特的挑战性和无尽的乐趣吸引了无数爱好者。然而,对于初学者或是寻求提升解题技巧的人来说,有时候会遇到困难,不知道如何继续。这就是...