利用solrj加载卸载solr多核并更新solr.xml

在使用solr多核时会有这样的需求,动态的加载卸载新core,并更新solr.xml

这样的实现比较容易,实验版本为solr4.2,solr5之后可能会有比较大的改动,还没有出,目前solr4.4的solr.xml配置还是兼容的:

1.动态加载新core

  1. public  static void load_solrCore(String coreName, String insPath, String serverName){         
  2.     try {      
  3.         //path=”D:/jacoxu/solrHome/multicore/collection0″;   
  4.         //serverName=”http://localhost:8080/solr”;   
  5.         HttpSolrServer tempServer= solrServer.setServer(serverName);      
  6.         CoreAdminRequest.createCore(coreName, insPath, tempServer);      
  7.     } catch (Exception e) {      
  8.         e.printStackTrace();      
  9.     }      
  10. }    

2.动态卸载旧core

  1. public static void unload_solrCore(String coreName, String serverName) {   
  2.     try {   
  3.         HttpSolrServer tempServer= solrServer.setServer(serverName);   
  4.         CoreAdminRequest.unloadCore(coreName, tempServer);   
  5.     } catch (Exception e) {   
  6.         e.printStackTrace();   
  7.     }   
  8. }  

3.有时在执行上面两个操作的时候需要动态的更新solr.xml,因为如果突然断电或solr服务重新启动,都需要重新初始化solr.xml文件中的多核配置,为了能恢复中断前的多核状态需要能够实时根据上面的两个操作更新solr.xml
只需要配置solr.xml中

  1. <?xml version=“1.0″ encoding=“UTF-8″ ?>  
  2. <solr persistent=“true”>  
  3.   <!–   
  4.   adminPath: RequestHandler path to manage cores.     
  5.     If ’null’ (or absent), cores will not be manageable via request handler   
  6.   –>  
  7.     <cores adminPath=“/admin/cores”>  
  8.         <core name=“core0″ instanceDir=“multicore/collection0″ />  
  9.         <core name=“core1″ instanceDir=“multicore/collection1″ />  
  10.         <core name=“core2″ instanceDir=“multicore/collection2″ />  
  11.         <core name=“core3″ instanceDir=“multicore/collection3″ />  
  12.         <core name=“core4″ instanceDir=“multicore/collection4″ />  
  13.         <core name=“core5″ instanceDir=“multicore/collection5″ />  
  14.   </cores>  
  15. </solr>  

第2行的

  1. <solr persistent=“false”>  

默认的为false,把false改为true即可。

有了上面的两种方法可以很方便的动态添加与卸载核,但并不能设置一些参数,例如设置core的属性,例如loadOnStartup和transient,另一种Create core的方法,CoreAdminRequest.Create

  1. public  static void load_solrCore(String coreName, String insPath, String serverName){   
  2.     try {   
  3.         //inpath=”D:/jacoxu/20130531SolrPorject/solrHome/multicore/collection0″;   
  4.         //serverName=”http://localhost:8080/solr”;   
  5.         HttpSolrServer tempServer= solrServer.setServer(serverName);   
  6.   
  7.         CoreAdminRequest.Create cc = new CoreAdminRequest.Create();   
  8.         cc.setCoreName(coreName);   
  9.         cc.setInstanceDir(insPath);   
  10.         cc.setIsLoadOnStartup(false);   
  11.         cc.setIsTransient(true);    
  12.         cc.process(tempServer);   
  13.            
  14.     } catch (Exception e) {   
  15.         e.printStackTrace();   
  16.     }   
  17. }  

关于loadOnStartup和transient在后续的LRU队列中会介绍它们的作用,用起来会比较方便。同样地动态卸载Core也可以采用同样的方式:

  1. //unload old core by solrj   
  2. public boolean unload_solrCore(String coreName, boolean delIndex,HttpSolrServer midbaseServer) throws SolrServerException, IOException {   
  3.     SolrQuery query = new SolrQuery();   
  4.     CoreAdminRequest.Unload uc = new CoreAdminRequest.Unload(true);   
  5.     uc.setCoreName(coreName);   
  6.     uc.setDeleteDataDir(true);   
  7.     query.set(“shards”, ServerIP+coreName);   
  8.     SmsBase.agentCoreServer.query(query);   
  9.     uc.process(midbaseServer);   
  10.     //CoreAdminRequest.unloadCore(coreName,delIndex,midbaseServer);   
  11.     return true;   
  12. }  

执行卸载对卸载核进行了访问,是因为添加了动态队列,需要进行查询访问才能把当前core激活,只有加载了dataDir后才能使的setDeleteDataDir(true)生效,否则找不到路径。被注释掉的

  1. //CoreAdminRequest.unloadCore(coreName,delIndex,midbaseServer);   

其实也是调用上面的一堆属性配置然后执行process操作,不过solrj提供出来的接口有限,没有删除dataDir的参数,所以我们自己来调制底层参数更显个性化。

利用solrj加载卸载solr多核并更新solr.xml》上有 2 条评论

    • 一种情况是 solr.xml中参数配置问题,把solr persistent=“false” 改为 solr persistent=“true”,另外一种是 找错文件啦,哈哈。

发表评论

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

*

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