前言:elasticsearch作为当下开源高效的分布式搜索与分析引擎。基于apache Lucene进行构建。提供了强大了全文检索与类实时数据分析能力。能够对大规模数据集提供快速,准确的搜索结果。elasticsearch在设计之初的目标就是高性能,可伸缩,可靠的分布式搜索引擎。提供了自动的数据复制与故障转移能力。确保数据的可用性与冗余备份。与logstash,beats,Kibana形成了完整的日志与数据分析解决方案(ELK);目前已经被广泛应用于日志存储,电商搜索等业务领域。
一.什么是index(索引)
index(索引)是elasticsearch中最高层次的数据单元,类似于关系型数据库中的表。每个索引都具有自己唯一的名称与_id。并且可以进行不同的参数配置与mapping映射。以适应不同的业务场景。索引中的最小单位是文档。每一条文档(doc)都是一个json格式的数据对象。包含了实际的具体数据以及该数据所对应的元数据。文档可以是结构化,半结构化或非结构化的数据。索引在elasticsearch中被用于存储,检索鱼分析数据。通过对索引进行搜索与聚合操作可以快速的找到相关的文档,并进行后续的数据分析并在Kibana中进行可视化。
elasticsearch对索引提供了完善的RESTful API以及各个开发语言的API。来帮助使用者完成索引的创建,更新,删除等操作。
二.什么是shard
shard(分片)是索引中更细粒度的数据单元。将索引中的数据分割成了更小,更便于管理的部分。分片分为:primary shard(主分片)和replicate shard(副本分片)。
在我们创建索引时,可以指定索引分片的数量。每个分片都是互相独立的。包含一部分索引的数据与索引的结构(segement)。每个分片都可以在集群中不同的节点上进行移动与复制。以提高数据的可用性与容错性。
在单elasticsearch集群中,数据的高可用往往依赖对索引配置副本来实现。每个索引都可以配置副本数。在配置索引副本数之后,索引中的每一个主分片都会复制出相应的副本分片,来分布在不同的集群节点中。
分片在索引中具备以下能力:
- 横向扩展:通过合理的规划索引分片数量,将索引中的数据分布在各个分片中,在通过分片的分布,将数据分布在多个节点上。从而实现横向扩展。通过将数据分散在多个分片上,可以分散业务请求压力。提高索引的吞吐量和处理能力。
- 并行处理:每个分片都可以独立承担索引与搜索操作。从而实现并行处理。在查询场景下对索引配置多副本能够有效提高查询效率。
- 容错性:在为索引配置副本分片后,当某个节点发生故障时,如果某个主分片发生损坏,则该主分片对应的副本分片会自动晋升为主分片,可以从其他节点的副本分片中恢复数据。通过这种机制可以提高数据的容错性与可用性。
- 负载均衡:分片分布在集群中的多个节点上。能够有效的分散业务请求的压力,提高集群整体负载均衡的能力。
三.如何规划索引
在规划索引之前,我们首先要了解所规划索引的业务场景。
读场景
索引单分片20g~40g,尽量减少分片数,可以降低热点,因为当分片数过多时,就容易出现长尾子请求,即有可能部分子请求因节点异常或 Old GC、网络抖动等延迟响应,导致整个请求响应缓慢。另一方面,拆分过多的子请求无法提升数据节点请求吞吐,不能充分利用 CPU。在尽量减少主分片数的情况下,同时也可以适当增加副本数,从而提升查询吞吐;
写场景
索引单分片10g~20g,小分片更有利于数据写入。小分片维护的segment数量远低于大分片,在数据刷新落盘与段合并上更有优势。由于单分片数据量更少,在写入时数据可以更快地缓存至内存中并通过refresh参数更快的持久化至磁盘中。
日志存储场景
- 需要考虑每日写入集群的数据总量大小。通过过数据量与数据节点数评估索引分片数量。
- 在日志存储后是否需要兼顾查询与聚合性能。合理大小的分片数据量能够提高查询效率。
- 根据日志持久化策略,采用按月/周/天的策略生成索引。并使用ILM(索引生命周期管理策略)动态对日志索引进行完整生命周期的管理。
小数据量索引业务场景
对于数据量比较小的索引,增加索引分片数并不一定会带来性能提升,反而可能会带来一些负面影响。
首先,增加索引分片数会增加集群的管理开销,包括维护分片的状态、备份和恢复分片等。如果索引数据量比较小,这种开销可能会超过性能提升带来的收益。
其次,增加索引分片数可能会导致数据分布不均衡,从而影响查询性能。具体来说,如果某些分片中的数据量过小,可能会导致这些分片的查询性能比其他分片差。此外,如果查询涉及到多个分片,数据的合并操作也会增加查询时间。
因此,对于数据量比较小的索引,在查询场景下,通常建议将分片数设置为1或2,以避免不必要的开销和性能问题。如果需要提高查询性能,可以考虑配置索引副本,优化查询语句或使用缓存。
在所有场景下都建议遵循分片数与数据节点数保持倍数关系。使分片尽量平均分布在各个节点,避免出现负载不均或者由于分片设计引起的集群热点问题。
四.索引与资源消耗的关系
- 分片数量:Elasticsearch中的每个分片都是一个独立的Lucene索引。分片数量的增加会导致内存使用量的增加,因为每个分片都需要一定的内存来维护索引结构和缓存数据。如果分片数量过多,可能会导致内存不足,进而影响性能。
- Segment数量:Elasticsearch中的每个分片都由多个segment组成。Segment是Lucene索引的基本组成部分,用于存储和索引文档。Segment数量的增加会导致内存使用量的增加,因为每个segment都需要一定的内存来维护索引结构和缓存数据。如果segment数量过多,可能会导致内存不足,进而影响性能。
整体来看,适当的分片数量和segment数量可以提高Elasticsearch的查询性能和可靠性。但是,如果分片数量和segment数量过多,会导致内存消耗过大,从而影响性能。因此,在实际使用中,需要根据具体的场景和硬件条件进行调整。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!