这样优化Elasticsearch,显著提升写入速度
yuyutoo 2024-10-28 20:21 1 浏览 0 评论
Elasticsearch系列
第4篇
elasticsearch默认配置综合考虑了数据可靠性、搜索实时性、写入速度等因素,在某些场景下,对于可靠性和实时性要求不高,而对写入速度要求比较高,此时,可以通过调整一些策略来提升写入的速度。
01
使用SSD替代普通机械磁盘
当存量大量的写入请求时,refresh indexing buffer和flush translog都会导致大量的磁盘IO,IO压力会显著增加,可以考虑使用SSD替换普通机械磁盘,提升一定的写入速率。
02
批量写入设置副本为0
elasticsearch在写入数据时,如果存在副本,则写完主分片以后,会将请求转发给所有的副本分片,等所有的分片写完成以后才算写入成功,写入到副本分片的数据也需要索引的过程,批量写入的时间会比较长,而设置副本为0时,只写主分片,重新调整副本数量以后只涉及主分片数据复制到副本分片的过程,节省了索引过程,提升了写入速率。
03
加大translog flush时间间隔
从ES2.X开始默认的translog flush策略为: index.translog.durability:request,这种情况下每次index、bulk、delete、update都会触发translog flush,好处是保证了数据的可靠性,不会在断电等情况下造成部分数据丢失,但是每次flush的效率明显较低,且I/O压力比较大。
在对可靠性要求不那么高的场景下,允许一定概率的数据丢失,可以调整translog flush策略:
- 设置index.translog.durability:async 关闭index、bulk、delete、update等操作同步flush translog,使用默认的定时刷新、文件大小阈值刷新的机制,策略由参数sync_interval和flush_threshold_size决定。
- 设置index.translog.sync_interval:5s此配置默认5s,表示默认每个5s会定时执行fsync,将translog buffer刷新到磁盘中。
- 设置index.translog.flush_threshold_size:512mb此配置默认512mb,表示当translog buffer达到512mb的时候,将会触发一次translog flush,同时也会触发一次index commit,导致refresh操作,产生新的lucene分段。
04
加大indexing refresh时间间隔
elasticsearch索引的过程是先将数据写入indexing buffer,通过定时refresh或者buffer满了refresh的机制,将index buffer写入os cache,此时数据就可以被搜索了,因为默认情况下这个定时的refresh设置为1s,所以我们一般说elasticsearch是近实时的。
每次的refresh操作,都会导致产生一个新的lucene分段,当lucene分段太多的时候会导致频繁的segment merge,这对于系统的I/O和内存有较大的影响,如果对于实时性要求比较低,可以适当调大index.refresh_interval的值,减少IO操作,这样子可以在一定程度上提升写入速率。
05
增大indexing buffer
与上一个建议策略类似,elasticsearch进行索引操作时,数据首先会写入内存缓冲区,这个区域被称为indexing buffer,当indexing buffer满了的时候,会触发刷盘操作,indexing buffer的大小由以下配置确定:
- indices.memory.index_buffer_size
默认为整个堆空间的10%,indexing buffer是针对shard的,每个shard都有自己的indexing buffer,所以这个配置需要除以所在节点所有的shard数目。 - indices.memory.min_index_buffer_size
indexing buffer的最小值,默认为48MB。 - indices.memory.max_index_buffer_size
indexing buffer的最大值,默认为无限制。
当存在大量的数据索引的时候,可以适当的增加indexing buffer,减少刷盘的操作。
06
优化段合并
要避免写入的过程中出现大量的段合并,因为段合并会对I/O和内存有比较大的压力,从ES2.X开始通过以下配置来控制段合并策略:
- index.merge.scheduler.max_thread_count
配置用于segments merge的最大线程数目,默认为Math.max(1,Math.min(4,Runtime.getRuntime().availableProcessors()/2)),如果只有一块硬盘且非SSD,则应该设置为1,因为旋转存储介质每次需要寻址,无法实现并发写,多个线程导致竞争,写入速度更慢。 - index_merge.policy.*
配置merge的策略,默认有三种策略: tiered(默认)、log_byete_size、log_doc,索引创建以后策略就被确定下来无法更改,但可以动态更新策略参数,例如如果merge比较多的话,可以调整index.merge.policy.segments_per_tier,该属性指定了每层分段的数量,值越小,segments越少,则merge操作越多.可以适当增加该值,减少merge。 - index_merge.policy.max_merged_segment
指定单个segment的最大容量,默认为5GB,可以根据需要适当调小此值,因为此值越大也就意味着可以合并更多的segment。
07
使用bulk请求
批量写比单写一个文档的效率更高,可以适当使用bulk请求来提升写入效率,不过要注意请求的整体字节数不要太大,以免对内存造成压力。
bulk请求属于计算密集型的操作,应该设置固定大小的线程池,建议CPU核心数+1,不宜过多导致大量的线程上下文切换,同时,配置适当大小的队列长度,来不及处理的请求放入队列之中。
08
shard均匀分布
通过配置path.data为多个目录,每个目录挂载不同的磁盘,享受磁盘的并行读取和写入,相当于实现了RAID 0,提升了写入的能力,并且因为elasticsearch本身具备副本机制,所以一定程度上也保证了数据的安全性。
09
优化Lucene索引过程
从Lucene索引的过程出发,减少中间过程消耗的时间,降低CPU占用率及I/O,主要有以下方面:
- 索引文档时使用自动生成doc ID的方式,不要指定id,因为指定id会涉及到读取原来的doc版本号的操作。
- 认真考虑字段是否可能使用到,没使用到的字段不要放入Elasticsearch。
- 不需要被索引的字段的index属性设置为not_analyzed或者no。
- 减少被索引的字段的长度,只保留必要的长度。
- Elasticsearch6.0之前的版本,禁用all字段,使用特定字段的查询代替all类型的查询,例如query_string和simple_query_string,这样子可以减少内存损耗和复制操作。
- 如果不在乎评分,则对于Analyzed的字段在mapping中将norms设置为false,禁用norms,节省一些写操作和空间。
相关推荐
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
-
前言:本文章是在同处局域网内的两台windows电脑,且MySQL是5.5以上版本下进行的一主多从同步配置,并且使用的是集成环境工具PHPStudy为例。最后就是ThinkPHP5的分布式的连接,读写...
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
-
thinkphp5多语言进行切换的步骤:第一步,在配置文件中开启多语言配置。第二步,创建多语言目录。相关推荐:《ThinkPHP教程》第三步,编写语言包。视图代码:控制器代码:效果如下:以上就是thi...
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
-
FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。主要特性基于Auth验证的权限管理系统支持无限级父子级权限继承,父级的管理员可任意增删改子级管理员及权限设置支持单...
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
-
本文实例讲述了Thinkphp5.0框架实现控制器向视图view赋值及视图view取值操作。分享给大家供大家参考,具体如下:Thinkphp5.0控制器向视图view的赋值方式一(使用fetch()方...
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
-
由于之前写评论回复都是使用第三方插件:畅言所以也就没什么动手,现在证号在开发一个小的项目,所以就自己动手写评论回复,没写过还真不知道评论回复功能听着简单,但仔细研究起来却无法自拔,由于用户量少,所以...
- ThinkPHP框架——实现定时任务,定时更新、清理数据
-
大家好,我是小蜗牛,今天给大家分享一下,如何用ThinkPHP5.1.*版本实现定时任务,例如凌晨12点更新数据、每隔10秒检测过期会员、每隔几分钟发送请求保证ip的活性等本次分享,主要用到一个名为E...
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
-
BeyongCms内容管理系统(简称BeyongCms)BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统,适用于企业Cms,个人站长等,针对移动App、小程序优化;提供完善简...
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
-
介绍YimaoAdminv3.0.0企业建站系统,使用thinkphp5.1.27+mysql开发。php要求5.6以上版本,推荐使用5.6,7.0,7.1,扩展(curl,...
- ThinkAdmin-V5开发笔记(thinkpad做开发)
-
前言为了快速开发一款小程序管理后台,在众多的php开源后台中,最终选择了基于thinkphp5的,轻量级的thinkadmin系统,进行二次开发。该系统支持php7。文档地址ThinkAdmin-V5...
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
-
复现先搭建thinkphp5.0.9环境...
- thinkphp5出现500错误怎么办(thinkphp页面错误)
-
thinkphp5出现500错误,如下图所示:相关推荐:《ThinkPHP教程》require():open_basedirrestrictionineffect.File(/home/ww...
- Thinkphp5.0极速搭建restful风格接口层
-
下面是基于ThinkPHPV5.0RC4框架,以restful风格完成的新闻查询(get)、新闻增加(post)、新闻修改(put)、新闻删除(delete)等server接口层。1、下载Thin...
- 基于ThinkPHP5.1.34 LTS开发的快速开发框架DolphinPHP
-
DophinPHP(海豚PHP)是一个基于ThinkPHP5.1.34LTS开发的一套开源PHP快速开发框架,DophinPHP秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机...
- ThinkPHP5.*远程代码执行高危漏洞手工与升级修复解决方法
-
漏洞描述由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell。漏洞评级严重影响版本ThinkPHP5.0系列...
- Thinkphp5代码执行学习(thinkphp 教程)
-
Thinkphp5代码执行学习缓存类RCE版本5.0.0<=ThinkPHP5<=5.0.10Tp框架搭建环境搭建测试payload...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
- thinkphp5多语言怎么切换(thinkphp5.1视频教程)
- 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin
- Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示
- thinkphp5实现简单评论回复功能(php评论回复功能源码下载)
- ThinkPHP框架——实现定时任务,定时更新、清理数据
- BeyongCms系统基于ThinkPHP5.1框架的轻量级内容管理系统
- YimaoAdminv3企业建站系统,使用 thinkphp5.1.27 + mysql 开发
- ThinkAdmin-V5开发笔记(thinkpad做开发)
- thinkphp5.0.9预处理导致的sql注入复现与详细分析
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)