ES实战如何规划索引
Posted 顧棟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES实战如何规划索引相关的知识,希望对你有一定的参考价值。
如何去规划一个索引
规划索引包含如何调整索引的主分片数,副本分片数和分片存储大小,以及如何根据数据量的变化进行相关的调整。
索引规划的影响因素包含不仅限于
- 索引存储占用大小
- 索引的TPS
- 索引的QPS
- 索引的总数据量
- 每条记录的平均大小
- 是否是实时查询
- 日增数据量
- 数据生命周期
- 索引的字段数
新建索引
有资料表明集群索引应该满足以下条件
-
单个分片的大小不要超过50GB
-
单个数据节点实例的数据量不要超过5TB,1TB索引数据的FST需要占2GB的内存,5TB就需要占10GB的内存(理解为JVM的配置为30GB),剩余20GB供其他使用,用来控制JVM的GC时间。
为什么JVM的启动和最大内存是30GB,关键字 jvm的指针压缩
FST是什么?关键字 Lucene的字典
在实际使用中发现
- 单个分片大小超过10GB 查询的延迟会出现明显的增大,甚至极可能到达秒级,对延迟时间要求低的,尽量保证单分片在10GB以下。
- 单个分片超过20GB之后,查询会出现明显的延迟效果。并且在索引恢复和迁移的时候,耗时增加了。
- 在20GB-50GB之间的分片数超过一定比例的时候,JVM的GC次数明显增多和耗时变长,会影响整个集群的写入和查询效果。
- 分片超过50GB,会明显加剧GC
一般情况下,单个索引的主分片大小一般以20GB为限。对业务调整频繁的,预估出一年的数据增量。业务调整不频繁的,评估出2年内的数据增量。那么主分片的个数 n = 初 始 化 数 据 大 小 + 一 年 ( 或 者 2 年 内 ) 的 数 据 增 量 大 小 ( G B ) 20 n= \\frac 初始化数据大小+一年(或者2年内)的数据增量大小(GB)20 n=20初始化数据大小+一年(或者2年内)的数据增量大小(GB)。分片副本数在没有特殊情况下,可以直接为1。对于一些查询要求高的场景,可以实现增加副本分片数,来提高查询速度。
当数据量过大导致单个索引的主分片数过多的话,可以考虑使用以下方式进行处理。
- 通过
Index templates
按天,月,年的维度创建索引结合别名来使用。 - 通过
rollover Index
API实现索引的滚动创建,结合别名使用。
如何判断一个索引的分片数过多?
理想情况下,单个索引的主分片数可以按照数据节点个数的1.5~3倍配置。当然,作者也试过在3个数据节点的情况下,单个索引的主分片是50的场景。当一个数据节点上相同索引的分片数过多的时候,在大量写入和查询的时候,会导致I/O过高。目前,单个数据节点的默认最大分片数是1000。
调整索引
每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源,每个索引的分片个数应该在一个相对合理的值。
整个索引的调整
-
reindex
可以通过
reindex api
实现重建索引,在重建索引的时候,可以修改分片的配置。如何使用reindex -
snapshot+restore
可以对源索引进行创建快照,在使用快照恢复的时候,进行索引分片配置的修改。如何使用snapshot+restore
主分片的调整
-
split Index
在6.X版本上新增了主分片分裂的api,但是需要在创建索引的时候配置
number_of_routing_shards
,通过这个参数进行主分片个数的分裂,分配的个数是number_of_routing_shards
的因子。在7.0版之后,会去掉这个参数,使用上有变化。如何使用split Index -
shrink Index
在数据过期删除,新增数据量降低的场景下,导致索引的存储不是很大,分片数过多的时候,可以通过这个api,减少主分片的个数。如何使用shrink Index
副本分片数的调整
正常1就可以了。如果副本数为0,就代表数据可以丢失,且在集群宕机时可以立刻删除重建该索引来快速恢复集群。副本最大个数=数据节点数-1。
PUT /indexName/_settings
"index" :
"number_of_replicas" : 2
删除索引和过期数据
在创建索引的时候,就需要考虑,这个索引以及数据的生命周期。定期的清理过期索引和数据,是集群长久健康运行的必要条件。
以上是关于ES实战如何规划索引的主要内容,如果未能解决你的问题,请参考以下文章