设为首页 收藏本站
查看: 1468|回复: 0

[经验分享] Solr性能优化之merger的合并方式优化

[复制链接]

尚未签到

发表于 2016-12-16 09:52:09 | 显示全部楼层 |阅读模式
  现状
  当 solr 集群采用了 merger 的合并方式后,会把各台 solr 的结果合并到最终结果并输出,如下图所示:
DSC0000.jpg

  这种是非常常规的做法,我想各路大神也早明白大概的情况了,那我也不多说了
  集群的基本情况就是,因为收录了大量的新闻信息,某些新闻可能某一个小时间段内插入了大量数据,而某些时间段却木有,比如:“车祸“这一个关键字,在早上的9点1分1秒添加了 10W +  条数据,但其他时间段却一条都没有,但因为入索引时采用了轮询的方式,可以认为相同所有关键字在每台 solr 的数据量近似一样。简单一句话,每一个台solr 对应关键字的文档数差不多,但关键字在每一台 solr 对应关键字的时间段分布很不均匀。这很重要的目前的集群数据分布情况。
  问题的提出
  业务要求需要通过某关键字搜索出来的数据,并通过翻页拿出最新的 1W 的数据用于分析,比如:搜索“车祸”有 50W+条结果,每页 20条记录,然后通过翻页 page=1 , page=2 , page=3 这样子一直翻到 500 页拿到 1W 条数据(500 * 20 = 1W )
  但这样子的问题又来了,通知这样子的翻页,性能比较低下,这样子遍历1W条记录需要 45秒左右的时间,因为这样子的分析是用户触发,意思是需要让用户在页面前等待 45 秒的时间,同时这样子造成了 merger 较大的 cpu 使用率。因为 merger 要进行合并排序,越往后翻页,merger 合并的数据量倍数增长。
  1. 比如越往后翻页,性能表现越差,因为在 merger 排序,如果我翻到 start=100 ,rows=10 的话,表面上 merger 只返回了10条记录,但事实上单台 solr 却返回了 100 + 10 = 110 条记录到 merger ,导致越往后翻性能越差
  2. 同样的道理,因为翻页越往后,从每台 solr 拿到的 rows 就越大(因为无论什么时候 start=0) , 
  那读取的 docs 就更多了,导致了每台 solr 的搜索时间更长了。
  综上所述,要解决这些问题我做了以下的调整
  由上面的分析可以知道,其实翻页越往后,mereger 筛选掉的结果就越多,这些都是无用功。
  所以我做了2个地方调整,如下所示
DSC0001.jpg

  1,调整从 merger 传递到各 solr 的分页调整(如下图所示),注意红色框的东西,因为merger 合并时把前 n 页的数据都会拿出来并进行合并,所以我这里调整了一下,比如, solr 的数量是 6 ,前端需要 start=100,rows=10 则从merger 发布到各solr 的分页则变成 rows / 6  = 10 / 6 =  1.6 ,取为 2 ,则传给每一台 solr 的分页参数是 start= (100 / 10 ) * 2 , rows = 2 , 则从 merger 传到各 solr 的 rows 是 2 , start 是 20 . 那 merger 从每一台 solr 拿到的结果其实只有 2 个,merger 拿到的总数据是 2 X 6 = 12 个了,merger 只需要把这些结果合并起来不用参与任何的排序。
  2,另外,修改 solr 的 merger 那部分的源码,在QueryComponent 类中,修改 mergeIds 的方法,使用里面的 ShardFieldSortedHitQueue 类变成普通的 LinkedList 类,只需要把各 Shards 简单添加起来了。如图:
DSC0002.jpg

  OK,已经完成了。就算前端需要 start 值很大,但事实上,这样修改后 每台 solr 传给 rows 的只有几个,大大减少了 merger 在合并过程中的损失。同时业务的遍历仅仅拿到这个时间段的数据则可,至于有没有排序好,对于他们来说意义不大,因为他们要把这些数据进行整理。
  文字虽然比较啰嗦,希望我能表达我能表达的东西出来就可以了。只要按着思路去做,代码方面不是什么问题。
  优化后的性能对比
  两种方式,在修改前后的效果对比,可以看到,新方式比之前的快了2到3倍,这都是得益于这种方式的效率。
DSC0003.jpg

  欢迎转载,请注明 http://kernaling-wong.iyunv.com/blog/2022742   by kernaling.wong

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315025-1-1.html 上篇帖子: solr build索引遇到控制字符的错误 下篇帖子: 一个tomcat服务添加多个solr索引应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表