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