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

[经验分享] 用 memcached 实现 Solr Cache

[复制链接]

尚未签到

发表于 2015-7-17 09:57:34 | 显示全部楼层 |阅读模式
  solr 1.3 中使用的 cache 是 LRUCache,可以用 memcached 实现 SolrCache,替换 solr 的默认的 LRUCache。
  环境描述:有 N 台 solr 的子机(只提供搜索服务,用户搜索请求负载均衡到这些机器,N > 2),solr 默认缓存是 LRUCache。单台机的内存是有限制的,而且每台机的缓存是独立的,而请求是轮询分布到每台机上,所以缓存会有重复、且会浪费。把每台机的缓存都放到 memcached 中,每台子机共同创建缓存,并且可以分享其它机器创建的缓存,再加上 memcached 容量大,命中率会有提升。
  于是,我就想用 memcached 来实现 solr 的 queryresultCache,其实其它 SolrCache 也一样吧。实现的过程,发现 solr 相关的某些类不支持序列化的,所以无法保存到 memcached 中。还是先为 solr 打个 patch 吧。补丁文件 solr-memcache.patch 如:


  • Index: src/java/org/apache/solr/search/DocSet.java  
  • ===================================================================  
  • --- src/java/org/apache/solr/search/DocSet.java (revision 781268)  
  • +++ src/java/org/apache/solr/search/DocSet.java (working copy)  
  • @@ -17,6 +17,8 @@  
  •   
  • package org.apache.solr.search;  
  •   
  • +import java.io.Serializable;  
  • +
  • import org.apache.solr.common.SolrException;  
  • import org.apache.solr.util.OpenBitSet;  
  •   
  • @@ -138,7 +140,7 @@  
  • }  
  •   
  • /** A base class that may be usefull for implementing DocSets */  
  • -abstract class DocSetBase implements DocSet {  
  • +abstract class DocSetBase implements DocSet, Serializable {  
  •   
  •    // Not implemented efficiently... for testing purposes only  
  •    public boolean equals(Object obj) {  
Index: src/java/org/apache/solr/search/DocSet.java =================================================================== --- src/java/org/apache/solr/search/DocSet.java(revision 781268) +++ src/java/org/apache/solr/search/DocSet.java(working copy) @@ -17,6 +17,8 @@   package org.apache.solr.search;  +import java.io.Serializable; +  import org.apache.solr.common.SolrException;  import org.apache.solr.util.OpenBitSet;  @@ -138,7 +140,7 @@  }   /** A base class that may be usefull for implementing DocSets */ -abstract class DocSetBase implements DocSet { +abstract class DocSetBase implements DocSet, Serializable {     // Not implemented efficiently... for testing purposes only    public boolean equals(Object obj) {   我已经放在 google 项目中,可以下载:http://code.google.com/p/solr-side/issues/detail?id=1&can=1。
  上面只是先直接看下补丁文件,solr memchached 缓存查询结果的实现也可以在 google 项目中下载:http://solr-side.googlecode.com/files/solr-memcache.zip,全部东西都在这个 zip 里。现讲下怎么用它。
  假设已经下载 solr 1.3 并解压到 d:/apache-solr-1.3.0,solr-memcache.zip 解压到 d:/apache-solr-1.3.0/contrib/solr-memcache。
  复制 patch-build.xml 和 solr-memcache.patch 到 d:/apache-solr-1.3.0,然后cmd 进入 d:/apache-solr-1.3.0 目录,运行
D:\apache-solr-1.3.0>ant -f patch-build.xml -Dpatch.file=solr-memcache.patch
Buildfile: patch-build.xml
apply-patch:
    [patch] patching file src/java/org/apache/solr/search/DocSet.java
BUILD SUCCESSFUL
Total time: 0 seconds
  为 solr 1.3 打缓存系列化相关的补丁成功了(ant 为 solr 打补丁的方式请看:http://blog.chenlb.com/2009/02/ant-apply-source-patch-task-demo.html,另一 solr 补丁示例 http://blog.chenlb.com/2009/04/apply-solr-collapsing-patch-remove-duplicate-result.html)。接下来构建 solr 与 solr-memcahce,运行如下:
D:\apache-solr-1.3.0>ant dist
...
  现在可以发现已经有 D:\apache-solr-1.3.0\dist\apache-solr-memcache-1.3.0.jar 文件了,同时也有 D:\apache-solr-1.3.0\dist\apache-solr-1.3.0.war 文件(已经打过补丁的)。
  把 solr-memcache 安装使用上。把 apapache-solr-memcache-1.3.0.jar 和依赖的 memcached-2.2.jar、spy-2.4.jar(可以在 solr-memcache/lib 下找到) 放到 solr.home/lib 下(我想把它独立没有把它放到 apache-solr-1.3.0.war 里)。
  修改 solr.home/conf/solrconfig.xml 配置告诉 solr 怎么使用 Memcached 实现的 Cache。这次实现的目的主要用在 queryresultCache 上。在 solrconfig.xml 的 query 元素内找到 queryresultCache,把原来的注释掉,改如下的:


  •   
  •   
  •   
     再在 query 元素内(就在 queryResultCache 下面不远处可以找到类似的 listener )新增加如下内容:


  •   
  •   
    用打过补丁的 war 安装到 tomcat (安装可参考:http://blog.chenlb.com/2009/05/apache-solr-quick-start-and-demo.html)。
  上面 listener 的内容主要是取得索引版本号。启动运行,效果如下:

solr memcached query result cache,点击放大
  多个子机共用一个 memcached 的确可以提高命中率,在我的实际应用环境中,原来命中率在 10% - 15% 左右,用 solr memcached cache 后,提高到了 58%  左右。不过我没测试过它有多少的性能提升(索引比较大,命中的情况,查询时间是可以减少的),主要用它来提高命中率的。
  把它用在 documentCache  也应该可以的(我没测试过,因为我觉得 documentCache  没必要用 memcached 除非网络速度快过磁盘),所有我不建议 documentCache  使用它。
  我为了以后升级 solr 方便,已经把 solr memcached 实现提交给 solr 官方 jira 里,并且官方已经接受,准备在 solr 1.5 中实现这个功能。请看:http://issues.apache.org/jira/browse/SOLR-1197。

运维网声明 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-87549-1-1.html 上篇帖子: Solr环境配置 下篇帖子: 【转帖】Solr.Net的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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