`

[转载] sensei分布式实时搜索系统源码解析(二) 分布式Search的流程

阅读更多

看来自己很懒,发现前同事的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等。内容还是相当的丰富,对于学习分布式系统而言也很有意义。
      下一部分内容,将对分布索引这块进行解读。

  • 大小: 30.1 KB
分享到:
评论

相关推荐

    sensei, 分布式实时搜索数据库.zip

    sensei, 分布式实时搜索数据库 什么是 Sensei( http://www.senseidb.com/ )Sensei是一个分布式的弹性实时搜索数据库。维基维基在以下位置可用:http://linkedin.jira.com/wiki/display/SENS

    Sensei for Mac v1.2.1 中文版 系统性能优化及清理工具

    Sensei mac版,是一款系统性能优化及清理工具,提供了一些与硬件和软件相关的功能,例如超级易于使用的应用程序卸载程序,快速的磁盘清理程序,电池和存储驱动器的运行状况信息等等,帮助您优化,监控和清洁Mac,以...

    Sensei.unitypackage

    Sensei.unitypackage

    sensei-hadoop-indexing-1.6.0.zip

    Sensei是一个高性能、可扩展的数据搜索引擎和分析框架,特别适用于大数据处理场景。版本1.6.0可能包含了一系列优化和增强,旨在提高索引效率和查询性能。 【描述】"Global Session Filter" 描述中提到的"global-...

    DFSs:这是我的大学项目-分布式文件系统sama。 它基于GFS和HDFS

    分布式文件系统 受GFS启发的分布式文件系统。 目录 系统应如何工作 用户PC上有一个客户端。 在远程服务器上也有一个Sensei服务器。 而且在不同的计算机上有很多文件服务器。 客户 CLI是否可以使用文件名称空间并获取...

    吴一男:网易通用搜索优化之道

    - 提及了多种开源搜索引擎产品如Solr/SolrCloud、ElasticSearch、IndexTank、Sensei和云搜索服务如Amazon CloudSearch和阿里云搜索。 - 专门提到了淘宝的通用搜索产品TSearcher。 2. 网易通用搜索系统的实现 - ...

    赛睿SteelSeries Sensei RAW游戏鼠标驱动程序 最新版

    赛睿SteelSeries Sensei游戏鼠标驱动程序,是赛睿鼠标的官方驱动程序,支持WINXP/WIN7/WIN8驱动【32/64位】有需要的小伙伴赶紧下载吧。Steelseries Sensei游戏鼠标拥有一个32位的ARM处理器,运算速度相当于英特尔...

    sensei:WooThemes Sensei 插件

    【标题解析】 "Sensei:WooThemes Sensei 插件" 是一个基于WordPress的教育平台插件,由WooThemes开发。WooThemes是一家知名的WordPress主题和插件提供商,而Sensei则是他们专为在线教学和学习设计的一款工具。 ...

    Sensei:Sensei LMS WordPress插件

    但是,我们确实要求,如果您在实时网站上使用该插件,请从该网站购买有效的许可证。 我们无法为没有有效许可证密钥的任何人提供支持或一键式更新。 建筑 Sensei LMS结构模型可以分为几个部分。 这些组件在当前版本...

    react-sensei:清理React UI组件库

    Sensei是为前端React开发人员构建的UI组件库。 主要重点是快速创建干净的响应式仪表板! 安装 Sensei依赖于整个应用程序被包装在带有单个主题道具的SenseiProvider组件中。 1.安装react-sensei Sensei现在可以通过...

    Sensei_1.3.3像鲁大师一样.dmg

    Sensei,像鲁大师一样

    墨鱼AI导航源码/小白也能即拿即用+视频教程

    ### 墨鱼AI导航源码解析与应用 #### 一、系统概述 近年来,随着人工智能技术的迅猛发展,各种AI应用层出不穷,为人们的工作生活带来了极大的便利。在这个背景下,“墨鱼AI导航”应运而生,它不仅是一款集成了众多...

    【最新版】Sensei.dmg 1.1.8,24【亲测可用】最好的Mac性能工具

    下一代Mac性能工具 绩效仪表板 详细的电池报告器 磁盘清理器 散热仪表板 主题支持 应用程式解除安装程式 详细的硬件信息 温度监控器 GPU显示器 性能优化 CPU监控器 定制设计 ...GPU固件导出器

    SENSEI:表面运行对Sub-GeV暗物质的第一个直接检测约束

    次电子噪声Skipper CCD实验仪器(SENSEI)使用最新开发的Skipper-CCD技术,从次GeV暗物质粒子与硅中... SENSEI是第一个致力于从暗物质中搜索电子反冲的实验,这些结果证明了Skipper-CCD技术在暗物质搜索中的强大作用。

    jQuery数据网格库SenseiGrid.zip

    Sensei Grid 是简单的数据网格库,使用 JavaScript 编写。i 目标: 简单 极小的代码基础 扩展性 稳定性 在线演示 标签:Sensei

    opnsense_grafana_dashboard:适用于OPNsense和插件Sensei的Grafana仪表板

    适用于OPNSense和Sensei的Grafana仪表板适用于OPNsense和插件Sensei的Grafana仪表板要求ELK堆栈7+ OPNsense的Telegraf配置Grafana和InfluxDBGrafana插件镁字云面板flant-statusmap-panel 格拉纳纳-皮埃哈特(panana...

    sensei:Sensei是一个简单的命令行工具,可以打开crates.io中任何包装箱的文档

    -q, --query <query> Specifies query to search documentation. 标志 -h, --help Prints help information -l, --local Tries to open local documentation. 例子 打开板条箱的文档。 sensei rand 打开板条箱的...

    Sudoku Sensei-开源

    《Sudoku Sensei——开源的数独导师》 数独,一种广受欢迎的逻辑游戏,以其独特的挑战性和无尽的乐趣吸引了无数爱好者。然而,对于初学者或是寻求提升解题技巧的人来说,有时候会遇到困难,不知道如何继续。这就是...

Global site tag (gtag.js) - Google Analytics