索引复制(Index Replication)

索引复制这种分布式方式,是由一个主索引和多个从索引构成,从索引从主索引复制索引。主索引负责更新索引,从索引复制同步索引和查询。一个主索引可以复制索引到多个多个从索引库。

索引复制

ClassNotFoundException HttpRequestInterceptor

在 solr 3.6 中,客户端使用 solrj 时

HttpSolrServer server = new  HttpSolrServer("http://localhost:8080/solr/");

时报一个错

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/HttpRequestInterceptor
该错误的原因是没有集成以下几个 jar

httpclient-4.1.3.jar
httpclient-cache-4.1.3.jar
httpcore-4.1.4.jar
httpmime-4.1.3.jar

这几个 jar 在 solr 3.6 的发行包中并没有集成,需要从这里下载

http://archive.apache.org/dist/httpcomponents/httpclient/binary/httpcomponents-client-4.1.3-bin.zip

solr 伸缩性和分布式介绍

分布式解决的问题:
当搜索执行的时间太长,或者索引太大,此时要考虑使用 solr 的分布式了。solr 分布式中,将一个大的索引分成几个小的索引(shards,分片),放在不同的机器上。当执行搜索时,将查询划分成多个子查询,在不同机器的索引库中执行搜索,然后将查询结果合并。这个拆分查询和合并结果的过程对用户是透明了。
索引复制解决的问题:
  • 当单机的查询性能不济时,可以考虑复制出多台索引来分别承担压力,如做一个全国性的搜索,可以将索引库复制30来个,每个省分一个,每个省请求过来时,分别在自己省所分配的索引库中进行搜索
  • 将索引的读写分离,也可以很好的提供性能。由一个负责写索引,然后同步到其他索引,其他索引只读,仅提供搜索。
  • 备份索引,详见利用 Replication Handler 备份索引

利用 Replication Handler 备份索引

solr 索引备份最简单的方式是通过 Replication Handler。在使用 Replication Handler 之前,需要将 solrconfig.xml 中 SolrReplicationHandler 的注释去掉:

     <requestHandler name="/replication" class="solr.ReplicationHandler" >
       <lst name="master">
         <str name="replicateAfter">commit</str>
         <str name="replicateAfter">startup</str>
         <str name="confFiles">schema.xml,stopwords.txt</str>
       </lst>
       <lst name="slave">
         <str name="masterUrl">http://localhost:8983/solr/replication</str>
         <str name="pollInterval">00:00:60</str>
       </lst>
     </requestHandler>
然后启动 web 容器,启动完成后执行

http://localhost:81/apache-solr-3.5.0/replication?command=backup

该请求成功的话,会得到:

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">42</int>
</lst>
<str name="status">OK</str>
</response>

此时在 solr/home 的 data 目录下,会发现类似 snapshot.20120626210126 的目录,该目录就是备份出来的索引库

在 tomcat 中运行 solr

基于 solr 进行开发,少不了要在 tomcat 中运行 solr,这里以 windows + tomcat 6.0 + solr 3.5 为基础讲解在 tomcat 中部署 solr 的过程。

首先在 solr 的发行包中 apache-solr-3.5.0\dist 下找到 apache-solr-3.5.0.war,将其复制到 tomcat/webapp 下,启动 tomcat ,tomcat 会将 war 包解压开,然后会报一个错误,说在 tomcat/bin 目录下找不到 solr/home ,现在可以先关闭 tomcat ,找到  apache-solr-3.5.0 文件夹(就是war包被 tomcat 解压出来的),打开 Tomcat 6.0\webapps\apache-solr-3.5.0\WEB-INF 下的 web.xml,将
<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>/put/your/solr/home/here</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
的注释去掉,将  /put/your/solr/home/here  的值改成 solr 配置文件所在的位置(solr/home),如:D:/apache-solr-3.5.0/example/solr。保存文件再运行 tomcat,正常情况下,此次启动不会报错了,启动完成后,在浏览器中输入

http://localhost:81/apache-solr-3.5.0/admin/

就可以看到 solr 的管理界面了,此时 solr 3.5 在 tomcat 中部署成功了。

至于 solr/home 的配置,除了像本例在配置在 web.xml 中,还可以配置在系统环境变量中(像 java_home 类似的配法),也可以 tomcat 启动命令行中增加

JAVA_OPTS=”-Dsolr.solr.home=/Users/jonathan/Desktop/solr”

阿丁比较推荐的做法是按本例中的方式,配置在 web.xml 中,这样对tomcat、操作系统影响最少,换一个 tomcat 只需将修改自己本身的 web.xml 就行。

CoreAdminHandler 之 UNLOAD

UNLOAD 请求会将一个 core 从 solr 中移除。在移除过程,正在执行的请求将继续,但不会接受新的请求。

http://localhost:8983/solr/admin/cores?action=UNLOAD&core=core0

UNLOAD 请求必须制定一个参数:

core:
需要被移除的 core 的名称,如果 <solr> 的 persistent 属性为 true 时,该 <core> 元素将会从 solr.xml 中移除。

CoreAdminHandler 之 SWAP

SWAP 该命令可以切换两个存在的 core 的名称。可以用于将一个新建或已有的 core 替换到目前正在服务的 core,比如原有的 core 正在运行,需要更新,可以新建一个 core,启动新 core 后,将新 core 和正在运行的 core 的名称做个切换,这样更新就无缝能生效。

http://localhost:8983/solr/admin/cores?action=SWAP&core=core1&other=core0

该请求需要两个参数:

core:
需要被替换的 core 的名称
other:
替换后 core 的名称

CoreAdminHandler 之 RENAME

RENAME 请求用于修改某个 solr core 的名称

http://localhost:8983/solr/admin/cores?action=RENAME&core=core0&other=core5

该请求需要以下两个参数:

core:
需要修改名称的 core 的名称
other:
改后的名称,如果 <solr> 元素中的 persistent 属性是 true,这个名称将被写入 solr.xml 文件中的 <core> 元素的name 属性中。

CoreAdminHandler 之 RELOAD

RELOAD 请求是重新加载一个已存在的 core,可以使其新的配置生效,同样在重新加载过程,旧的 core 依然在服务,当重载完成后,旧的 core 将被卸载。
当修改了磁盘上配置文件,通过调用这个命令,就可以配置生效 ,比如添加新的字段。重新加载 core 时,不需要重启 tomcat 等 web 容器,这点比较方便,保证不停机服务。

http://localhost:8983/solr/admin/cores?action=RELOAD&core=core0

RELOAD 仅接受以下这个参数:

core:
需要被重载的 core 的名称

Solr 4.0发布时间表

Solr 4.0 当前还未释放出来
  • 4.0- alpha 大约在2012年6、7月份发布
  • 4.0-beta 大概在  alpha  版发布后的 30 天发布
  • 4.0 (final)  大概在 beta 版发布后 30 天发布

这样,4.0 正式发布大概 2012 年 9 月份。

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress