solr的主从复制可以实现像Mysql复制那样,一个服务器负责写服务,其余多个服务器负责读服务,这样可以避免索引并发读写对索引性能的影响,再一个可以构建大规模的搜索系统,用多个服务器来分担系统的读服务。
要实现复制功能,需要一个写索引的服务器和读索引的服务器,分别为Write_A,Read_B
1. Write_A 作为Master,solrconfig.xml 找到<requestHandler name="/replication" ,配置如下
<requestHandler name="/replication" class="solr.ReplicationHandler" > <lst name="master"> <!-- 当有新的索引被提交,标记新的索引和保存新索引的文件名 --> <str name="replicateAfter">commit</str> <!-- 当系统启动时,标记新的索引和保存新索引的文件名 --> <str name="replicateAfter">startup</str> <!-- 当索引优化时,标记新的索引和保存新索引的文件名,因为 commit,optimize 基本上是同时存在的,所以一般不用设置 optimize--> <!-- <str name="replicateAfter">optimize</str>--> <!-- 索引优化后创建一份备份索引,这个在复制过程中不需要设置 --> <!--<str name="backupAfter">optimize</str>--> <!-- 索引复制时,也同步从服务器的配置文件 solrconfig_slave.xml:solrconfig.xml 表示复制时,在slave端以solrconfig.xml进行保存,这样slave才能认识这个文件--> <str name="confFiles">solrconfig_slave.xml:solrconfig.xml,schema.xml,stopwords.txt,elevate.xml</str> <!-- 设置验证信息 --> <str name="httpBasicAuthUser">admin</str> <str name="httpBasicAuthPassword">123456</str> </lst> </requestHandler>
2. Read_B 作为Slave,solrconfig.xml 找到<requestHandler name="/replication" ,配置如下
<requestHandler name="/replication" class="solr.ReplicationHandler" > <lst name="slave"> <!-- 主服务器的URL,core_1是配置了多核,如果不是多核,连接应该是 http://www.abc.com/solr/replication --> <str name="masterUrl">http://www.abc.com/solr/core_1/replication</str> <!-- 1分钟同步一次 --> <str name="pollInterval">00:00:60</str> <!-- 压缩机制,来传输索引,可选 internal|external,internal表示内网,external表示外网 --> <str name="compression">internal</str> <!-- 设置超时时间 --> <str name="httpConnTimeout">5000</str> <str name="httpReadTimeout">10000</str> <!-- 设置验证信息,要和master 服务器配置一样 --> <str name="httpBasicAuthUser">admin</str> <str name="httpBasicAuthPassword">123456</str> </lst> </requestHandler>
3. 复制的简单原理:master 有新索引时会保存索引文件名列表并已时间排序和标记上次复制时文件的位置,
那么这次复制时就从这个位置之后进行复制。(不是太明白,想当然这么理解,如有谁比较熟悉,请留言,不胜感激)
4. 参考URL http://wiki.apache.org/solr/SolrReplication