ElasticSearch 使用过程中遇到的一些性能问题及解决方案

699 阅读2分钟

最近工作中把一份很重要的数据,由mysql迁移到了ElasticSearch 中,由于对es的深度使用不太熟悉,遇到了各种各样的问题,记录下来跟大家一起分享下,共同成长。

1、分片数设置过少导致压力分布不均,大量请求被拒绝

2、索引过多,导致查询结果中大量分片返回失败

3、通过字符串聚合(例如,e379rhdfh93ynn),由于这种字符串区分度较低,没有规律,集群中出现大量并发的这种聚合语句时,整个集群被拖垮,性能十分低下,平时几百毫秒的请求,也要10s左右,还有导致查询请求中,大量分片返回失败,同时也会影响写入的性能。(至于es对这种无序且复杂的字符串聚合,为什么会如此慢,我还在研究...已经研究出来了,慢的原因不是因为是复杂的字符串,主要是因为这个字符串的基数太大了,具体原因,参考博客juejin.cn/editor/draf…

4、需要根据实际请求,设置es的写请求限流和读请求限流,刚开始不知道有限流,导致写入和查询请求大量报错。

5、使用分区索引的时候,如果分区字段可能涉及到未来或者过去的时间,需要特别设置下,默认情况下,可能不会创建未来时间的索引,导致分区字段是未来或过去时间的数据无法保存。

6、es采用线程池的方式处理查询请求,当请求量超过等待队列的时候,多余的请求将会被拒绝,可以通过控制并发量和优化请求处理时间来避免这个问题。

7、另外读请求的时候,当集群分片压力较大的时候,可能会出现部分分片查询失败,但是整个请求查询是正常返回的,由于缺少部分分片的信息,返回的结果可能是错误的。如果你没有注意到返回结果里面的失败分片数,会误以为该请求被成功处理。

8、es不支持事务,是写请求出现冲突的时候,会返回失败。需要进行重试,或者其他处理。(可以在应用里面es实例的时候显示指定重试次数)