`
dongliboyqq
  • 浏览: 11706 次
文章分类
社区版块
存档分类
最新评论

Solr优化之路之Recovering

阅读更多
一、Solr的Recovering问题解决
经常碰到solr的recovering的问题,经过检查大部分的recovering的情况在lead的error日志中都会出现如下错误日志。
错误1:[ERROR] 16:46:20.617 [http-nio-8088-exec-620] o.a.s.u.p.DistributedUpdateProcessor [DistributedUpdateProcessor.java:896] Setting up to try to start recovery on replica http://10.201.32.56:8088/search-service/product/
java.net.SocketException: Connection reset

错误2:[ERROR] 06:10:31.351 [http-nio-8088-exec-573] o.a.s.u.p.DistributedUpdateProcessor [DistributedUpdateProcessor.java:896] Setting up to try to start recovery on replica http://10.201.32.39:8088/search-service/product/
java.net.SocketException: Broken pipe

错误3:[ERROR] 16:37:00.167 [http-nio-8088-exec-581] o.a.s.u.p.DistributedUpdateProcessor [DistributedUpdateProcessor.java:896] Setting up to try to start recovery on replica http://10.201.32.82:8088/search-service/product/
org.apache.http.NoHttpResponseException: 10.201.32.82:8088 failed to respond

以上错误解释如下:
Caused by: java.net.SocketException: Broken pipe
是网络不稳定,一个请求连接两次,导致出现问题,这种情况比较少,不影响整体的性能~检查网络原因,原因是往一个socket写一个序列化对象写了2次,因为网络不稳定,所以有断开重新连接的机制,但是由于两太机器通过服务代理的方式传输,所以server无法发现客户端退出,这样造成客户端列表里有一个机器一个端口的两个socket对象,这样往socket里写的时候就造成一个对象写两次的现象
java.net.SocketException: Connection reset
如果此时服务器端正在Socket套接字的流中读数据,客户端中断,服务器端则会提示“Connection reset”。比较常见的错误“Connection reset by peer”,该错误和“Connection reset”是有区别的:服务器返回了“RST”时,如果此时客户端正在从Socket套接字的输出流中读数据则会提示Connection reset”;服务器返回了“RST”时,如果此时客户端正在往Socket套接字的输入流中写数据则会提示“Connection reset by peer”。


主要是由于httpClient用到了keepalive,连接池管理,当服务器端的超时时间小于连接池的超时时间,那么在临界时间上客户端连接池拿到一个可用连接王服务器端进行读取或写入数据时,这时候服务器端连接超时关闭链接,导致请求报错。
优化思路是,设置客户端连接池的超时时间小于服务器端的连接超时时间。

二、Solr连接池相关参数配置
通过配置solr.xml来实现httpclient连接池部分。
初始化solr中的httpclient参考SolrDispatchFilter.java 和 UpdateShardHandler.java。

solr.xml配置中关于httpclient的连接池配置参数说明:
(1)
//设置整个连接池最大连接数 根据自己的场景决定
//是路由的默认最大连接(该值默认为2),限制数量实际使用DefaultMaxPerRoute并非MaxTotal。
private final int maxUpdateConnections;
public static final int DEFAULT_MAXUPDATECONNECTIONS = 100000;
conMgr.setMaxTotal(maxUpdateConnections;);

(2)
// DefaultMaxPerRoute是根据连接到一台主机的最大数
private final int maxUpdateConnectionsPerHost;
public static final int DEFAULT_MAXUPDATECONNECTIONSPERHOST = 100000;
conMgr.setDefaultMaxPerRoute(maxUpdateConnectionsPerHost);

此处解释下MaxtTotal和DefaultMaxPerRoute的区别:
1、MaxtTotal是整个池子的大小;
2、DefaultMaxPerRoute是根据连接到的主机对MaxTotal的一个细分;比如:
MaxtTotal=400 DefaultMaxPerRoute=200
而我只连接到http://sishuok.com时,到这个主机的并发最多只有200;而不是400;
而我连接到http://sishuok.com 和 http://qq.com时,到每个主机的并发最多只有200;即加起来是400(但不能超过400);所以起作用的设置是DefaultMaxPerRoute。

(3)
//ConnectTimeout:响应超时时间,超过此时间不再读取响应;
private final int distributedSocketTimeout;
public static final int DEFAULT_DISTRIBUPDATESOTIMEOUT = 600000;
clientParams.set(HttpClientUtil.PROP_SO_TIMEOUT,cfg.getDistributedSocketTimeout());

(4)
//SocketTimeout:链接建立的超时时间;
private final int distributedConnectionTimeout;
public static final int DEFAULT_DISTRIBUPDATECONNTIMEOUT = 60000;
clientParams.set(HttpClientUtil.PROP_CONNECTION_TIMEOUT,cfg.getDistributedConnectionTimeout());
 
(5)
//轮询休眠时间
private final int updateConnectionsEvictorSleepDelay;
public static final int DEFAULT_UPDATECONNECTIONSEVICTORSLEEPDELAY = 5000;

(6)
//connection的最大保持时间
private final int maxUpdateConnectionIdleTime;
public static final int DEFAULT_MAXUPDATECONNECTIONIDLETIME = 40000;

(7)其它
ConnectionRequestTimeout: http clilent中从connetcion pool中获得一个connection的超时时间;
//retry 0次
DefaultHttpMethodRetryHandler retryHandler = new DefaultHttpMethodRetryHandler(0, false); 
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,retryHandler);
 
//retry 默认是3次
clientParams.set(HttpClientUtil.PROP_USE_RETRY, true);

(8)附录:创建一个httpclient的例子。
public static CloseableHttpClient getHttpClient() {
        PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();
        int maxUpdateConnections = 300;
        int maxUpdateConnectionsPerHost=100;
        manager.setMaxTotal(maxUpdateConnections);
        manager.setDefaultMaxPerRoute(maxUpdateConnectionsPerHost);

        int distributedSocketTimeout = 600000;
        int distributedConnectionTimeout = 30000;
        RequestConfig.Builder requestBuilder = RequestConfig.custom();
        requestBuilder.setSocketTimeout(distributedSocketTimeout);
        requestBuilder.setConnectTimeout(distributedConnectionTimeout);
        requestBuilder.setConnectionRequestTimeout(300000);

        HttpClientBuilder builder = HttpClientBuilder.create();
        builder.setDefaultRequestConfig(requestBuilder.build());
        builder.setConnectionManager(manager);

        long updateConnectionsEvictorSleepDelay = 5000;
        long maxUpdateConnectionIdleTime = 40000;
        UpdateShardHandler.IdleConnectionsEvictor idleConnectionsEvictor = new UpdateShardHandler.IdleConnectionsEvictor((ClientConnectionManager)manager,updateConnectionsEvictorSleepDelay, TimeUnit.MILLISECONDS, maxUpdateConnectionIdleTime, TimeUnit.MILLISECONDS);
        idleConnectionsEvictor.start();

        CloseableHttpClient client = builder.build();
        return client;
    }
分享到:
评论

相关推荐

    solr的优化实例1

    - **JVM配置**:Solr运行于Java虚拟机(JVM)之上,合理的JVM配置对提高性能至关重要。例如,设置合理的堆内存大小(`-Xms` 和 `-Xmx` 参数)以确保有足够的内存用于索引和缓存,避免频繁的垃圾回收。 - **HTTP缓存**...

    solr_solr_

    在Solr中,Schema是核心组件之一,它定义了文档的结构和处理方式。`manageschema`功能允许用户通过Web界面动态地修改Schema,而无需直接编辑XML文件,简化了管理和维护过程。在这个"增加了分词器后的配置文件"中,...

    Apache Solr(solr-8.11.1.zip)

    8. **搜索性能优化**:Solr提供了多种优化手段,包括使用倒排索引、缓存策略、查询优化器等,以提高查询速度和整体性能。 9. **安全与认证**:Solr 8.x引入了内置的安全性框架,包括Zookeeper的ACL和Solr的Role-...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第03讲 solr5之Solrconfig共11页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第02讲 solr5之Schema 共10页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    Apache Solr(solr-8.11.1.tgz)

    - **性能优化**:Solr团队不断努力提升查询速度和索引效率,8.11.1版本可能包含了一些新的性能优化。 - **新功能**:可能引入了新的搜索特性,比如新的查询语法、更强大的分析器或者对最新技术标准的支持。 - **稳定...

    solr(solr-9.0.0.tgz)

    Solr-9.0.0是该软件的最新版本,此版本可能包含了一些新的特性和改进,比如性能优化、新的查询语法、更强大的分析器等。 在Solr-9.0.0的压缩包中,通常会包含以下组件: 1. **bin** 文件夹:这个目录下有启动和...

    solr-6.2.0源码

    Solr是Apache软件基金会开发的一款开源全文搜索引擎,它基于Java平台,是Lucene的一个扩展,提供了更为方便和强大的搜索功能。在Solr 6.2.0版本中,这个强大的分布式搜索引擎引入了许多新特性和改进,使其在处理大...

    solr(solr-9.0.0-src.tgz)源码

    通过深入研究`solr-9.0.0-src.tgz`源码,开发者可以理解Solr的工作原理,定制自己的搜索解决方案,解决特定场景下的性能挑战,并为社区贡献新的功能和优化。同时,这也为学习和研究信息检索、全文搜索、分布式计算等...

    solr4.7服务搭建

    ### Solr 4.7 服务搭建详细指南 #### 一、环境准备 为了搭建 Solr 4.7 服务,我们需要确保以下环境已经准备好: 1. **Java Development Kit (JDK) 1.7**:Solr 需要 Java 运行环境支持,这里我们选择 JDK 1.7 ...

    linux+tomcat+mysql+solr调优

    虽然给定的部分内容中没有提及具体的Solr调优方法,但在实际应用中,Solr的性能优化可以从以下几个方面着手: 1. **索引结构优化**:合理设计索引结构,包括字段类型、分词器的选择等。 2. **查询优化**:使用高效...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第17讲 solr之Group 共7页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第16讲 solr之FacetPivot 共6页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第15讲 solr之Facet 共7页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第19讲 solr之MoreLikeThis共10页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    solr 架设开发优化3

    ### Solr性能优化关键知识点详解 #### 一、理解Solr环境与版本 - **环境配置**:在本文档中,我们关注的是基于Tomcat 6的Solr 3.5版本的部署与优化,这对于初学者来说是一个非常实用且稳定的组合。 - **Solr简介...

    solr资料以及问题汇总

    "solr性能调优.mht"文件专门针对Solr的性能优化,包括索引优化、硬件配置、查询策略调整等方面,对于追求高效稳定运行的Solr系统来说,这部分内容是必不可少的。 这些文档和资料覆盖了Solr的多个方面,包括入门、...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第18讲 solr之高亮显示 共7页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第20讲 solr之dataimport 共8页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

Global site tag (gtag.js) - Google Analytics