1. 需求
用一台创建索引的主服务器,不停的查询数据,解析数据,然后提交索引;这样导致主服务器的CPU、内存、硬盘IO占用都很高,如果再用它去做查询的话,用户多时肯定影响效率。
所以用到了Solr的索引复制功能。就是利用复制的索引去满足查询需求。如果查询用户非常多,那么建立更多的复制即可以满足需求。
同时顺便把用户自定义词典也复制过去,这样只需要在主服务器维护词典,它会自动同步到各从服务器,从而保持创建索引与查询时中文分词的一致性。
2. 环境
硬件:linux服务器两台,IP分别为:192.168.2.91/192.168.2.92
软件:Solr 4.1,Tomcat 7
模块:两种中文分词器,自己的web查询项目,一个创建索引的后台程序。
3. 实现
假设已经构建好两台服务器,配置好Tomcat与Solr及中文分词。具体参考前面的文章。
我这里的Solr用到多核(Multi Core),配置了两个core,一个是news用于处理新闻信息;一个是wb,用于处理微博信息。它们的数据结构是不一样的。这两个core都配置了复制,这样索引的提交接口应该是:http://192.168.2.91/solr/news与http://192.168.2.91/solr/wb;而索引的查询接口则是:http://192.168.2.92/solr/news与http://192.168.2.92/solr/wb;
1). 创建索引的后台程序运行于主服务器192.168.2.91,向索引的提交接口提交数据。
2). 自己的web查询项目布署于192.168.2.92(当然192.168.2.91你也可以布署一下),向索引的查询接口查询数据。
Solr主服务器192.168.2.91,$SOLR_HOME/news/conf/solrconfig.xml中相关配置如下:
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<!--
To enable simple master/slave replication, uncomment one of the
sections below, depending on wether this solr instance should be
the "master" or a "slave". If this instance is a "slave" you will
also need to fill in the masterUrl to point to a real machine.
-->
<lst name="master">
<!--何时合并,分别有:optimize(合并索引),commit(提交), startup(启动),可以填多个-->
<str name="replicateAfter">startup</str>
<str name="replicateAfter">commit</str>
<str name="replicateAfter">optimize</str>
<!--同时需要同步的配置文件,如词典等 -->
<str name="confFiles">schema.xml,negative.dic,words-my.dic</str>
</lst>
</requestHandler>
Solr从服务器192.168.2.92,$SOLR_HOME/news/conf/solrconfig.xml中相关配置如下:
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<!--主索引的url,该从索引将从这个主索引地址同步索引-->
<str name="masterUrl">http://192.168.2.92/solr/news/replication</str>;
<!--间隔时间;如果此值为空从索引将不会主动从主索引同步索引;也可以通过solr的管理控制台来触发;-->
<str name="pollInterval">00:00:30</str>
</lst>
</requestHandler>
上面是Solr的一个core(news)的配置,另外一个core(wb)也做同样的配置即可。
4. 结果
经过上述配置后,重新启动各Tomcat,然后在主服务器运行创建索引的线程时,从服务器会自动更新:可以在Tomcat后台查看到自动同步的信息,也可以在从服务器的Solr管理控制台的复制模块中看到当前的状态。