Solr MultiCore LRU队列

当服务器资源有限但是加载的core特别多的时候怎么办?我们当然希望能够根据索引或查询请求而动态的加载卸载多核,https://issues.apache.org/jira/browse/SOLR-1293 给Solr4.2提供了一个补丁,能够在大规模cores上进行动态的加载卸载,可以参考框架:http://wiki.apache.org/solr/LotsOfCores LotsOfCores. 相关的配置很简单,Solr4.3以后的版本已经集成了此功能,目前我使用的是solr4.4版本,在solr.xml中配置如下:

  1. <?xml version=“1.0″ encoding=“UTF-8″ ?>  
  2. <solr persistent=“true”>  
  3.   <cores transientCacheSize=“2″ adminPath=“/admin/cores”>  
  4.     <core loadOnStartup=“true” instanceDir=“multicore/collection1970_01_1″ transient=“false” name=“core1970_01_1″/>  
  5.     <core loadOnStartup=“false” instanceDir=“D:\jacoxu\solrHome\multicore\collection0004″ transient=“true” name=“core0004″/>  
  6.     <core loadOnStartup=“false” instanceDir=“D:\jacoxu\solrHome\multicore\collection0005″ transient=“true” name=“core0005″/>  
  7.     <core loadOnStartup=“false” instanceDir=“D:\jacoxu\solrHome\multicore\collection0006″ transient=“true” name=“core0006″/>  
  8.     <core loadOnStartup=“false” instanceDir=“D:\jacoxu\solrHome\multicore\collection0007″ transient=“true” name=“core0007″/>  
  9.   </cores>  
  10. </solr>  

这也就是之前讲的删除一个core时,必须先进行一下query访问才能删除dataDir.

Solr5.0版还没出,不过估计会有较大的改动。在上次讲过的利用solrj动态添加多核中可以设置新添加core的属性,loadOnStartup和transient属性,但是新添加的core并不参加LRU队列交换,直接修改solr源代码是一件冒险的事,一种可行的方法是进行定时进行tomcat重启操作,重启时要注意的是,在linux上,tomcat很有可能shutdown无效,那么需要进行强制Kill:

  1. public static void restartTomcat() {   
  2.     if (SmsBase.osName==“windows”) {   
  3.         String[] changePath_cmd = {   
  4.             “cmd”,   
  5.             “/c”,    
  6.             “cd ”+ SmsBase.tomcatPath,   
  7.         };   
  8.         String[] shutdown_cmd = {   
  9.             “cmd”,   
  10.             “/c”,    
  11.             “shutdown.bat”     
  12.         };   
  13.         String[] startup_cmd = {   
  14.             “cmd”,   
  15.             “/c”,    
  16.             “startup.bat”     
  17.         };   
  18.         try {   
  19.              SmsBase.log.info(“shutdown tomcat now …”);   
  20.              Runtime rt = Runtime.getRuntime();   
  21.              Process proc = rt.exec(changePath_cmd);   
  22.              proc = rt.exec(shutdown_cmd);   
  23.              Thread.sleep(10000);   
  24.              SmsBase.log.info(“startup tomcat now …”);   
  25.              proc = rt.exec(startup_cmd);   
  26.              SmsBase.log.info(“sleep 30s waitting for tomcat init …”);   
  27.              Thread.sleep(30000);   
  28.         } catch (IOException e) {   
  29.             e.printStackTrace();   
  30.         } catch (InterruptedException e) {   
  31.             e.printStackTrace();   
  32.         }   
  33.     }else {   
  34.         String result = “”;     
  35.         String line = “”;   
  36.         String[] shutdown_cmd = {   
  37.             “/bin/sh”,     
  38.             “-c”,   
  39.             “bash ”+SmsBase.tomcatPath +“shutdown.sh”     
  40.         };   
  41.         String[] grepID_cmd = {   
  42.             “/bin/sh”,   
  43.             “-c”,   
  44.             “`ps -ef|grep -E tomcat|grep -v grep|awk ’{print $2}’`”     
  45.         };   
  46.         String[] startup_cmd = {   
  47.             “/bin/sh”,   
  48.             “-c”,    
  49.             “bash ”+SmsBase.tomcatPath +“startup.sh”     
  50.         };   
  51.         try {   
  52.              Runtime rt = Runtime.getRuntime();   
  53.              SmsBase.log.warn(“shutdown tomcat now …”);   
  54.              Process proc = rt.exec(shutdown_cmd);    
  55.              proc.waitFor();   
  56.              Thread.sleep(10000);   
  57.              proc = rt.exec(grepID_cmd);   
  58.              InputStreamReader is = new InputStreamReader(proc.getInputStream());     
  59.              BufferedReader br = new BufferedReader (is);     
  60.              while ((line = br.readLine ()) != null) {     
  61.                  result += line;     
  62.              }   
  63.              proc.waitFor();   
  64.              if (result.length()!=0) {   
  65.                 String[] killID_cmd = {   
  66.                         “/bin/sh”,   
  67.                         “-c”,   
  68.                         “kill -9 ”+result   
  69.                  };   
  70.                  SmsBase.log.error(“fail to shutdown tomcat, kill it now…”);   
  71.                  proc = rt.exec(killID_cmd);   
  72.                  proc.waitFor();   
  73.                  Thread.sleep(10000);   
  74.              }   
  75.              Thread.sleep(1000);   
  76.              SmsBase.log.warn(“startup tomcat now …”);   
  77.              proc = rt.exec(startup_cmd);   
  78.              SmsBase.log.warn(“sleep 30s waitting for tomcat init …”);   
  79.              Thread.sleep(30000);   
  80.              SmsBase.log.warn(“tomcat restart ok!”);   
  81.         } catch (IOException e) {   
  82.             e.printStackTrace();   
  83.         } catch (InterruptedException e) {   
  84.             e.printStackTrace();   
  85.         }   
  86.     }   
  87. }  

原文出自:http://jacoxu.com/?p=595

Solr MultiCore LRU队列》上有 1 条评论

  1. Pingback 引用通告: 再谈Solr core LRU | 刻骨铭心

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>