Es读写调优、深度分页

news2024/12/29 10:01:00

写入

ES支持四种对文档的数据写操作

create:如果在PUT数据的时候当前数据已经存在,则数据会被覆盖,如果在PUT的时候加上操作类型create,此时如果数据已存在则会返回失败,因为已经强制指定了操作类型为create,ES就不会再去执行update操作。

delete:删除,ES对文档的删除是懒删除机制,即标记删除。(.del文件)

index:创建索引

update:包括全量替换、部分替换

写流程

es中数据写入都是在主分片中;副本分片不支持写入,只读的

客户端发起写入请求到node x,node x根据文档id进行一系列计算,在路由表中确定当前数据在分片a,分片a的主分片位于node y上,将数据转发至node y

数据在node y写入成功后,将数据的同步请求转发至分片a的副本分片上,等待所有副本数据写入成功(根据写入一致性策略),将结果报告给node x,并由node x将结果返回给客户端

写入一致性策略

参数:wait_for_active_shards

确定客户端返回数据之前必须处于active 的分片数(包括主分片和副本)

默认为 wait_for_active_shards = 1,即只需要主分片写入成功

设置为 all或任何正整数,最大值为索引中的分片总数 ( number_of_replicas + 1 )。

如果当前 active 状态的副本没有达到设定阈值,写操作必须等待并且重试,默认等待时间30秒,直到 active 状态的副本数量超过设定的阈值或者超时返回失败为止。

如果主分片写入失败,默认等待1分钟

写入原理

 

1. 客户端的操作会先写入内存缓冲区,内存缓冲区有固定大小,等内存缓冲区满了或者时间间隔到了(1s)

2. 执行refresh操作,生成对应的segment文件(lucene的索引文件),并立刻同步到OS cache中

3. segment文件同步到OS chache后,segment处于open状态,此时,segment中的数据就可以查询了(此时,数据还没有同步到磁盘中)

4. OS cache中的数据满了会执行fsync操作,将数据同步到OS disk

5. OS cache中的数据是断电易失的,需要Translog来保证数据安全,translog是append的形式写的,直接写在磁盘上。OS cache同步到OS disk后,会同步后会清空translog

refresh操作可以手动执行,减少数据延迟

segment文件越来越多,segment消耗操作系统句柄,需要定期进行合并,

merge操作

将多个segment文件合并成一个大的segment文件

merge操作也消耗资源,不能过于频繁

OS cache满了,或者translog满了,都会触发fsync操作

flush:是把内存中的数据(包括translog和segments)都刷到磁盘

写入调优

分为两种情况,高频低量和低频高量

1. 关闭副本,写入成功后再打开副本(低频高量)

2. 增加 flush 时间间隔:减小数据写入磁盘的频率

3. 增加refresh_interval的参数值:减少segment文件的创建

4. 增加Buffer大小:本质也是减少refresh

5. 禁用swap

6. 使用多个工作线程

7. 避免使用稀疏数据

8. max_result_window参数:分页返回的最大数值,默认10000,对JVM的一种保护机制

查询调优

写入性能和查询性能不可能都会好的,要看项目更侧重哪个

要写入实时性换取查询性能

1. 避免大单页查询

2. 避免单个文档过大

3. 增加内存:OS cache

4. 使用filter代替query

5. 避免深度分页

6. 使用keyword类型:不分词,integer、long

7. 避免使用脚本

深度分页

问题

from + size大于10000的时候,就会出现问题

没有指定排序字段的情况下,默认按照评分score来排序 

scroll search 

 一般情况下要避免进行深度分页,无法避免可以使用scroll search 滚动查询

es7开始,官方不推荐使用滚动查询,因为无法保存索引状态

滚动查询适用于单个请求中检索大量结果,不适用与To C端

scroll用法

查询条件加scroll

GET my-index-000001/_search?scroll=1m
{
  "size": 100,
  "query": {
    "match": {
      "message": "foo"
    }
  }
}
'

 scroll的值是时间,例如,上面的查询结果只在1分钟内生效,时间单位越小越好

 查询结果会返回scroll_id,用于下一页查询

Scroll上下文的存活时间是滚动的,下次执行查询会刷新,也就是说,不需要足够长来处理所有数据,它只需要足够长来处理前一批结果。

保持旧段处于活动状态意味着需要更多的磁盘空间和文件句柄。

为防止因打开过多Scrolls而导致的问题,不允许用户打开超过一定限制的Scrolls。

默认情况下,打开Scrolls的最大数量为 500。此限制可以通过search.max_open_scroll_context集群设置进行更新 。

问题

scroll search很消耗资源,不要滥用

search after

search after 是无状态的,推荐使用

需要有固定唯一的排序

用法

查询条件需要有固定唯一的排序

查询结果会返回sort,

下一页查询时,使用上一页的sort

问题

search afer只能往后查询,不能查询前面的内容

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

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

相关文章

Spring核心 AOP

1.什么是AOP? AOP(Aspect Orient Programming),直译过来就是面向切面编程。AOP是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面…

【笔试强训选择题】Day9.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…

open3d Image和numpy互转,PointCloud和numpy互转

目录 1. open3d.geometry.Image转numpy 2. numpy 转 open3d.geometry.Image 3. numpy转PointCloud 4. PointCloud转numpy 1. open3d.geometry.Image转numpy np_x np.asarray(x) # (h,w,3) import numpy as np import matplotlib.pyplot as plt import matplotlib.image…

鸿蒙Hi3861学习十-Huawei LiteOS-M(消息队列)

一、简介 消息队列,是一种常用于任务间通信的数据结构,实现了接收来自任务或中断的不固定长度的消息,并根据不同的接口选择传递消息是否存放在自己空间。任务能够从队列里面读取消息,当队列中的消息是空时,挂起读取任务…

EC6108V9/V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包

EC6108V9/V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软…

C#学习笔记--实现一个可以重复权重并且能够自动排序的容器--MultiplySortedSet

目录 前言SortedSetC#自带类型自定义类SortedSet权值重复 需求自定义容器 -- MultiplySortedSet核心实现思路 MultiplySortedSet 使用C#自带类型自定义类 前言 最近需要在C#中实现一个功能 有一个容器,该容器能自动对里面的元素进行排序,类似C的优先队列…

fast中user_id如何显示user表中的名称_关联模型

问题:编辑框内的user_id显示的是nickname 列表里如何显示nickname或是username 解决方案如下: 需要更改3个地方,控制器,模型,js文件 1.控制器index list($where, $sort, $order, $offset, $limit) $this->build…

ES6D: 利用对称性进行高效的6D姿态检测

利用对称性进行高效的6D姿态检测 本文参考自CVPR2022的这篇文章:ES6D: A Computation Efficient and Symmetry-Aware 6D Pose Regression Framework Github链接为:https://github.com/GANWANSHUI/ES6D 介绍 在6D姿态检测中,一些具备对称性的…

米哈游的春招实习面经,问的很基础

米哈游的春招实习面经,主要考察了java操作系统mysql网络,这四个方面。 面试流程,共1小时,1min自我介绍,20min写题,剩下问题基础知识。 Java String,StringBuilder, StringBuffer区…

注意力模型

如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。 在翻译“杰瑞”这个中文单词…

低代码/0代码(无代码)开发平台如何选型?这篇文章告诉你

随着数字化转型的加速,越来越多的企业开始寻求低代码或零代码开发平台来加速应用程序的开发和部署。选对合适的平台是至关重要的,因为这将决定企业能否在数字化转型中保持竞争优势。 市面上的低/零代码平台五花八门,在选型的时候需要考虑哪些…

搭建本地仓库源

一、如何搭建仓库源 之前讲了定制ISO的方法:使用chroot定制系统,但有时候我们想自定义的安装包不在上游的仓库源中,在我们本地应该怎么办呢?如果我们将deb包拷贝到iso目录再安装有点过于麻烦了,而且还可能需要手动处理…

Linux 常见命令与常见问题解决思路

Linux 常见命令 Linux 基础命令目录相关查看文件(日志)查看普通的文件查看压缩的文件 解压压缩Linux 系统调优topvmstatpidstatps vi/vim 编辑文件查找文件属性相关定时任务scp 复制文件和目录awk 分隔cutsort 与 uniq常见问题处理思路CPU 高系统平均负载…

数组存储与指针学习笔记(一)数据类型与存储、数据对齐、数据移植、typedef

数据类型与存储 一、数据类型与存储1.1 大端模式与小端模式1.2 有符号数和无符号数1.3 数据溢出1.4 数据类型转换 二、数据对齐2.1 为什么非要地址对齐2.2 结构体对齐2.3 联合体对齐 三、数据的可移植性四、Linux内核中的size_t类型五、typedef5.1 typedef的基本用法5.2 typede…

python操作集合

# 集合 l{1,2,1} print(l) sset(range(5)) print(s)# 判断in 或 not in print(5 not in l) # 集合元素新增操作 l.add(4) l.update(1,3,6) print(l) l.update((1,3,5)) l.update([4,4,6]) # 删除集合元素 l.remove(2) l.discard(2) # 无目的的删除 自己不带参数 l.pop() l.cl…

【跟着陈七一起学C语言】今天总结:C预处理器和C库

友情链接:专栏地址 知识总结顺序参考C Primer Plus(第六版)和谭浩强老师的C程序设计(第五版)等,内容以书中为标准,同时参考其它各类书籍以及优质文章,以至减少知识点上的错误&#x…

大语言模型(LLM)和基于人类反馈的强化学习(RLHF)

只需三步,构建你的LLM 预训练语言模型 L L M S S L LLM^{SSL} LLMSSL(self-supervised-learning)(指令)监督微调预训练模型 L L M S F T LLM^{SFT} LLMSFT(supervised-fine-tuning)基于人类反馈的强化学习微调 L L M R L LLM^{RL} LLMRL&…

K8s常用命令

Namespace 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中&#…

猪场规模怎样划分?类型都有哪些?

养猪场按照经营方式分为大中小猪场(猪场规模)和集团猪场。集团猪场是指集团化发展与管理的养猪企业,或者简称为集团化养猪企业,重点在于“集团化”。猪场规模则是按照年出栏数量划分。 小规模猪场:年出栏3000头以下&a…

加密芯片在GCP系统的应用方案

物联网(IoT)设备正在迅速发展,越来越多的设备连接到互联网并与其他设备进行通信。这使得设备的安全变得更加重要,因为它们可能会暴露敏感的数据和功能。Google Cloud IoT Core(GCP)是一个完全托管的服务&am…