solr索引分发

从solr1.4开始支持基于java的以http方式分发索引
优点:
1.不再使用脚本,可以跨平台
2.不仅索引,还可以分发配置文件

配置
Master主机
<requestHandler name="/replication" class="solr.ReplicationHandler" >
    <lst name="master">
        <!--在'startup'和'commit'后分发,也可用'optimize'-->
        <str name="replicateAfter">startup</str>
        <str name="replicateAfter">commit</str>
        <!--这里写需要分发的配置文件,使用逗号分隔-->
        <str name="confFiles">schema.xml,stopwords.txt,elevate.xml</str>
    </lst>
</requestHandler>

注意:
1.如果你用了startup,最好也设置commit/optimize.否则分发只在solr startup时分发.
2.<str name="confFiles">solrconfig_slave.xml:solrconfig.xml,x.xml,y.xml</str>
 这个配置要求在主机本地文件solrconfig_slave.xml分发到仆机上时命名为solrconfig.xml
 没有指定的使用原名

Slave仆机
<requestHandler name="/replication" class="solr.ReplicationHandler" >
    <lst name="slave">
        <str name="masterUrl">http://localhost:port/solr/replication</str>
        <!--仆机查询主机索引是否可以分发的时间间隔.格式是HH:mm:ss.如果没有设置,仆机不会主动询问主机.
         但fetchindex还是可以从控制台或者http请求触发-->
        <str name="pollInterval">00:00:20</str>
        <!--是否压缩传输. 可选的值是internal|external。除非你的带宽慢,否则不要使用此项,实际上在局域网内这个会减慢速度-->
        <str name="compression">internal</str>
        <!--仆机连主机的超时设置,默认值分别是5000ms和10000ms.用户一般也不需要配置-->
        <str name="httpConnTimeout">5000</str>
        <str name="httpReadTimeout">10000</str>
        <!--http基于权限验证时需要的设置,一般不用配置-->
        <str name="httpBasicAuthUser">username</str>
        <str name="httpBasicAuthPassword">password</str>
     </lst>
</requestHandler>
配置连发
连发其实就是既做主机也做仆机,以1分2,2分4,4分8这样的方式分发索引.
一定要有replicateAfter为'commit'的设置,即便在主机里replicateAfter设置为optimize。
这是因为连发器在索引下载完后,只会调用一个commit.在仆机上Optimize根本就不会被调用

<requestHandler name="/replication" class="solr.ReplicationHandler">
    <lst name="master">
      <str name="replicateAfter">commit</str>
      <str name="confFiles">schema.xml,stopwords.txt,synonyms.txt</str>
    </lst>
    <lst name="slave">
      <str name="masterUrl">http://master.solr.company.com:8080/solr/replication</str>
      <str name="pollInterval">00:00:60</str>
    </lst>
  </requestHandler>
 
 
工作原理?
这个特性依赖于Lucene的IndexDeletionPolicy.在这个API中, Lucene把IndexCommits作为每次提交或优化的回调.
IndexCommit能提供和commit相关联的文件. 这样我们就能够识别那些文件需要分发.

仆机如何复制?
其实主机不知道仆机. 仆机持续的检测主机看当前主机的索引版本. 如果有更新的.就执行下面的步骤,
1.仆机确认相关文件列表. 然后下载文件.如果连接中断, 下载可以从出错的断点恢复.出错时会尝试重连5次.
2.文件先下载到临时目录. 所以主机或者仆机崩溃也不会带来什么影响.
3.下载完后,所有最新的文件被移到index目录并且保持文件的更新时间和主机相同.
4.最后在仆机上提交一个'commit'命令,然后新索引就被加载了

配置文件如何分发?
只有在solr实例的conf目录中的文件可以分发.
配置文件只能和新索引一同分发.
配置文件会通过校验和比较在主机和仆机是否相同.
配置文件也是先下载到临时目录然后移到conf目录. 旧的文件会被重命名并保存在同目录下. ReplicationHandler不能自动的清除旧文件.
下载结束,最少1个配置文件通过core重载,而不是通过commit命令.
If a replication involved downloading of at least one conf file a core reload is issued instead of a 'commit' command.

我在仆机加了文档或者仆机索引文件损坏了会如何?
如添加了文档,那么仆机就不再和主机同步.而且它也不会设法和主机同步,直到主机有更新的索引.
主机提交索引后,主仆机的索引版本就不同了.仆机获取文件列表找到那些文件(same name)和本地在大小/时间戳伤是不同的.
当主仆机不兼容时,仆机拷贝所有主机来的文件到一个新的索引目录然后要求core加载此新目录中的索引。

HTTP API
这些命令可以通过http的方式调用
得到索引版本. http://host:port/solr/replication?command=indexversion
停止分发: http://slave_host:port/solr/replication?command=abortfetch
对提交的索引数据创建备份,没有提交的索引的话什么都不做: http://master_host:port/solr/replication?command=backup
在仆机上强制fetchindex,这个命令可以使用扩展的属性 例如:'masterUrl'  'compression': http://slave_host:port/solr/replication?command=fetchindex
设置仆机不允许轮询: http://slave_host:port/solr/replication?command=disablepoll
设置仆机允许轮询: http://slave_host:port/solr/replication?command=enablepoll
得到配置和状态的详细信息: http://slave_host:port/solr/replication?command=details
得到指定索引中的lucene文件列表: http://host:port/solr/replication?command=filelist&indexversion=<index-version-number>
设置主机不允许分发: http://master_host:port/solr/replication?command=disablereplication
设置主机允许分发: http://master_host:port/solr/replication?command=enablereplication

 

在我们的具体使用中,不配置轮询,而是在主机做完索引后,使用http api方式通知仆机来取索引。这种方式更灵活,可以控制同时取索引的仆机的数量,避免主机高负载。而且可以通知对fetchindex的仆机,可以先通知nginx停止对它的查询分发,避免仆机高负载。

你可能感兴趣的:(Solr,solr索引分发)