ES 实战索引大分片治理

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES 实战索引大分片治理相关的知识,希望对你有一定的参考价值。

大分片治理思路

大分片的危害

  • 过度占用服务器资源,降低集群服务能力
  • 加剧JVM的GC,导致查询,写入变慢
  • 在进行索引恢复,数据均衡时,更耗时
  • 集群故障恢复变慢
  • 集群稳定性变差
  • ···

如何处理大分片

寻找大分片

执行以下命令,将单个索引大小超过30G的,全部copy出来,从大到小,从易到难进行处理。

 GET _cat/shards?v&s=store:desc

分析大分片的索引

针对不同的场景采用不同的处理方式

1、直接删除索引

  • 使用索引的系统已经下线 没有对索引进行写入和查询了。
  • 是采用索引模板创建定期创建的索引,且该索引的数据已经过期了。

2、删除索引重建索引

  • 索引的数据不重要,但是不确定是否有系统还在使用,可以按原来的配置重建索引。
  • 索引的数据不重要或者可以补数据,但是数据量实在太大,无法通过条件删除(delete_by_query)快速处理,可以估算一下单个索引增加主分片数可以解决,修改主分片数据重建索引,进行补数据。并创建数据定期删除计划。

3、删除索引数据

  • 索引中只需要一定范围内的数据,其他数据可以进行删除的,进行条件删除,并创建数据定期删除计划。

4、拆分索引

  • 不再向索引写入数据,只存在读取的情况,直接将索引拆分成多个索引,利用别名进行查询。
  • 索引的数据每天都在增加,按数据量的大小,修改成通过索引模板,按年 月 日的维度进行创建索引使用。并创建索引定期删除计划。

处理方式的具体实现

1、删除索引

DELETE indexName1,indexName

2、删除索引数据

POST twitter/_delete_by_query

  "query":  
    ···
  

3、拆分索引

在ES服务化平台进行索引创建和索引模板创建的申请

索引主分片数的计算

一般情况下,单个索引的主分片大小一般以20GB为限。对业务调整频繁的,预估出一年的数据增量。业务调整不频繁的,评估出2年内的数据增量。那么主分片的个数 n = ( 初 始 化 数 据 大 小 + 一 年 ( 或 者 2 年 内 ) 的 数 据 增 量 大 小 ) ( G B ) ∗ 数 据 膨 胀 比 20 n= \\frac (初始化数据大小+一年(或者2年内)的数据增量大小)(GB)*数据膨胀比20 n=20(+2)(GB)。分片副本数在没有特殊情况下,可以直接为1。对于一些查询要求高的场景,可以实现增加副本分片数,来提高查询速度。

数据膨胀比指的是源数据在存入ES时,会被以下因素影响,导致存储放大

  • 是否开启_all
  • 是否_source
  • 不同的分词器,效果不一样
  • 字段数

数据膨比不是固定的值,可以通过部分数据的抽样插入临时的ES索引计算出来。一般不需要进行全文检索,可以不开_all,只对少部分的字段进行分词和建索引,加上压缩的特性,膨胀比接近1。

详细见索引规划

以上是关于ES 实战索引大分片治理的主要内容,如果未能解决你的问题,请参考以下文章

es实战-分片分配失败解决方案

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

ES实战reindex API的使用

ES实战分片无法分配

ES实战如何规划索引

ES 实战Shrink Index使用说明