从入门到进阶 之 ElasticSearch 配置优化篇

🌹 以上分享从入门到进阶 之 ElasticSearch 配置优化篇,如有问题请指教写。🌹🌹 如你对技术也感兴趣,欢迎交流。🌹🌹🌹  如有需要,请👍点赞💖收藏🐱‍🏍分享 

 

集群参数

ElasticSearch 集群配置参数
参数名参数值说明
cluster.nameelasticsearch(自定义)配置 ES 的集群名称,默认值是 ES,建议改成存储数据相关。ES 会自动发现在同一网段下的集群名称相同的节点
node.namenode-1(自定义)

集群中的节点名,在同一个集群中不能重复。节点的名称一旦设置,就不能再改变了。当然,也可以设置成服务器的主机名称,例如

node.name:  ${HOSTNAME}

node.mastertrue

指定该节点是否有资格被选举成为 Master 节点,默认是 True。

如果被设置为 True,则有资格成为Master 节点,能否成为 Master 节点,需要通过选举产生。

node.datatrue指定该节点是否存储索引数据,默认为 True。数据的增、删、改、查在 Data 节点完成。
index.number_of_shards1设置都索引分片个数,默认是 1 片。可在创建索引时设置该值,具体设置为多大都值要根据数据量的大小来定。如果数据量不大,则设置成 1 时效率最高
index.number_of_replicas1设置默认的索引副本个数,默认为 1 个。副本数越多,集群的可用性越好,但是写索引时需要同步的数据越多。
transport.tcp.compresstrue设置在节点间传输数据时是否压缩,默认为False,不压缩
discovery.zen.minimum_master_nodes1

设置在选举 Master 节点时需要参与的最少的候选主节点数,默认为 1。如果使用默认值,则当网络不稳定时有可能会出现脑裂。合理的数值为

(master_eligible_nodes/2)+1,其中 master_eligible_nodes 表示集群中的候选主节点数

discovery.zen.fd.ping_timeout3s设置在集群中自动发现其他节点时 Ping 连接的超时时间,默认为 3 秒。在较差的网络环境下需要设置得大一点,防止因误判该节点的存活状态而导致分片的转移

 

硬件优化

        Elasticsearch 重度使用磁盘,你的磁盘能处理的吞吐量越大,你的节点就越稳定。

优化磁盘 IO 的技巧 

  • 使用 SSD。
  • 使用 RAID 0 条带化 RAID 会提高磁盘 IO,代价是当一块硬盘故障时整个就故障了。不要使用镜像或者奇偶校验 RAID,副本已提供这个功能。
  • 使用多块硬盘,并允许 Elasticsearch 通过多个 path.data 目录配置把数据条带化分配到它们上面。
  • 不要使用远程挂载的存储,比如 NFS 或者 SMB/CIFS。

分片策略

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

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

原则

  • 控制每个分片占用的硬盘容量不超过 ES 的最大JVM 的堆空间设置(一般不超过 32G),如果索引的总容量在 500G 左右,分片大小在 16 个左右
  • 考虑 node 数量,一个节点有时是一台物理机,如果分片数过多,超过了节点数,会导致一个节点上存在多个分片,一旦节点故障,即使保持了 1个以上的副本,有可能会导致数据丢失,集群无法恢复。一般都设置分片数不超过节点数的 3 倍。 
  • 主分片,副本和节点最大数之间数量,参考关系: 节点数<=主分片数*(副本数+1) 

推迟分片分配

         对于节点瞬时中断的问题

        默认情况,集群会等待一分钟来查看节点是否会重新加入,如果这个节点在此期间重新加入,重新加入的节点会保持其现有的分片数据,不会触发新的分片分配。这样就可以减少 ES 在自动再平衡可用分片时所带来的极大开销。
       修改参数 delayed timeout ,可以延长再均衡的时间,可全局设置也可以在索引级别进行修改:

https://www.elastic.co/guide/en/elasticsearch/reference/7.2/delayed-allocation.htmlicon-default.png?t=N7T8https://www.elastic.co/guide/en/elasticsearch/reference/7.2/delayed-allocation.html

PUT /_all/_settings
{"setting": {"index.unassigned.node_left.delayed_timeout":"5m"}
}

路由选择

         当我们查询文档的时候,Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?

通过下面这个公式来计算:  

shard = hash(routing) % number_of_primary_shards

        routing 默认值是文档的 id,也可以采用自定义值,比如用户 id。

不带 routing 查询

        在查询的时候不知道要查询的数据具体在哪个分片上,整个过程分 2 个步骤

分发:请求到达协调节点后,协调节点将查询请求分发到每个分片上。
聚合:协调节点搜集到每个分片上查询结果,在将查询的结果进行排序,返回用户结果。

带 routing 查询

        根据 routing 信息定位到某个分配查询,不需要查询所有的分配,经过协调节点排序。

写入速度优化

        ES 的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素,根据实际需求进行偏向化配置。

         写优化,搜索要求不高

  • 加大 Translog Flush ,目的是降低 Iops、Writeblock.
  • 增加 Index Refresh 间隔,目的是减少 Segment Merge 的次数。
  • 调整 Bulk 线程池和队列。
  • 优化节点间的任务分布。
  • 优化 Lucene 层的索引建立,目的是降低 CPU 及 IO

        批量数据提交 

 ES 提供了 Bulk API 支持批量操作,有大量的写任务时,可以使用 Bulk 来进行批量写入。

通用的策略如下:

  • Bulk 默认设置批量提交的数据量不能超过 100M
  • 数据条数一般是根据文档的大小和服务器性能而定的,单次批处理的数据大小应从 5MB~15MB 逐渐增加,当性能没提升时,把当前数据量作为最大值

优化存储设备 (SSD)

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

 合理使用合并

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

减少 Refresh 的次数 

        Lucene 在新增数据时,采用了延迟写入的策略,默认 索引的 refresh_interval 为 1 秒。
        Lucene 将待写入的数据先写到内存中,超过 1 秒(默认) 时就会触发一次 Reftesh, Refiesh 会把内存中的的数据刷新到操作系统的文件缓存系统。
        对搜索的实效性要求不高,可以将 Refiesh 周期延长,可以有效地减少段刷新次数,但需要消耗更多的 Heap 内存

加大Flush 设置

        Flush 目的是把文件缓存系统中的段持久化到硬盘,当 Translog 的数据量达到
512MB 或者 30 分钟时,会触发一次 Flush。

        imndex.translog.flush_threshold_size 参数的默认值是 512MB,

        增加参数值意味着文件缓存系统中可能需要存储更多的数据,需要为操作系统的文件缓存系统留下足够的空间。

减少副本数量 

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

内存设置

        ES 默认内存是 1GB,在 ES 安装文件中包含一个 ivm.option 文件,添加如下命令来设置 ES 的堆大小,Xms 表示堆的初始大小,Xmx 表示可分配的最大内存,都是 1GB。确保 Xmx 和 Xms 的大小是相同的,其目的是为了能够在 Java 垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源,减轻伸缩堆大小带来的压力。    

 原则

不要超过物理内存的 50%

        Lucene 的设计目的是把底层 OS 里的数据缓存到内存中。Lucene 的段存储到单个文件中的,这些文件都是不会变化的,利于缓存,操作系统也会把这些段文件缓存起来,以便更快的访问。如果我们设置的堆内存过大,Lucene 可用的内存将会减少,就会严重影响降低 Lucene 的全文本查询性能。
堆内存的大小最好不要超过 32GB

        在 Java 中,所有对象都分配在堆上,然后有一个 Klass Pointer 指针指向它的类元数据。 

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

性能优化 

缓存优化

 页缓存

        为了数据的安全、可靠,常规操作中,数据都是保存在磁盘文件中的。对数据的访问,绝大数情况下是对文件的访问,为了提升对文件的读写的访问效率,Linux 内核会以页大小(4KB)为单位,将文件划分为多个数据块。当用户对文件中的某个数据块进行读写操作时,内核首先会申请一个内存页(称为 PageCache 页缓存) 与文件中的数据块进行绑定。

         页缓存的基本理念是从磁盘读取数据后将数据放入可用内存中,下次读取时从内存返回数据,而获取数据不需要进行磁盘查找。对应用程序来说是完全透明的,应用程序发出相同的系统调用,操作系统使用页缓存而不从磁盘读取。
        Java 程序是跨平台的,没有和硬件(磁盘,内存)直接交互的能力,想要和磁盘文件交互,须要通过 OS 操作系统来完成文件的读写,就称之为用户态转换为内核态。操作系统对文件进行读写时,实际是对文件的页缓存进行读写。

       对文件进行读写操作时,分以下两种情况

当从文件中读取数据时

页缓存存在

        直接把页缓存的数据拷贝给用户。

页缓存​​​​​​​不存在

        内核首先会申请一个空闲的内存页(页缓存),然后从文件中读取数据到页缓存,并且把页缓存的数据拷贝给用户。

        当向文件中写入数据时

页缓存​​​​​​​存在

       那么直接把新数据写入到页缓存即可。

页缓存​​​​​​​不存在 

        内核首先会申请一个空闲的内存页(页缓存),并且把新数据写入到页缓存中。

对于被修改的页缓存,内核会定时把这些页缓存刷新到文件中。

分片级请求缓存

协调节点

         对一个或多个索引发送搜索请求时,搜索请求首先会发送到 ES 集群中的某个节点

本地结果集

        协调节点会把该搜索请求分发给其他节点并在相应分片上执行搜索操作,把分片上的执行结果称为“本地结果集”,

分片再将执行结果返回给协调节点;协调节点获得所有分片的本地结果集之后,合并成最终的结果并返回给客户端。

        Elasticsearch 会在每个分片上缓存了本地结果集,频繁使用的搜索请求立即返回结果,称之为 Request CacheShard Request Cache,即分片级请求缓存。

 Request Cache 默认时关闭的,可在创建新索引时启用

PUT /索引名 -d
{"setting": {"index.requests.cache.enable": true}
}PUT 服务器IP:端口/索引名/setting -d
{"index.requests.cache.enable": true}

开启缓存后,需要在搜索请求中加上 request cache=true 参数,才能使查询请求被缓存 

 

GET /索引名/_search?request_cache=true&pretty
{"size": 20,"aggs": {"pops_color": {"terms": {"name": "华为"}}}
}

查询缓存

 Elasticsearch 具有 IndicesQueryCache 类。这个类与 IndicesService 的生命周期绑定,按节点的特性 一 这样做是有道理的,缓存本身使用了 Java 堆。

两个配置选项

indices.queries.cache.count: 缓存条目总数,默认为 10000
indices.queries.cache.size: 用于此缓存的 Java 堆的百分比,默认为 10%

冻结层和可搜索快照

引入了冷层,通过消除在本地存储几余副本,在相同数量的硬件上最多存储两倍于热层的数据。为了获得最佳性能,主数据仍然存储在本地,但冷层中的索引由存储在对象存储中的可搜索快照提供支持,以实现冗余。 

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

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

相关文章

浏览器不能访问阿里云ECS

一、浏览器不能访问端口 在阿里云ECS中构建了工程&#xff0c;nigix或者tomcat或者其他&#xff0c;然后在本地浏览器访问ip端口的时候&#xff0c;连接超时&#xff0c;解决办法&#xff1a; 进入阿里云ECS服务 -> 查看公网ip (外部连接需要使用公网) -> 进入ECS实例的…

攻防世界web篇-cookie

看到cookie立马就会想到F12键看cookie的一些信息 我这个实在存储里面看的&#xff0c;是以.php点缀结尾&#xff0c;可以试一下在链接中加上.php 得到的结果是这样 这里&#xff0c;我就只能上csdn搜索一下了&#xff0c;看到别人写的是在get请求中可以看到flag值

Mysql 约束,基本查询,复合查询与函数

文章目录 约束空属性约束默认值约束zerofill主键约束自增长约束唯一键约束外键约束 查询select的执行顺序单表查询排序 updatedelete整张表的拷贝复合语句group by分组查询 函数日期函数字符串函数数学函数其他函数 复合查询合并查询union 约束 空属性约束 两个值&#xff1a…

element-ui 以CDN 方式引入原生js开发的几个别坑 (+vue)

element-ui 以CDN 方式引入原生js开发的几个坑 最近两个月太忙了 忙的没空写文章 两个月赶出来了几个的项目 一个是雪佛兰裸眼3D的一个商品屏幕展示项目 一个是广汽云渲染的一个云看车项目 一个是奥迪中国充电桩的网页开发项目&#xff0c; 奥迪中国做个饭也是目前正在做的 不…

机器人SLAM与自主导航

机器人技术的迅猛发展&#xff0c;促使机器人逐渐走进了人们的生活&#xff0c;服务型室内移动机器人更是获得了广泛的关注。但室内机器人的普及还存在许多亟待解决的问题&#xff0c;定位与导航就是其中的关键问题之一。在这类问题的研究中&#xff0c;需要把握三个重点&#…

专题:链表常考题目汇总

文章目录 反转类型&#xff1a;206.反转链表完整版二刷记录 25. K个一组反转链表1 &#xff1a;子链表左闭右闭反转版本2 &#xff1a; 子链表左闭右开反转版本&#xff08;推荐&#xff09;⭐反转链表左闭右闭和左闭右开 合并类型&#xff1a;21.合并两个有序链表1: 递归法2: …

作为决策者,谁能拒绝这样一张数据可视化报表

数据分析是决策的一大助力&#xff0c;因此作为企业的管理决策者都会希望获得一份直观易懂、支持灵活自助分析的数据可视化报表&#xff0c;比如说由奥威BI数据可视化软件制作的这张BI报表。 名称&#xff1a;零售业数据分析驾驶舱 来源&#xff1a;奥威BI零售数据分析方案 …

pnpm的环境安装以及安装成功后无法使用的问题

文章目录 前言1、使用npm 安装2、安装后的注意点3、遇到问题4、配置path的环境变量&#xff08;1&#xff09;找到环境变量&#xff08;2&#xff09;找到并双击path的系统变量&#xff08;3&#xff09;复制第1步中使用npm安装的红框部分的路径&#xff08;4&#xff09;将第&…

【MySql】8- 实践篇(六)

文章目录 1. MySql保证主备一致1.1 MySQL 主备的基本原理1.2 binlog 的三种格式对比1.3 循环复制问题 2. MySql保证高可用2.1 主备延迟2.2 主备延迟的来源2.3 可靠性优先策略2.4 可用性优先策略 3. 备库为何会延迟很久-备库并行复制能力3.1 MySQL 5.6 版本的并行复制策略3.2 Ma…

编译安装Nginx+GeoIP2自动更新+防盗链+防爬虫+限制访问速度+限制连接数

此文章是Nginx的GeoIP2模块和MaxMind国家IP库相互结合&#xff0c;达到客户端IP访问的一个数据记录以及分析&#xff0c;同时还针对一些业务需求做出对Nginx中间件的控制&#xff0c;如&#xff1a;防盗链、防爬虫、限制访问速度、限制连接数等 该篇文章是从一个热爱搞技术的博…

他海投260万未回本,一天手写200面单到效率提升200%,经历了什么

他们是时代里的“小人物”&#xff0c;正经历着最为蓬勃的商业变革。年轻一代的创业老板们站在十字路口上&#xff0c;比老一辈更懂直播风口、人工智能、云计算、智能制造、数字经济等经济热词的含义。 作为北京快递行业内少见的本地人&#xff0c;范小菲形容自己的创业历程是…

YOLOv8改进实战 | 更换主干网络Backbone(一)之轻量化模型Ghostnet

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法&#xff1a; 网络剪枝&#xff1a;移除神经网络中冗余的连接和参数&#xff0c;以达到模型压缩和加速的目的。分组卷积&#xff1a;将卷积操作分解为若干个…

jmeter监听每秒点击数(Hits per Second)

jmeter监听每秒点击数&#xff08;Hits per Second&#xff09; 下载插件添加监听器执行压测&#xff0c;监听结果 下载插件 点击选项&#xff0c;点击Plugins Manager (has upgrades)&#xff0c;点击Available Plugins&#xff0c;搜索5 Additional Graphs安装。 添加监听…

FPGA的通用FIFO设计verilog,1024*8bit仿真,源码和视频

名称&#xff1a;FIFO存储器设计1024*8bit 软件&#xff1a;Quartus 语言&#xff1a;Verilog 本代码为FIFO通用代码&#xff0c;其他深度和位宽可简单修改以下参数得到 reg [7:0] ram [1023:0];//RAM。深度1024&#xff0c;宽度8 代码功能&#xff1a; 设计一个基于FPGA…

【ELK 使用指南 3】Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构(附部署实例)

EFLKK 一、Zookeeper1.1 简介1.2 zookeeper的作用1.3 Zookeeper的特点1.5 Zookeeper的数据结构1.6 Zookeeper的应用场景1.7 Zookeeper的选举机制&#xff08;重要&#xff09;1.7.1 第一次启动时1.7.2 非第一次启动时 二、Zookeeper集群部署2.1 安装前准备2.2 安装 ZookeeperSt…

(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

先添加一个带有ui的QT应用程序。 一、在ui界面中添加QVTKOpenGLNativeWidget控件 先拖出来一个QOpenGLWidget控件 修改布局如下&#xff1a; 然后将QOpenGLWidget控件提升为QVTKOpenGLNativeWidget控件&#xff0c;步骤如下&#xff1a; 右击QOpenGLWidget窗口&#xff0c;选…

【五:Httprunner的介绍使用】

接口自动化框架封装思想的建立。httprunner&#xff08;热加载&#xff1a;动态参数&#xff09;&#xff0c;去应用 意义不大。 day1 一、什么是Httprunner? 1.httprunner是一个面向http协议的通用测试框架&#xff0c;目前最新的版本3.X。以前比较流行的 2.X的版本。2.它的…

pytorch 入门 (三)案例一:mnist手写数字识别

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】mnist手写数字识别&#x1f356; 原作者&#xff1a;K同学啊 目录 一、 前期准备1. 设置GPU2. 导入…

基于主动移频法与AFD孤岛检测的单相并网逆变器仿真(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

二、vue基础语法

一、模板语法 1、文本渲染 使用双花括号语法插入文本 <template><div><h3>msg: {{ message }}</h3></div> </template><script> export default {data() {return {message: "输出信息"}} } </script><style s…