如何优化 Elasticsearch 以获得更好的搜索性能

当今世界,数据大量生成,为了利用数据进行生产,需要对提取的数据进行转换、存储、维护、管理和分析。这些过程只有通过大数据工具所基于的分布式架构和并行处理机制才能实现。Elasticsearch 是最流行的开源数据存储之一,可以满足大多数用例。

Elasticsearch是一个分布式数据存储和搜索引擎,具有容错和高可用性功能。为了充分利用 Elasticsearch 的搜索功能,需要正确配置。由于一个简单的配置并不适合所有用例,因此您需要首先提取您的需求,然后根据您的用例配置集群。本文将重点介绍 Elasticsearch 的搜索密集型初始配置和动态配置。

索引配置
默认情况下,Elasticsearch 索引有 5 个主分片,每个分片有 1 个副本。这种配置并不适合所有用例。需要正确计算分片配置以维持稳定高效的索引。

物理边界
分片大小对于搜索查询非常关键。如果分配给索引的分片太多,Lucene 段就会很小,这会导致开销增加。当同时进行多个查询时,大量小分片也会降低查询吞吐量。另一方面,太大的分片会导致搜索性能下降,并且故障恢复时间更长。因此,Elasticsearch建议1个分片的大小应该在20到40GB左右。

例如,如果您计算出索引将存储 300 GB 的数据,则可以为该索引分配 9 到 15 个主分片。根据集群大小,假设您的集群中有 10 个节点,您会选择为此索引设置 10 个主分片,以便在集群的节点之间均匀分布分片。

连续流
如果有数据流持续摄取到 Elasticsearch 集群,则应使用基于时间的索引来更轻松地维护索引。如果流的吞吐量随着时间的推移而变化,只需适当更改下一个索引的配置即可适当简化适应并使其能够轻松扩展。

那么,如何查询驻留在单独的基于时间的索引中的所有文档呢?答案是别名。可以将多个索引放入一个别名中,并且在该别名上进行搜索会使查询就像在单个索引上进行查询一样。当然,需要在别名中放入多少个索引上保持平衡,因为别名上太多的小索引会对性能产生负面影响。例如,可能需要在保留每月指数还是每周指数之间做出决定。如果集群允许在最佳配置的大小方面使用每月索引,则无需保留每周索引,因为这会对性能产生负面影响,因为索引太多,并且需要对每个索引的结果进行整理。

索引排序
一种用例是只关注最近发生的事件。Elasticsearch 对于此类用例具有惰性进化机制。每个段的顶部文档已经在索引中排序,如果对文档总数不感兴趣,Elasticsearch 将通过将 track_total_hits 设置为 false 来仅比较每个段的顶部文档。如果使用索引排序机,这将有助于有效地加速与低基数字段一起使用的连词。

分片优化
图片标题

分片允许与分布式架构并行操作,因此它允许水平扩展。有两种类型的碎片。其中之一是主分片,负责索引、重新索引、删除等读写操作。另一个是副本分片,负责高可用性和读取吞吐量。

分片的大小、分片中每个段的大小、节点中有多少个活跃分片是优化分片时的主要考虑因素。

副本分片对于扩展搜索吞吐量非常重要,如果硬件适合这种情况,则可以谨慎增加副本分片的数量。容量规划的一个很好的出发点是以节点数的 1.5 到 3 倍的系数来分配分片。通常,每个节点具有较少分片的设置会执行得更好,因为文件系统缓存将更有效地分布在节点之间。

另外,副本分片数量的分配公式:

首先需要计算预计发生故障的最大节点数,因为没有人希望数据库中的数据丢失。然后,根据索引的主分片数量和节点数量,提取副本分片在集群中的有效分布以实现高吞吐量。每个的最大值给出了副本分片数量的真实值。

Elasticsearch 配置
配置 Elasticsearch 集群时最主要的考虑因素之一是确保至少一半的可用内存用于文件系统缓存,以便 Elasticsearch 可以将索引的热区域保留在物理内存中。

设计集群时还应考虑物理可用堆空间。Elasticsearch 建议基于可用堆空间的分片分配最大应为 20 个分片/GB,这是一个良好的经验法则。例如,具有 30 GB 堆的节点最多应有 600 个分片,以保持集群良好的运行状况。一个节点上的存储可以表述如下:

节点可支持的磁盘空间 = 20 *(每 GB 堆大小)*(分片大小(以 GB 为单位))

由于在高效集群中常见大小为 20 到 40 GB 的分片,因此具有 16 GB 可用堆空间的节点可支持的最大存储容量高达 12 TB 磁盘空间。边界意识有助于为更好的设计和未来的扩展操作做好准备。当然,为了使集群高效,每个索引一个分片、每个节点的规则也适用于每一种理想场景。

可以在运行时和初始阶段进行许多配置设置。在构建 Elasticsearch 索引和集群本身以获得更好的搜索性能时,了解运行时期间可以更改和不能更改的内容至关重要。

动态设置
使用基于时间的索引来管理数据并更好地组织。如果过去的索引没有写操作,可以将传递的每月索引设置为只读模式,以提高对这些索引的搜索性能。
当索引设置为只读时,可以进行强制合并操作,通过合并来减少段的数量。因此,优化的段将带来更好的搜索性能,因为每个分片的开销取决于段的数量和大小。不要将此应用于读写索引,因为它将导致生成非常大的段(每个段 >5Gb)。此外,此操作应在非高峰时段进行,因为这是一项昂贵的操作。
缓存可用于最终用户的用例。首选项设置可用于优化缓存的使用,因为它将允许分析索引的较小子集。
为了稳定性,可以在每个节点上禁用交换,并且应该不惜一切代价避免。它可能导致垃圾收集持续几分钟而不是几毫秒,并且可能导致节点响应缓慢甚至与集群断开连接。在弹性分布式系统中,让操作系统杀死节点更为有效。可以通过将bootstrap.memory_lock设置为 True 来禁用它。
可以增加活动索引的刷新间隔。活跃指数意味着这些指数的数据索引仍在进行中。默认刷新间隔为 1 秒。这迫使 Elasticsearch 每秒创建一个段。根据您的用例增加此值(例如 30 秒)将允许刷新更大的段并减少未来的合并压力。因此,它减少了活动索引的合并压力,搜索查询更加稳定。
默认情况下, index.merge.scheduler.max_thread_count设置为 Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)) 。但这适用于 SSD 配置。如果是 HDD,则应设置为 1。
有时,Elasticsearch 会重新平衡集群中的分片。此操作可能会导致搜索查询的性能下降。在生产模式下,当需要时,可以通过cluster.routing.rebalance.enable设置将重新平衡设置为 none 。
基于日期的搜索不应包含now参数,因为now不是可缓存参数。相反,具体来说,在查询中定义现在的时间戳,其中包括可缓存的日期。
初始设置
对于一些查询频率较高的字段,可以利用 Elasticsearch 的复制到功能。例如,汽车的品牌名称、发动机版本、型号名称和颜色字段可以与复制到指令合并。它将提高这些字段中的搜索查询性能。
当然,拥有同构集群总是令人希望的。但是,在异构集群的情况下,最好为具有更好硬件的节点分配分片分配权重。为了分配权重,  cluster.routing.allocation.balance.shard  需要设置值,默认值为0.45f。
查询本身对响应的延迟也有重大影响。为了不在查询时断路并导致 Elasticsearch 集群处于不稳定状态,  indices.breaker.total.limit  可以根据查询的复杂性适当设置 JVM 堆大小。此设置的默认值是 JVM 堆的 70%。
默认情况下,Elasticsearch 假定主要用例是搜索。如果需要增加并发度,可以根据节点上CPU的核心数增加用于搜索设置的线程池threadpool,并减少用于索引的threadpool。
应打开自适应副本选择。请求将被重定向到响应速度最快的节点,而不是基于以下的循环方法:
协调节点与包含数据副本的节点之间过去请求的响应时间。
在包含数据的节点上执行搜索请求所花费的时间。
包含数据的节点上搜索线程池的队列大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

邻接表表示图进行深度优先搜索,广度优先搜索,最小生成树

图的邻接表定义 下面用邻接表实现图的深度优先搜索和广度优先搜索,用邻接矩阵来实现最小生成树。 图的邻接表:首先定义一个图的邻接表的类,里面包括图的顶点数,图的边数,顶点表数组。由于顶点表数组里存放的都是图的…

P2880 [USACO07JAN] Balanced Lineup G 题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示完整代码 题目描述 For the daily milking, Farmer John’s N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with…

从兔子说起:了解RabbitMQ消息的多样化【RabbitMQ 二】

🎏:你只管努力,剩下的交给时间 🏠 :小破站 从兔子说起:了解RabbitMQ消息的多样化 第一:消息的可靠性与持久性第二:消息交换机与队列第三:消息确认与拒绝第四:…

深度学习手势识别 - yolo python opencv cnn 机器视觉 计算机竞赛

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

2023年全国职业院校技能大赛“ 信息安全管理与评估” 测试题2

一.单选题 1、下列不属于口令安全威胁的是?( ) A、 弱口令 B、 明文传输 C、 MD5 加密 D、 多账户共用一个密码 2、在学校或单位如果发现自己的计算机感染了病毒,应首先采取什么措施 ( )。 A、断开网络 B、告知领导 C、杀毒 D、重…

C++模板—函数模板、类模板

目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值,针对不同类型,我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地:代码开发 代码开发:SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用:分层体系、建模实现 2. 内容目标 项目业务介绍:背景、需求 项目技术架构:选型、架构 项目环境…

SpringBootWeb案例_03

Web后端开发_06 SpringBootWeb案例_03 登录认证 智能学习辅助系统登录时需要身份验证 1.登录功能 先实现简单的登录功能,在进一步优化。 1.1需求 若账户或密码不存在/密码不正确,则登录失败。 账户密码正确,则登录成功 1.2接口文档 …

git基本概念

一、版本控制概念 1.1 什么是版本控制 1.1.1 手动管理文件版本 1.1.2 版本控制软件 概念:版本控制软件是一个用来记录文件发生的变化,以便将来查阅特定版本修订情况的系统,有时也叫“版本控制系统”。通俗的理解就是把手工管理文件版本的方…

关于电脑提示vcruntime140_1.dll无法继续执行代码的解决办法

vcruntime140_1.dll是Visual C运行时库的一个组成部分,它包含了大量用于支持C应用程序运行时的功能。这个文件通常在开发和使用C程序时被调用,特别是在使用Microsoft Visual Studio进行开发时。vcruntime140_1.dll文件丢失或损坏会导致C程序无法正常运行…

初识:分布式事务Seata-AT模式的事务提交和事务回滚过程详解

分布式事务Seata 1. 本地事务2. 分布式事务3. 实现思路:两阶段提交协议(2PC)3.1 基础理解3.2 2PC的隐患 4. Seata4.1 Seata是什么4.2 Seata的三大角色4.3 Seata一次事务的生命周期4.4 Seata AT模式的设计思路4.4.1 设计思路4.4.1.1 一阶段4.4…

信息化,数字化,智能化是3种不同概念吗?与机械化,自动化矛盾吗?

先说结论: 1、信息化、数字化、智能化确实是3种不同的概念! 2、这3种概念与机械化、自动化并不矛盾,它们是制造业中不同发展阶段和不同层次的概念。 机械化:是指在生产过程中使用机械技术来辅助人工完成一些重复性、单一性、劳…

助力android面试2024【面试题合集】

转眼间,2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难,那么想必找工作也不好找,在我们android开发这一行业非常的卷,在各行各业中尤为突出。android虽然不好过,但不能不吃饭吧。卷归卷但是还得干…

Pytorch——多卡GPU训练与单卡GPU训练相互切换

部分深度学习网络默认是多卡并行训练的,由于某些原因,有时需要指定在某单卡上训练,最近遇到一个,这里总结如下。 目录 一、多卡训练1.1 修改配置文件1.2 修改主训练文件1.3 显卡使用情况 二、单卡训练2.1 修改配置文件2.2 显卡使…

ApplicationEventPublisher-Spring事件发布器

一、简介 ApplicationEventPublisher是简称为Spring中的事件发布器,应用于Java事件型驱动应用是解耦和设计,Spring对Java已有的事件处理模型,做了进一步的简化处理。 二、发布及处理事件 ApplicationEventPublisher是一个函数式编程的接口…

简单了解下IP的全球划分【笔记】

国际互联网号码分配机构 (The Internet Assigned Numbers Authority,简称IANA)。它是互联网名称与数字地址分配机构(The Internet Corporation for Assigned Names and Numbers,简称ICANN)旗下的一个机构,主…

Spring之AOP底层源码解读(更新中)

1. 什么是spring的Aop 在进行源码解读之前,大家需要对Spring的Aop有基础的认识和理解,参考文章:Spring之AOP理解与应用-CSDN博客 2. 源码解读 接下来,我们对AOP的源码进行一个解读。 2.1 动态代理 如果你已经对spring的Aop已经有…

Linux5-计划任务、进程

计划任务 一、cron 计划任务 周期性计划任务 cron 任务概述 • 用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务 • 软件包:cronie、crontabs • 系统服务:crond • 日志文件:/var/log/crond 管理计划任务策略 • 使用 cro…

存储虚拟化的写入过程

存储虚拟化的场景下,整个写入的过程。 在虚拟机里面,应用层调用 write 系统调用写入文件。write 系统调用进入虚拟机里面的内核,经过 VFS,通用块设备层,I/O 调度层,到达块设备驱动。虚拟机里面的块设备驱动…

uniapp uni-popup组件在微信小程序中滚动穿透问题

起因 在微信小程序中使用uni-popup组件时&#xff0c;出现滚动穿透&#xff0c;并且uni-popup内部内容不会滚动问题。 解决 滚动穿透 查阅官方文档&#xff0c;发现滚动穿透是由于平台差异性造成的&#xff0c;具体解决可以参照文档禁止滚动穿透 <template><page-…