首页

配置apache solr索引主从复制同步实现索引读写分离并解决遇到“Index fet ch failed..IllegalStateException: getWriter()”等相关问题

标签:solr,搜索,集群,索引,读写分离,主从,双机备份,Master,slave,IllegalStateException     发布时间:2017-05-08   

一、前言

在配置apache solr搜索引擎主/从(master/slave)服务的时候,报出“ Master at: http://xxxxx/xwood-solr/#/subject is not available. Index fetch failed. Exception: Invalid version (expected 2, but 60) or the data in not in'javabin' format”、“ERROR org.apache.solr.servlet.SolrDispatchFilter  – null:java.lang.IllegalStateException: getWriter() has already been called for this response”、“Nested exception:org.xml.sax.SAXParseException; systemId: http://xxxx/solr/subject/select?q=title%3Aiot..; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.”等问题。

二、配置步骤

1. 配置solr版本为4.4.0,如下图所示

配置apache solr索引主从复制同步实现索引读写分离并解决遇到“Index fet ch failed..IllegalStateException: getWriter()”等相关问题

2. 主(写)master节点solr应用配置solrconfig.xml配置参考如下

<?xml version="1.0" encoding="UTF-8" ?>@b@... @b@  <requestHandler name="/replication" class="solr.ReplicationHandler" >@b@   <lst name="master">@b@      <!-- 当有新的索引被提交,标记新的索引和保存新索引的文件名 -->@b@      <str name="replicateAfter">commit</str>@b@      <!-- 当系统启动时,标记新的索引和保存新索引的文件名 -->@b@      <str name="replicateAfter">startup</str>@b@      <!-- 当索引优化时,标记新的索引和保存新索引的文件名,因为 commit,optimize 基本上是同时存在的,所以一般不用设置 optimize-->@b@      <!-- <str name="replicateAfter">optimize</str>-->@b@      <!-- 索引优化后创建一份备份索引,这个在复制过程中不需要设置 -->@b@      <!--<str name="backupAfter">optimize</str>-->@b@      <!-- 索引复制时,也同步从服务器的配置文件 solrconfig_slave.xml:solrconfig.xml 表示复制时,在slave端以solrconfig.xml进行保存,这样slave才能认识这个文件-->@b@      <str name="confFiles">solrconfig_slave.xml:solrconfig.xml,schema.xml,stopwords.txt,elevate.xml</str>@b@      <!-- 设置验证信息 -->@b@      <str name="httpBasicAuthUser">admin</str>@b@      <str name="httpBasicAuthPassword">123456</str>@b@    </lst>@b@</requestHandler>@b@  @b@...

3. 从(读)slave节点solr应用配置solrconfig.xml配置参考如下

<?xml version="1.0" encoding="UTF-8" ?>@b@...@b@ <requestHandler name="/replication" class="solr.ReplicationHandler" >@b@      <lst name="slave">@b@          <!-- 主服务器的URL,core_1是配置了多核,如果不是多核,连接应该是 http://www.abc.com/solr/replication -->@b@          <!-- <str name="masterUrl">http://www.abc.com/solr/core_1/replication</str> -->@b@          <str name="masterUrl">http://www.xwood.net/solr/subject/replication</str>   @b@          <!-- 1分钟同步一次 -->@b@          <str name="pollInterval">00:00:60</str>@b@          <!-- 压缩机制,来传输索引,可选 internal|external,internal表示内网,external表示外网 -->@b@          <str name="compression">internal</str>@b@          <!-- 设置超时时间  -->@b@          <str name="httpConnTimeout">60000</str>@b@          <str name="httpReadTimeout">60000</str>@b@          <!-- 设置验证信息,要和master 服务器配置一样 -->@b@          <str name="httpBasicAuthUser">admin</str>@b@          <str name="httpBasicAuthPassword">123456</str>@b@        </lst>@b@    </requestHandler>@b@  ...

4. 在主节点Master新增一条记录,可以看到在slave服务器可以正常打印如下同步日志,说明配置OK了

510741 [snapPuller-8-thread-1] INFO  org.apache.solr.handler.SnapPuller  – Slav@b@e in sync with master.