ES索引设计

Posted

tags:

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

参考技术A

一个index可以被分为多个shards,从而分布到不同的物理机上。Shard的划分结果也会影响索引和查询速度。
每个分片都可以处理数据写入和查询请求,在设置索引分片数时,可从以下几个方面考虑:

一个shard就是一个lucene分片,ES底层基于lucene实现。
通常根据集群中的节点数量,对集群中的Shards数进行合理限制。

分片的大小和数量怎么设定?
注1: 小的分片会造成小的分段,从而会增加开销。我们的目的是将平均分片大小控制在几 GB 到几十 GB 之间。对于基于时间的数据的使用场景来说,通常将分片大小控制在 20GB 到 40GB 之间。

注2: 由于每个分片的开销取决于分段的数量和大小,因此通过 forcemerge 操作强制将较小的分段合并为较大的分段,这样可以减少开销并提高查询性能。 理想情况下,一旦不再向索引写入数据,就应该这样做。 请注意,这是一项比较耗费性能和开销的操作,因此应该在非高峰时段执行。

注3: 我们可以在节点上保留的分片数量与可用的堆内存成正比,但 Elasticsearch 没有强制的固定限制。 一个好的经验法则是确保每个节点的分片数量低于每GB堆内存配置20到25个分片。 因此,具有30GB堆内存的节点应该具有最多600-750个分片,但是低于该限制可以使其保持更好。 这通常有助于集群保持健康。

注4: 如果担心数据的快速增长, 建议根据这条限制: ElasticSearch推荐的最大JVM堆空间是 30~32G, 把分片最大容量限制为 30GB, 然后再对分片数量做合理估算。例如, 如果的数据能达到 200GB, 则最多分配7到8个分片。

索引和shard数并不是越多越好,对于批量读写都会有性能下降,所以要综合考虑性能和容量规划,同时配合压力测试,不存在真正的最优解。

索引的⽣命周期有五个阶段:

ES中open状态的索引都会占用堆内存来存储倒排索引,过多的索引会导致集群整体内存使用率多大,甚至引起内存溢出。所以需要根据自身业务管理历史数据的生命周期,如近3个月的数据open用于快速查询;过去3-6月的数据索引close以释放内存,需要时再开启;超过6个月的可以删除索引。

可以使用索引模板的方式按照一定时间创建新的索引,例如按天创建索引,索引的命名可能是index-yyyy-mm-dd,每天生成不同的索引,清除历史数据时可直接关闭或删除。

以上是关于ES索引设计的主要内容,如果未能解决你的问题,请参考以下文章

ES---多索引设计(思路)

ElasticSearch 索引设计指南

6000+字讲透ElasticSearch 索引设计

四、ES基于索引的基本操作

谷粒商城笔记+踩坑——上架商品spu到ES索引库

ES中的索引生命周期管理