Elasticsearch 优化

news2024/10/5 21:18:35

Elasticsearch 优化

2.1硬件选择

Elasticsearch 的基础是 Lucene ,所有的索引和文档数据是存储在本地的磁盘中,具体的
路径可在 ES 的配置文件 ../config/elasticsearch.yml 中配置,如下:
#----------------------------------- Paths
------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
#path.data: /path/to/data
#
# Path to log files:
#
#path.logs: /path/to/logs
#
磁盘在现代服务器上通常都是瓶颈。 Elasticsearch 重度使用磁盘,你的磁盘能处理的吞吐量
越大,你的节点就越稳定。这里有一些优化磁盘 I/O 的技巧:
  1. 使用 SSD。就像其他地方提过的, 他们比机械磁盘优秀多了。
  2. 使用 RAID 0。条带化 RAID 会提高磁盘 I/O,代价显然就是当一块硬盘故障时整个就故障了。不要使用镜像或者奇偶校验 RAID 因为副本已经提供了这个功能。
  3. 另外,使用多块硬盘,并允许 Elasticsearch 通过多个 path.data 目录配置把数据条带化分配到它们上 面。
  4. 不要使用远程挂载的存储,比如 NFS 或者 SMB/CIFS。这个引入的延迟对性能来说完全是背道而驰的。

2.2分片策略

合理设置分片数

分片和副本的设计为 ES 提供了支持分布式和故障转移的特性,但并不意味着分片和副本是可以无限分配的。而且索引的分片完成分配后由于索引的路由机制,我们是不能重新修改分片数的。

可能有人会说,我不知道这个索引将来会变得多大,并且过后我也不能更改索引的大小,所以为了保险起见,还是给它设为 1000 个分片吧。但是需要知道的是,一个分片并不是没有代价的。需要了解:

  1. 一个分片的底层即为一个 Lucene 索引,会消耗一定文件句柄、内存、以及 CPU运转。
  2. 每一个搜索请求都需要命中索引中的每一个分片,如果每一个分片都处于不同的节点还好, 但如果多个分片都需要在同一个节点上竞争使用相同的资源就有些糟糕了。
  3. 用于计算相关度的词项统计信息是基于分片的。如果有许多分片,每一个都只有很少的数据会导致很低的相关度。

一个业务索引具体需要分配多少分片可能需要架构师和技术人员对业务的增长有个预先的判断,横向扩展应当分阶段进行。为下一阶段准备好足够的资源。 只有当你进入到下一个阶段,你才有时间思考需要作出哪些改变来达到这个阶段。一般来说,我们遵循一些原则:

  1. 控制每个分片占用的硬盘容量不超过 ES 的最大 JVM 的堆空间设置(一般设置不超过 32G,参考下文的 JVM 设置原则),因此,如果索引的总容量在 500G 左右,那分片大小在 16 个左右即可;当然,最好同时考虑原则 2。
  2. 考虑一下 node 数量,一般一个节点有时候就是一台物理机,如果分片数过多,大大超过了节点数,很可能会导致一个节点上存在多个分片,一旦该节点故障,即使保持了 1 个以上的副本,同样有可能会导致数据丢失,集群无法恢复。所以, 一般都设置分片数不超过节点数的 3 倍。
  3. 主分片,副本和节点最大数之间数量,我们分配的时候可以参考以下关系:

         节点数<=主分片数 *(副本数+1)

 推迟分片分配

对于节点瞬时中断的问题,默认情况,集群会等待一分钟来查看节点是否会重新加入,
如果这个节点在此期间重新加入,重新加入的节点会保持其现有的分片数据,不会触发新的
分片分配。这样就可以减少 ES 在自动再平衡可用分片时所带来的极大开销。
通过修改参数 delayed_timeout ,可以延长再均衡的时间,可以全局设置也可以在索引
级别进行修改 :
PUT /_all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "5m"
}
}

2.3 路由选择

当我们查询文档的时候, Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?它
其实是通过下面这个公式来计算出来 :
 
shard = hash(routing) % number_of_primary_shards
routing 默认值是文档的 id ,也可以采用自定义值,比如用户 id

不带 routing 查询

在查询的时候因为不知道要查询的数据具体在哪个分片上,所以整个过程分为 2 个步骤
  • 分发:请求到达协调节点后,协调节点将查询请求分发到每个分片上。
  • 聚合: 协调节点搜集到每个分片上查询结果,在将查询的结果进行排序,之后给用户返回结果。

routing 查询

查询的时候,可以直接根据 routing 信息定位到某个分配查询,不需要查询所有的分配,经
过协调节点排序。
向上面自定义的用户查询,如果 routing 设置为 userid 的话,就可以直接查询出数据来,
效率提升很多。

2.4 写入速度优化

ES 的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素。实际使用时,
我们需要根据公司要求,进行偏向性的优化。
针对于搜索性能要求不高,但是对写入要求较高的场景,我们需要尽可能的选择恰当写
优化策略。综合来说,可以考虑以下几个方面来提升写索引的性能:
  1. 加大 Translog Flush ,目的是降低 IopsWriteblock
  2. 增加 Index Refresh 间隔,目的是减少 Segment Merge 的次数。
  3. 调整 Bulk 线程池和队列。
  4. 优化节点间的任务分布。
  5. 优化 Lucene 层的索引建立,目的是降低 CPU IO

2.4.1 批量数据提交

ES 提供了 Bulk API 支持批量操作,当我们有大量的写任务时,可以使用 Bulk 来进
行批量写入。
通用的策略如下: Bulk 默认设置批量提交的数据量不能超过 100M 。数据条数一般是
根据文档的大小和服务器性能而定的,但是单次批处理的数据大小应从 5MB 15MB 逐渐
增加,当性能没有提升时,把这个数据量作为最大值。

2.4.2 优化存储设备

ES 是一种密集使用磁盘的应用,在段合并的时候会频繁操作磁盘,所以对磁盘要求较
高,当磁盘速度提升之后,集群的整体性能会大幅度提高。 

2.4.3 合理使用合并

Lucene 以段的形式存储数据。当有新的数据写入索引时, Lucene 就会自动创建一个新
的段。
随着数据量的变化,段的数量会越来越多,消耗的多文件句柄数及 CPU 就越多,查询
效率就会下降。
由于 Lucene 段合并的计算量庞大,会消耗大量的 I/O ,所以 ES 默认采用较保守的策
略,让后台定期进行段合并

2.4.4 减少 Refresh 的次数

Lucene 在新增数据时,采用了延迟写入的策略,默认情况下索引的 refresh_interval
1 秒。
Lucene 将待写入的数据先写到内存中,超过 1 秒(默认)时就会触发一次 Refresh
然后 Refresh 会把内存中的的数据刷新到操作系统的文件缓存系统中。
如果我们对搜索的实效性要求不高,可以将 Refresh 周期延长,例如 30 秒。
这样还可以有效地减少段刷新次数,但这同时意味着需要消耗更多的 Heap 内存。

2.4.5 加大 Flush 设置

Flush 的主要目的是把文件缓存系统中的段持久化到硬盘,当 Translog 的数据量达到
512MB 或者 30 分钟时,会触发一次 Flush
index.translog.flush_threshold_size 参数的默认值是 512MB ,我们进行修改。
增加参数值意味着文件缓存系统中可能需要存储更多的数据,所以我们需要为操作系统
的文件缓存系统留下足够的空间。

2.4.6 减少副本的数量

ES 为了保证集群的可用性,提供了 Replicas (副本)支持,然而每个副本也会执行分
析、索引及可能的合并过程,所以 Replicas 的数量会严重影响写索引的效率。
当写索引时,需要把写入的数据都同步到副本节点,副本节点越多,写索引的效率就越
慢。
如 果 我 们 需 要 大 批 量 进 行 写 入 操 作 , 可 以 先 禁 止 Replica 复 制 , 设 置
index.number_of_replicas: 0 关闭副本。在写入完成后, Replica 修改回正常的状态。

2.5 内存设置

 

ES 默认安装后设置的内存是 1GB,对于任何一个现实业务来说,这个设置都太小了。如果是通过解压安装的 ES,则在 ES 安装文件中包含一个 jvm.option 文件,添加如下命令来设置 ES 的堆大小, Xms 表示堆的初始大小, Xmx 表示可分配的最大内存,都是 1GB。

确保 Xmx 和 Xms 的大小是相同的,其目的是为了能够在 Java 垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力。

假设你有一个 64G 内存的机器,按照正常思维思考,你可能会认为把 64G 内存都给ES 比较好,但现实是这样吗, 越大越好?虽然内存对 ES 来说是非常重要的,但是答案是否定的!

因为 ES 堆内存的分配需要满足以下两个原则:

  • 不要超过物理内存的 50%: Lucene 的设计目的是把底层 OS 里的数据缓存到内存中。Lucene 的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。如果我们设置的堆内存过大, Lucene 可用的内存将会减少,就会严重影响降低 Lucene 的全文本查询性能。
  • 堆内存的大小最好不要超过 32GB:在 Java 中,所有对象都分配在堆上,然后有一个 Klass Pointer 指针指向它的类元数据。这个指针在 64 位的操作系统上为 64 位, 64 位的操作系统可以使用更多的内存(2^64)。在 32 位的系统上为 32 位, 32 位的操作系统的最大寻址空间为 4GB(2^32)。但是 64 位的指针意味着更大的浪费,因为你的指针本身大了。浪费内存不算,更糟糕的是,更大的指针在主内存和缓存器(例如 LLC, L1 等)之间移动数据的时候,会占用更多的带宽。

最终我们都会采用 31 G 设置

  • -Xms 31g
  • -Xmx 31g

假设你有个机器有 128 GB 的内存,你可以创建两个节点,每个节点内存分配不超过 32 GB。也就是说不超过 64 GB 内存给 ES 的堆内存,剩下的超过 64 GB 的内存给 Lucene。
 

2.6 重要配置

 

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

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

相关文章

使用acme,自动续签免费的SSL,无忧http升级https

使用acme自动续签免费的SSL 安装acme.sh颁发域名将证书安装到nginx下配置nginx的ssl自动续签 这里只进行最简单的操作 安装acme.sh 进入你的用户目录&#xff0c;如果你使用root登陆&#xff0c;那么你的用户目录就是 /root/ curl https://get.acme.sh | sh -s emailmyexam…

[Qt开发思想探幽]QObject、模板继承和多继承

[Qt开发思想探幽]QObject、模板继承和多继承 [Qt开发探幽]QObject、模板继承和多继承***1. QObject为什么不允许模板继承&#xff1a;******2.如果需要使用QObject进行多继承的话&#xff0c;子对象引用的父类链至多只能含有一个QObject******3.如果使用模板类和QObject做多继承…

US-P2F-R-C双线圈插头式比例阀放大器

US-P2F-R-C型插头式安装比例放大器控制不带电反馈的单或双比例电磁铁的比例阀&#xff0c;如比例插装阀、比例方向阀、比例压力阀、比例流量阀、比例叠加阀等&#xff0c;带数显区显示及当前参数&#xff0c;如指令、电流、上下斜坡、颤振频率等&#xff0c;指令类型兼容0-10V、…

2023高教社杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

揭秘视频号创收计划:松松一个月赚1300+

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 这是卢松松一个月视频号的收益&#xff0c;1300元。自从视频号在五月份推出创作者分成计划以来&#xff0c;许许多多的视频号创作者开始获得了一些收益&#xff0c;这绝对是一项挺不错的进展。 目前…

Prometheus监控(一)

文章目录 监控对于企业和运维工作的重要性监控&#xff1f;告警&#xff1f;数据采集 Prometheus介绍Prometheus相对于老牌监控的优势和不足理想的监控系统的实现监控系统设计&#xff08;架构师&#xff09;监控系统的搭建数据采集的编写监控数据分析和算法稳定性测试监控自动…

无风扇迷你电脑信息与购买指南

本文将解释什么是无风扇迷你电脑&#xff0c;以及计算产品组合中你可以购买的一些不同的无风扇迷你电脑的信息指南。 无风扇迷你电脑是一种小型工业计算机&#xff0c;旨在处理复杂的工业工作负载。迷你电脑是通过散热器被动冷却可在各种类型的易失性环境中部署。无风扇微型计…

自动化运维:Ansible基础与命令行模块操作

目录 一、理论 1. Ansible 2.部署Ansible自动化运维工具 3.Ansible常用模块 4.hostsinverntory主机清单 二、实验 1.部署Ansible自动化运维工具 2.ansible 命令行模块 3.hostsinverntory主机清单 三、问题 1. ansible远程shell失败 2.组变量查看webservers内主机ip报…

开源在企业中的角色和价值

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Java集合大揭秘:优雅管理数据的智慧舞台

集合&#xff08;Collections&#xff09;是一种用于存储、组织和操作数据的重要工具。它们提供了各种数据结构和算法&#xff0c;帮助开发者高效地处理不同类型的数据。本文将带您深入了解Java集合框架&#xff0c;探索其核心概念、常用接口和类&#xff0c;以及在实际应用中的…

一个插件实现代码自由,快来试试吧

效果如下 开始操作 1.插件下载并解压 2.打开chrome浏览器,点击扩展程序–》管理扩展程序 3.打开开发者模式&#xff0c;加载已解压的扩展程序 4.加载AI工具 5.打开插件 6.回到主页&#xff0c;效果如下 7.点击ChatGPT 8.大概过30秒&#xff0c;邮箱注册 9.注册完成,可以…

智能气象站丨自动采集、自动存储、自动传输

智能气象站&#xff0c;能够同时自动采集周围环境中的空气湿度、空气温度、风速、风向、雨量、太阳辐射及大气压力、PM2.5、PM10等&#xff0c;多用户可以在手机或者电脑上同时查看实时数据。智能气象站与传统的气象站不同&#xff0c;采用了多种传感器技术对空气中的各项要素进…

谁说银行U盾有OK键,就不能远程连接调用?

如今很多公司都在用USB Server管理U盾&#xff0c;但是有的U盾不是要按OK键吗&#xff1f;怎么远程连接呢&#xff1f; 了解一下U盾OK键远程点按器&#xff01; 有了它就可以配合USB Server自动点按OK键、远程连接调用网银U盾&#xff01; 把U盾固定在点按器上&#xff0c; 将…

突破边界:文本检测算法的革新与应用前景

突破边界&#xff1a;文本检测算法的革新与应用前景 1.文本检测理论篇&#xff08;文本检测方法介绍&#xff09; 文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务&#xff0c;目标检测不仅要解决定位问题&#xff0c;还要解决目标分类问题。 文本在图像中的…

大数据项目实战(Sqoop安装)

一&#xff0c;搭建大数据集群环境 1.4 Sqoop安装 1.sqoop安装 &#xff08;1&#xff09;上传安装包 &#xff08;2&#xff09;解压安装包 tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /export/servers &#xff08;3&#xff09;重命名 mv sqoop-1.4.6.b…

新生军训报到须知情况发布

军训是每位高中生开学的第一课&#xff0c;它不仅能锻炼身体&#xff0c;培养毅力和团队合作精神&#xff0c;更能培养学生坚强的意志和自律的品质。作为班主任&#xff0c;应该与军训教官紧密合作&#xff0c;共同努力&#xff0c;为学生们提供一个有益的军训经验。 好消息&am…

AIGC:初学者使用“C知道”实现AI人脸识别

文章目录 前言人脸识别介绍准备工作创作过程生成人脸识别代码下载分类文件安装 OpenCV生成人脸识别代码&#xff08;图片&#xff09; 创作成果总结 前言 从前&#xff0c;我们依靠各种搜索引擎来获取内容&#xff0c;但随着各类数据在互联网世界的爆炸式增长&#xff0c;加上…

缓存技术实现

大家好 , 我是苏麟 , 今天聊一聊缓存 . 这里需要一些Redis基础 (可以看相关文章等) 本文章资料来自于 : 黑马程序员 如果想要了解更详细的资料去黑马官网查看 前言:什么是缓存? 缓存,就是数据交换的 缓冲区 (称作Cache [ kʃ ] ),俗称的缓存就是缓冲区内的数据,是存贮数据的…

SpringBoot异步方法支持注解@Async应用

SpringBoot异步方法支持注解Async应用 1.为什么需要异步方法&#xff1f; 合理使用异步方法可以有效的提高执行效率 同步执行(同在一个线程中): 异步执行(开启额外线程来执行): 2.SpringBoot中的异步方法支持 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来异…

RTSP/Onvif协议安防视频平台EasyNVR录像模式自定义操作

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif流媒体协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中&#xff0c;EasyNVR可提供视频实时监控直播…