q666123 发表于 2016-12-16 11:07:08

solr一次性重建所有内容的索引引发的问题及优化方案

  一、设定应用布署环境为Nginx+Tomcat
  二、问题集:
  1、Nginx下504 Timeout出错或Length出错
  2、Nginx下502 Conntect Refused出错及solr使用域名时的安全问题
  3、Java Heap Out of Memory出错
  三、问题详细分析
  1、由于请求时间太长,导致请求时间过期;在Nginx的缓存设置太小,导致Length出错
  2、solr使用域名后,需要加上安全控制配置,这时需要确保当前的布署应用的ip是被允许访问solr的,否则会出现502错误。
  3、由于一次性取出内容的数据列表对象太大,导致内存溢出。
  四、问题的解决
  1、nginx配置片短
  server{
  listen 80;
  server_name sou.caidao8.com;//配置成域名访问 说明1
  location / {
  //ip限制 说明1
  deny 192.168.1.1;
  allow 192.168.90.0/24;你允许的内部外段
  allow ip;你指定的ip;
  deny all;
  proxy_pass http://192.168.90.24:8080;
  proxy_buffering off;//此处解决Length问题 说明2
  proxy_set_header        Host            $host;
  index index.html;
  client_max_body_size    1024m;
  #client_body_buffer_size 128k;
  //以下解决超时问题   说明3
  proxy_connect_timeout   6000;
  proxy_send_timeout      6000;
  proxy_read_timeout      6000;
  }
  }
  当然相关的应用调用sou.caidao8.com时,也要做相关的timeout配置    说明3
  2、tomcat connector配置片段
  <Connector executor="tomcatThreadPool"
  port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
  maxHttpHeaderSize="8192"
  maxThreads="5000" minSpareThreads="1000"
  enableLookups="false" redirectPort="8443" acceptCount="3500"
  connectionTimeout="600000" 说明3 disableUploadTimeout="true"   compression="on" compressionMinSize="2048"
  compressableMimeType="text/html,text/xml,application/x-javascript,text/javascript,text/css,text/plain"
  />
  3、为防止内存溢出,需指定jvm以下参数较大值,比如 -Xms1024m -Xmx1024m  说明4
  说明1:solr支持分布式布署,使用域名调用更加灵活和便于分布式的实现。另外solr提供后台管理,若应用布署在远程机房,如果不使用域名,造成无法访问solr服务。由此还是有必要提供域名,但是这给solr的安全带来隐患,因此需要过虑和限制ip,比如我们这里只允许远程机房内部网段和公司的ip可访问solr域名。这样就达到了solr服务的安全性,又方便于以后分布式扩展及工作环境下访问solr的后台管理。
  说明2:由于内容较大,需设置proxy_buffering off;
  说明3:由于solr服务及其他调用solr服务的应用是在一个请求链上,因此相关的请求时间都需要设大。看上面的说明3标志,至少有三个地方需要相关的timeout设置
  五、应用优化 
  以上方法,虽然一时避免问题的出现,但如果数据量再次扩大,可能还是没有根本解决问题。需要从进一步优化应用。优化办法
  1、尽可能使用增量重建索引,由于增量索引数据量小,可避免以上所有问题。
  2、即使全文索引重建索引无法避免,必须按业务分段增量重建,比如每次取2000条记录,不要形成java大对象,这样也可避免以上所有问题。
  六、在解决问题的过程中,一度尝试使用nginx HttpChunkinModule来解决问题,低版本的nginx需要安装 HttpChunkinModule,因此直接升级nginx到1.4.1版本,但此时设置chunkin on;重起nginx无法生效;
           最终在http://serverfault.com/questions/159313/enabling-nginx-chunked-transfer-encoding/187573#187573找到了解决问题的关键"proxy_buffering off;"//此处解决Length问题,也就没有必要进一步去研究HttpChunkinModule。
           进一步了解在HttpChunkinModule http://wiki.nginx.org/HttpChunkinModule
          
页: [1]
查看完整版本: solr一次性重建所有内容的索引引发的问题及优化方案