solr的主从其实是他的replication集群,从本质上说是通过ReplicationHandler来实现的,除了solr server之间可以互相同步之外,每个solr实例内部的core之间也是可以实现同步的,而能自身同步自身的实例称为Repeater,它的存在是为了分担master的同步开销,即由它来同步master里需要向外同步的core,然后所有的slave都从Repeater处同步相应的core。
具体配置方面,master(主库)的solrconfig.xml里的requestHandler配置为:
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<!--在 'optimize(合并索引)'后进行同步,其他可选的值还有'commit', 'startup',该值可以填多个-->
<str name="replicateAfter">optimize</str>
<!--在 'optimize(合并索引)'后备份索引,其他可选的值还有'commit', 'startup',该值可以填多个-->
<!-- <str name="backupAfter">optimize</str> -->
<!--指定备份多少份文件,默认值为 MAX_VALUE-->
<!-- <int name="numberToKeep">2</int> -->
<!--指定需要同步的配置文件,多份文件以逗号分隔 -->
<str name="confFiles">schema.xml,stopwords.txt,elevate.xml</str>
<!--The default value of reservation is 10 secs. Normally , you should not need
to specify this -->
<str name="commitReserveDuration">00:00:10</str>
</lst>
</requestHandler>
confFiles里可以指定在同步过程中,slave需要一并同步过去的文件。slave端 solrconfig.xml里的配置为:
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<!--主索引的url,该从索引将从这个主索引地址同步索引-->
<str name="masterUrl">http://remote_host:port/solr/corename/replication</str>;
<!--拉取间隔,达到这个时间,从索引将从主索引同步索引.格式为 is HH:mm:ss . 如果该设置为空从索引将不会主动从主索引同步索引.
另外拉取索引的请求也可以通过 admin 页面或者 http api 来触发 -->
<str name="pollInterval">00:00:20</str>
<!-- 以下参数不常用,非必填参数-->
<!--在索引传输过程中使用压缩,可选的值有两个 internal 和 external
如果值是 'external' 请确保主索引的solr已经设置了accept-encoding header。
如果值是 'internal' 索引数据将被自动压缩?,这个主要在低带宽情况下使用,局域网中请不要使用,局域网中使用会降低复制效率-->
<str name="compression">internal</str>
<!-以下是配置连接和读取超时时间,这个跟 http 中的概念一样,单位为毫秒-->
<str name="httpConnTimeout">5000</str>
<str name="httpReadTimeout">10000</str>
<!-- 如果主服务中的 http base 的鉴权可用的话,从服务就需要配置这个用户名和密码 -->
<str name="httpBasicAuthUser">username</str>
<str name="httpBasicAuthPassword">password</str>
</lst>
</requestHandler>