Solr 1.4 以后,可以使用基于 http 的同步方式。之前基于 ssh/rsync 的同步方式已经停止维护。还有一种基于 SolrCloud 的方式:https://cwiki.apache.org/confluence/display/solr/SolrCloud
这里只介绍 ReplicationHandler 基于 http 的方式。
官方文档: http://wiki.apache.org/solr/SolrReplication
主从结构的配置和其它的 RequestHandler 一样。
编辑 solrconfig.xml
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="replicateAfter">startupstr>
<str name="replicateAfter">commitstr>
<str name="confFiles">schema.xml,stopwords.txt,elevate.xmlstr>
<str name="commitReserveDuration">00:00:10str>
lst>
<str name="maxNumberOfBackups">1str>
requestHandler>
在 Master 的配置文件中有一个 confFiles 项,可以进行文件的同步。这里可以按如下方式使用:
"confFiles"
>solrconfig_slave.xml:solrconfig.xml,x.xml,y.xml
这样,Master 上面的 solrconfig_slave.xml 会被保存为 Slave 机器上的 solrconfig.xml, 其它文件:x.xml, y.xml 保持自己原文件名不变。
因为 confFiles 可以通过 “:” 进行分隔,冒号前面是 Master 上的文件, 即复制的源文件,冒号后面的是复制到 Slave 后的文件。
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<str name="masterUrl">http://60.124.214.234:8983/solr/mainstr>
<str name="pollInterval">00:00:20str>
<str name="compression">internalstr>
<str name="httpConnTimeout">5000str>
<str name="httpReadTimeout">10000str>
<str name="httpBasicAuthUser">usernamestr>
<str name="httpBasicAuthPassword">passwordstr>
lst>
requestHandler>
如果当前的 Master 使用了 cores, Slave 配置的 url 必须加上 corename, 判断的标准就是:上面的 url 在浏览器中访问要是正常的。
一个 Master 可以对应多个 Slave, 但如果太多的时候,各个 Slave 同时同步 Master 会造成压力过大,而且 Master 带宽的压力也会增大。所以为了保证整个集群的使用, 可以使用 “中继服务器”,就是把其中一台或多台 Slave 做为其它 Slave 的 Master。和 MySQL 集群的里的原理一样。
<requestHandler name="/replication" class="solr.ReplicationHandler">
<lst name="master">
<str name="replicateAfter">commitstr>
<str name="confFiles">schema.xml,stopwords.txt,synonyms.txtstr>
lst>
<lst name="slave">
<str name="masterUrl">http://60.124.214.234:8983/solr/mainstr>
<str name="pollInterval">00:00:60str>
lst>
requestHandler>
如果要把一个 Slave 转换成 Master。或者想在 Master 和 Slave 上使用同一个配置文件,然后可方便的配置成某个角色,可以如下:
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="master">
<str name="enable">${enable.master:false}str>
<str name="replicateAfter">commitstr>
<str name="confFiles">schema.xml,stopwords.txtstr>
lst>
<lst name="slave">
<str name="enable">${enable.slave:false}str>
<str name="masterUrl">http://master_host:8983/solrstr>
<str name="pollInterval">00:00:60str>
lst>
requestHandler>
Master:
#solrcore.properties in master
enable.master=true
enable.slave=false
Slave:
#solrcore.properties in slave
enable.master=false
enable.slave=true
一个 Master 可以有多个 core, 就类似一个 MySQL 服务器可以有多个库一样。
上面的主从配置中已经介绍了 Slave 配置中要写上 Master 的地址,如果是多核心,要写具体的核心名称。也就是说,一个 replication 的 requestHandler 只能同步一个核心。
另外,上面的配置中是在 Slave 的 solrconfig.xml 中写死了 Master 的 url, 其实这个值也可以写在外部文件中,类似上面的启动/禁用:
<requestHandler name="/replication" class="solr.ReplicationHandler" >
<lst name="slave">
<str name="masterUrl">http://${MASTER_CORE_URL}/${solr.core.name}str>
<str name="pollInterval">${POLL_TIME}str>
lst>
requestHandler>
变量 ${MASTER_CORE_URL} 和 ${solr.core.name} 在外部的 corename.properties 文件中定义。
由于上面配置的是 requestHandler, 所以也可以和其它的 requestHandler 一样,通过 url 去请求,如:
http://113.216.115.7:8983/solr/replication
返回结果可能如下:
<response>
<lst name="responseHeader">
<int name="status">0int>
<int name="QTime">0int>
lst>
<str name="status">OKstr>
<str name="message">No commandstr>
response>