前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何优雅的规划elasticsearch的索引(index)

如何优雅的规划elasticsearch的索引(index)

原创
作者头像
空洞的盒子
修改2023-11-09 15:13:02
1.1K3
修改2023-11-09 15:13:02
举报
文章被收录于专栏:JD的专栏

前言: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集群中,数据的高可用往往依赖对索引配置副本来实现。每个索引都可以配置副本数。在配置索引副本数之后,索引中的每一个主分片都会复制出相应的副本分片,来分布在不同的集群节点中。

分片在索引中具备以下能力:

  1. 横向扩展:通过合理的规划索引分片数量,将索引中的数据分布在各个分片中,在通过分片的分布,将数据分布在多个节点上。从而实现横向扩展。通过将数据分散在多个分片上,可以分散业务请求压力。提高索引的吞吐量和处理能力。
  2. 并行处理:每个分片都可以独立承担索引与搜索操作。从而实现并行处理。在查询场景下对索引配置多副本能够有效提高查询效率。
  3. 容错性:在为索引配置副本分片后,当某个节点发生故障时,如果某个主分片发生损坏,则该主分片对应的副本分片会自动晋升为主分片,可以从其他节点的副本分片中恢复数据。通过这种机制可以提高数据的容错性与可用性。
  4. 负载均衡:分片分布在集群中的多个节点上。能够有效的分散业务请求的压力,提高集群整体负载均衡的能力。

三.如何规划索引

在规划索引之前,我们首先要了解所规划索引的业务场景。

读场景

索引单分片20g~40g,尽量减少分片数,可以降低热点,因为当分片数过多时,就容易出现长尾子请求,即有可能部分子请求因节点异常或 Old GC、网络抖动等延迟响应,导致整个请求响应缓慢。另一方面,拆分过多的子请求无法提升数据节点请求吞吐,不能充分利用 CPU。在尽量减少主分片数的情况下,同时也可以适当增加副本数,从而提升查询吞吐;

写场景

索引单分片10g~20g,小分片更有利于数据写入。小分片维护的segment数量远低于大分片,在数据刷新落盘与段合并上更有优势。由于单分片数据量更少,在写入时数据可以更快地缓存至内存中并通过refresh参数更快的持久化至磁盘中。

日志存储场景

  • 需要考虑每日写入集群的数据总量大小。通过过数据量与数据节点数评估索引分片数量。
  • 在日志存储后是否需要兼顾查询与聚合性能。合理大小的分片数据量能够提高查询效率。
  • 根据日志持久化策略,采用按月/周/天的策略生成索引。并使用ILM(索引生命周期管理策略)动态对日志索引进行完整生命周期的管理。

小数据量索引业务场景

对于数据量比较小的索引,增加索引分片数并不一定会带来性能提升,反而可能会带来一些负面影响。

首先,增加索引分片数会增加集群的管理开销,包括维护分片的状态、备份和恢复分片等。如果索引数据量比较小,这种开销可能会超过性能提升带来的收益。

其次,增加索引分片数可能会导致数据分布不均衡,从而影响查询性能。具体来说,如果某些分片中的数据量过小,可能会导致这些分片的查询性能比其他分片差。此外,如果查询涉及到多个分片,数据的合并操作也会增加查询时间。

因此,对于数据量比较小的索引,在查询场景下,通常建议将分片数设置为1或2,以避免不必要的开销和性能问题。如果需要提高查询性能,可以考虑配置索引副本,优化查询语句或使用缓存。

在所有场景下都建议遵循分片数与数据节点数保持倍数关系。使分片尽量平均分布在各个节点,避免出现负载不均或者由于分片设计引起的集群热点问题。

四.索引与资源消耗的关系

  1. 分片数量:Elasticsearch中的每个分片都是一个独立的Lucene索引。分片数量的增加会导致内存使用量的增加,因为每个分片都需要一定的内存来维护索引结构和缓存数据。如果分片数量过多,可能会导致内存不足,进而影响性能。
  2. Segment数量:Elasticsearch中的每个分片都由多个segment组成。Segment是Lucene索引的基本组成部分,用于存储和索引文档。Segment数量的增加会导致内存使用量的增加,因为每个segment都需要一定的内存来维护索引结构和缓存数据。如果segment数量过多,可能会导致内存不足,进而影响性能。

整体来看,适当的分片数量和segment数量可以提高Elasticsearch的查询性能和可靠性。但是,如果分片数量和segment数量过多,会导致内存消耗过大,从而影响性能。因此,在实际使用中,需要根据具体的场景和硬件条件进行调整。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.什么是index(索引)
  • 二.什么是shard
  • 三.如何规划索引
    • 读场景
      • 写场景
        • 日志存储场景
          • 小数据量索引业务场景
          • 四.索引与资源消耗的关系
          相关产品与服务
          Elasticsearch Service
          腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档