ElasticSearch使用问题及解决方案汇总

ElasticSearch使用问题及解决方案汇总

2015-05-12 16:31:22

云计算 Elasticsearch是一个开源的分布式实时搜索与分析引擎,支持云服务。它是基于Apache Lucene搜索引擎的类库创建的,提供了全文搜索能力、多语言支持、专门的查询语言、支持地理位置服务、基于上下文的搜索建议、自动完成以及搜索片段(snippet)的能力,本文总结了使用 elasticsearch所遇到的各类问题以及相关的解决方案。

[[133936]]

Elasticsearch是一个开源的分布式实时搜索与分析引擎,支持云服务。它是基于Apache Lucene搜索引擎的类库创建的,提供了全文搜索能力、多语言支持、专门的查询语言、支持地理位置服务、基于上下文的搜索建议、自动完成以及搜索片段(snippet)的能力。Elasticsearch支持RESTful的API,可以使用JSON通过HTTP调用它的各种功能,包括搜索、分析与监控。此外,它还为Java、PHP、Perl、Python以及Ruby等各种语言提供了原生的客户端类库。下面是总结了一下使用 elasticsearch所遇到的各类问题以及相关的解决方案。

1、out of memory错误问题

因为默认情况下es对字段数据缓存(Field Data Cache)大小是无限制的,查询时会把字段值放到内存,特别是facet查询,对内存要求非常高,它会把结果都放在内存,然后进行排序等操作,一直使用内存,直到内存用完,当内存不够用时就有可能出现out of memory错误。

解决方法:

(1)设置es的缓存类型为Soft Reference,它的主要特点是据有较强的引用功能。只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收。另外,这些引 用对象还能保证在Java抛出OutOfMemory 异常之前,被设置为null。它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory。在es 的配置文件加上index.cache.field.type: soft即可。

(2)设置es最大缓存数据条数和缓存失效时间,通过设置index.cache.field.max_size: 50000来把缓存field的最大值设置为50000,设置index.cache.field.expire: 10m把过期时间设置成10分钟。

2、抛出异常,错误如下:

  1. 1org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream 

原因:es节点之间的JDK版本不一样

解决方式:统一JDK版本和环境

3、抛出异常,错误如下:

  1. org.elasticsearch.client.transport.NoNodeAvailableException: No node available 

(1)端口错误

client = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));

端口9300写成9200的报错No node available 或者查看连接的是不是本地计算机,如果是远程的话查看一下IP地址是否正确。

(2)jar包报错误的话可能是引用包不匹配,开启的服务是什么版本最好对应相应的jar包。

(3)修改了集群名称,设置了集群名字导致出现问题,设置操作如下:

  1. Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name""yoodb").build();  
  2.             client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300)); 

 (4)集群超过5s没有响应,解决方式如下:

1)设置client.transport.ping_timeout超时时间,增大一些

2)代码内嵌入,如下:

  1. while (true) {  
  2. try {  
  3.     bulk.execute().actionGet(getRetryTimeout());  
  4.     break;  
  5. catch (NoNodeAvailableException cont) {  
  6.     Thread.sleep(5000);  
  7.     continue;  
  8. }  

4、由gc引起节点脱离集群

因为gc时会使jvm停止工作,如果某个节点gc时间过长,master ping3次(zen discovery默认ping失败重试3次)不通后就会把该节点剔除出集群,从而导致索引进行重新分配。解决方法如下:

(1)优化gc,减少gc时间。

(2)调大zen discovery的重试次数(es参数:ping_retries)和超时时间(es参数:ping_timeout)。后来发现根本原因是有个节点的系统所在硬盘满了。导致系统性能下降。

#p#

5、无法创建本地线程问题

es恢复时报错,如下:

  1. RecoverFilesRecoveryException[[index][3] Failed to transfer [215] files with total size of [9.4gb]]; nested: OutOfMemoryError[unable to create new native thread]; ]] 

刚开始以为是文件句柄数限制,但想到之前报的是too many open file这个错误,并且也把数据改大了。查资料得知一个进程的jvm进程的最大线程数为:虚拟内存/(堆栈大小*1024*1024),也就是说虚拟内存越大或堆栈越小,能创建的线程越多。重新设置后还是会报那这错,按理说可创建线程数完全够用了的,就想是不是系统的一些限制。后来在网上找到说是max user processes的问题,这个值默认是1024,这个参数单看名字是用户最大打开的进程数,但看官方说明,就是用户最多可创建线程数,因为一个进程最少有一个线程,所以间接影响到最大进程数。调大这个参数后就没有报这个错了。

解决方法:

(1)增大jvm的heap内存或降低xss堆栈大小(默认的是512K)。

(2)打开/etc/security/limits.d/90-nproc.conf,把soft nproc 1024这行的1024改大就行了。

6、集群状态为黄色时并发插入数据报错,错误如下:

  1.      
  2. [7]: index [index], type [index], id [1569133], message [UnavailableShardsException[[index][1] [4] shardIt, [2] active : Timeout waiting for [1m], request: org.elasticsearch.action.bulk.BulkShardRequest@5989fa07]] 

这是错误信息,当时集群状态为黄色,即副本没有分配。当时副本设置为2,只有一个节点,当你设置的副本大于可分配的机器时,此时如果你插入数据就有可能报上面的错,因为es的写一致性默认是使用quorum,即quorum值必须大于(副本数/2+1),我这里2/2+1=2也就是说要要至少插入到两份索引中,由于只有一个节点,quorum等于1,所以只插入到主索引,副本找不到从而报上面那个错。

解决方法:(1)去掉没分配的副本。(2)把写一致性改成one,即只写入一份索引就行。

7、错误使用api导致集群卡死

其实这个是很低级的错误。功能就是更新一些数据,可能会对一些数据进行删除,但删除时同事使用了deleteByQuery这个接口,通过构造 BoolQuery把要删除数据的id传进去,查出这些数据删除。但问题是BoolQuery最多只支持1024个条件,100个条件都已经很多了,所以这样的查询一下子就把es集群卡死了。

解决方法:用bulkRequest进行批量删除操作。

8、设置jvm锁住内存时启动警告

当设置bootstrap.mlockall: true时,启动es报警告Unknown mlockall error 0,因为linux系统默认能让进程锁住的内存为45k。

解决方法:设置为无限制,linux命令:ulimit -l unlimited

博文出处:http://www.yoodb.com/article/display/246

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/275516.html<

(0)
管理的头像管理
上一篇2025-05-10 05:52
下一篇 2025-05-10 05:53

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注