Elasticsearch 需要了解的都在这

ES选主过程?

其实ES的选主过程其实没有很高深的算法加持,启动过程中对接点的ID进行排序,取ID最大节点作为Master节点,那么如果选出来的主节点中存储的元信息不是最新的怎么办?

其实他是分了2个步骤做这件事,先选出ID最大的主节点,然后再从元信息最新的节点将元信息数据复制到选举出来的主节点

当然虽然是选出ID取值最大的节点作为主节点,但是内部还是有一定限制逻辑的:

  1. 参选人数需要过半,达到 quorum(多数)后就选出了临时的主。为什么是临时的?每个节点运行排序取最大值的算法,结果不一定相同。举个例子,集群有5台主机,节点ID分别是1、2、3、4、5。当产生网络分区或节点启动速度差异较大时,节点1看到的节点列表是1、2、3、4,选出4;节点2看到的节点列表是2、3、4、5,选出5。结果就不一致了,由此产生下面的第二条限制。

  1. 得票数需过半。某节点被选为主节点,必须判断加入它的节点数过半,才确认Master身份。解决第一个问题。

  1. 当探测到节点离开事件时,必须判断当前节点数是否过半。如果达不到quorum,则放弃Master身份,重新加入集群。如果不这么做,则设想以下情况:假设5台机器组成的集群产生网络分区,2台一组,3台一组,产生分区前,Master位于2台中的一个,此时3台一组的节点会重新并成功选取Master,产生双主,俗称脑裂。

选举主分片过程?

Master节点并不知道主分片节点位于哪里,它只能向所有节点上的所有Shard去询问你的website下标是不是0,那么这个询问的请求量就等于 节点数 * Shard数,如果你的规模非常庞大,那么这个将会很耗时,这个时候可能会获取到多份下标为0的请求响应,5.X版本之后主分片的选举是根据一个List<最新主分片>,在这个集合中的分片都是元信息最新的分片数据

高并发写数会不会影响读?

首先写是加锁的,无论是Bulk方式还是普通方式

Bulk方式的写锁

但是这个时候的写锁并不影响读,只是为了确保这一次请求被一个线程处理,这个时候用的是java的可重入锁

Put方式的写锁

这里使用的是可重入读写锁,然后再初始化到Es自己的ReleasableLock中执行

Get方式读取数据读锁

由于读和写使用的是ReentrantReadWriteLock进行加锁,那么读和写之间就是互斥的,所以主分片在写数据到Cache的时候高并发的写是会影响读的性能的,但是此时副分片节点的读不受影响,之后副分片节点也开始处理主分片同步过来的数据时那么副分片的读也会收到影响

数据写入顺序性怎么保证?

每一个写入的文档都有一个_version,每次修改会递增用来判断本次修改命令是执行还是丢弃

10亿数据导入到ES需要7个小时?

我们先看下写入过程:

副本节点越多写入时间越久,因为写入是串行的,主节点写入完成后会并发请求所有副本节点,会等到每一个副本节点响应后才会返回给协调者,无论副本节点是否成功都会等待每一个节点响应

如果没有任何优化的话差不多需要这个时间,如果你的场景是每天都会初始化一次那么多数据到ES的话,我们一定需要优化的,写入优化主要是几个方面:

异步刷盘

可以利用异步刷盘加速写入速度,只要丢失数据的风险是可接受范围就行了

index.translog.durability:async

调整副本数

ES副本数过多的时候就会导致写入缓慢,看上面的流程应该比较清楚了,每次大数据量导入之前将副本节点数调整成0是加速写入最直接的办法

BULK批量写入

通过API一条条写入的话太慢了,ES是原生支持BULK批量方式操作

调整FLUSH

  • 适当调整max_index_buffer_size大小,不要太频繁的flush,如果你的使用场景不需要数据太实时能被读到,那么适当放大这个值

  • 调整FLUSH时间

调整REFUSH

ES在修改数据的时候并不是修改原数据,而是新增了一条数据然后将原数据打上了delete标记,这样做的好处就是不需要对同一条数据进行加锁,但是坏处就是数据碎片过多需要不定时merge,而merge过程中需要对被merge的数据块获取合并锁但是不影响读

那么如果要提高写入的性能,我们通常还可以调整segment块的大小避免太多碎片出现以及调整merge的时间

public void forceMerge(final boolean flush, int maxNumSegments, boolean onlyExpungeDeletes, final String forceMergeUUID)
    throws EngineException, IOException {
    if (onlyExpungeDeletes && maxNumSegments >= 0) {
        throw new IllegalArgumentException("only_expunge_deletes and max_num_segments are mutually exclusive");}
    //获取合并锁,但是没有抢占读锁
    optimizeLock.lock();try {
        ensureOpen();store.incRef(); // increment the ref just to ensure nobody closes the store while we optimize
        try {
            if (onlyExpungeDeletes) {
                indexWriter.forceMergeDeletes(true /* blocks and waits for merges*/);} else if (maxNumSegments <= 0) {
                indexWriter.maybeMerge();} else {
                indexWriter.forceMerge(maxNumSegments, true /* blocks and waits for merges*/);this.forceMergeUUID = forceMergeUUID;}
            if (flush) {
                flush(false, true);// 这里会删除已经被打上delete标记的数据
                refresh("force-merge");}
        } finally {
            store.decRef();}
    } catch (AlreadyClosedException ex) {
        //释放任何因为异常而未合并的segment
        ensureOpen(ex);failOnTragicEvent(ex);throw ex;} catch (Exception e) {
        try {
            maybeFailEngine("force merge", e);} catch (Exception inner) {
            e.addSuppressed(inner);}
        throw e;} finally {
        optimizeLock.unlock();}
}

为什么我查询ES的RT已经偏高?

可能几种原因:

  1. 查询过于复杂,需要扫描的文档数过多

  1. 缓存命中率太低

  1. 分片节点数据不均匀,大量数据在一个节点

  1. 数据涉及分片过多

查询过于复杂,需要扫描的文档数过多

这个需要在设计数据结构的时候就避免出现,过于嵌套的结构会使后期查询缓慢,如果现在已经是这种结构了,那么可能最好的办法就是将查询语句拆分,分批去ES查询应用本地内存进行最终结果聚合

缓存命中率太低

ES内部其实是会对查询结果集进行缓存的,但是如果你的查询条件参数值都是now()等类型的数据,那么ES是无法缓存的,也就导致你的缓存命中率很低,完全没有用到Cache

分片级别缓存的逻辑
Node级别缓存的逻辑

ShardRequestCache是ES层级的实现,缓存机制为 LRU, 访问一次,就会考虑缓存,主要用途是对聚合结果进行缓存

NodeQueryCache是Lucene层级的实现,缓存机制为 LRU, 访问达到一定频率,才会考虑缓存,主要用途是对filter子查询的缓存

分片节点数据不均匀,大量数据在一个节点

这个如果采用ES原生的hash进行分片的话一般不会出现这个情况,主要是采用了自己的分片策略,这个时候大量请求都在一个节点那么查询性能肯定降低,最好的解决方案是重新Shard

数据涉及分片过多

节点接收到查询请求后,需要并发请求所有分片等待分片的查询结果返回,如果分片节点过多,那么这个场景势必会导致请求很慢,最好的处理方案是指定分片查询,这个就涉及数据写入的时候就设计好

预索引优化

还可以针对某些查询的模式来优化数据的索引方式。例如,如果所有文档都有一个price字段,并且大多数查询在一个固定的范围上运行range聚合,那么可以通过将范围“pre-indexing”到索引中并使用terms聚合来加快聚合速度,新增一个price_range字段,然后创建索引,查询的时候使用这个字段进行查询

我自己能查看哪些是慢查询嘛?

使用Profile API定位慢查询,这个API返回的统计纬度是按分片纬度统计的

ES集群状态为啥会显示Yellow或Red?

一个ES索引由多个分片组成,由于某些原因,某些分片可能会处于未分配状态(Unassigned),导致集群健康处于Yellow或Red状态,这是一种比较常见的错误信息,导致分片处于未分配的原因可能是节点离线、分片数量设置错误等原因,使用Explain API可以很容易分析当前的分片分配情况

GET /_cluster/allocation/explain

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

es-head插件插入查询以及条件查询(五)

es-head插件插入查询以及条件查询 1.es-head插件页面介绍 页面详细介绍 2.es-head查询语句 2.1.查询索引中的全部数据 curl命令交互&#xff0c;采用GET请求 语法格式&#xff1a; curl -XGET es地址:9200/索引名/_search?pretty [rootelaticsearch ~]# curl -XGET 192…

Mac环境变量配置(Java)

1.打开终端&#xff1a; 2.输入命令&#xff1a;【/usr/libexec/java_home -V】,查看默认的jdk下载地址&#xff08;绿色下划线的就是jdk默认路径&#xff09;&#xff08;注意⚠️&#xff1a;命令行终端是区分大小写的【-v 是不对的&#xff0c;必须是大写 -V】&#xff09; …

Windows Server 2016远程桌面配置全过程

镜像下载 系统镜像网址 本次下载的是 Windows Server 2016 (Updated Feb 2018) (x64) - DVD (Chinese-Simplified) 远程桌面配置 Step 1 在开始菜单搜索服务&#xff0c;打开服务器管理器&#xff0c;点击右上角的管理按钮 Step 2 添加角色控制&#xff0c;点击下一步 S…

静态路由+DHCP实验(四路由器八PC)

一.200.1.1.0/24子网划分 1.划分八个子网 2.选用前5个&#xff0c;第五个子网再划分4个子网作为骨干 二.规划路由 三.配置&#xff08;下一跳&#xff09; 1.先依次实现四个路由器之间全网可通 2.为路由器配置地址池&#xff0c;使用全局模式获取dhcp&#xff0c;指定网关…

Springboot是什么

目录 为什么会要用springboot 1、之前 2、现在 springboot优点 springboot四大核心 自动装配介绍 1、自动装配作用是什么 2、自动装配原理 springboot starter是什么 1、starter作用 2、比如&#xff1a;我们想搭建java web框架 3、starter原理 SpringBootApplica…

Endor Labs:2023年十大开源安全风险

近日&#xff0c;Endor Labs发布了一份新报告&#xff0c;确定了2023年的十大开源安全风险。报告显示&#xff0c;许多软件公司依赖于开源软件代码&#xff0c;但在如何衡量和处理与开源软件相关的风险和漏洞方面缺乏一致性。调查发现&#xff0c;在应用程序中超过80%的代码可能…

Go 结构体

目录 什么是结构体 定义结构体 基本的方式实例化结构体 访问结构体的成员变量 指针类型的方式实例化结构体 取结构体地址的方式实例化 知识扩展&#xff1a;*号 和 &号 构造函数 成员函数&#xff08;成员方法&#xff09; 匿名成员变量 方法传入指针类型的结构…

Mac M1通过VMWare Fusion安装Centos7记录(镜像和网络有大坑)

以前用linux系统基本都在我的服务器上或者是在win上进行&#xff0c;从没有在M1上进行创建&#xff0c;因此走了一些坑吧&#xff0c;这里会列出我的详细安装步骤。 下载镜像 镜像的下载网站&#xff1a;https://www.centos.org/download/ 在该网站中&#xff0c;不管是Every…

多级评论单表结构设计

这里的多级&#xff0c;本质上其实也就二级&#xff0c;例如微博的评论&#xff0c; 一级评论&#xff1a; 对微博的评论 二级评论&#xff1a; 对微博下的评论的回复评论 &#xff0c;这里包括二种 1. 回复的是一级评论&#xff0c; 2, 回复的是二级评论 效果如下 表数据 查…

基于微信小程序的图书馆选座系统源码

开发环境及工具&#xff1a; 大等于jdk1.8&#xff0c;大于mysql5.5&#xff0c;idea&#xff08;eclipse&#xff09;&#xff0c;微信开发者工具 技术说明&#xff1a; springboot mybatis 小程序 代码注释齐全&#xff0c;没有多余代码&#xff0c;适合学习&#xff08;…

Android Studio模拟器运行无反应

当Android Studio模拟器点击运行无反应 报以下错误&#xff1a; Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT 问题分析 大多是由于默认路径带有中文&#xff0c;所以找不到 解决方法 1&#xff0c;删除镜像 2&#xff0c;配置环境变量 …

Unity强化学习之ML-Agents的使用

Github下载链接&#xff1a;https://github.com/Unity-Technologies/ml-agents ML-Agents是游戏引擎Unity3D中的一个插件&#xff0c;也就是说&#xff0c;这个软件的主业是用来开发游戏的&#xff0c;实际上&#xff0c;它也是市面上用得最多的游戏引擎之一。而在几年前随着人…

Maven配置—idea版

在java开发中&#xff0c;maven是个不可或缺的工具&#xff0c;可以简单理解成maven是个仓库&#xff0c;可以远程下载各种需要的插件&#xff0c;而且对于项目的打包编译等也非常简单&#xff1b;下面来说说如何配置maven 1. 首先下载maven的工具包&#xff0c;解压之后放在D…

OCR之论文笔记TrOCR

文章目录TrOCR: Transformer-based Optical Character Recognition with Pre-trained Models一. 简介二. TrOCR2.1. Encoder2.2 Decoder2.3 Model Initialiaztion2.4 Task Pipeline2.5 Pre-training2.6 Fine-tuning2.7 Data Augmentation三. 实验3.1 Data3.2 Settings3.2 Resul…

测试用例设计指南

作者&#xff1a;京东物流 王玉坤 软件测试设计是测试过程中重要的测试活动&#xff0c;怎么样设计测试用例能提高我们测试的效率和质量&#xff0c;从以下几个方面做了简单的讲解。 1 测试用例设计原则 测试用例设计的基本原则包括&#xff1a;有效性、清晰性、可复用性、可维…

Linux 0.11

调试介绍 Linux 0.11-调试 Linux 最早期的代码-36 启动跟踪 BIOS 加载 电脑启动&#xff0c;CPU指向0xFFFFFFF0处&#xff0c;这里正好是系统ROM BIOS存放的地址。即开始执行BIOS指令。为了保持向下兼容&#xff0c;就会把与原PC兼容的BIOS代码和数据复制到低端1M末端的64K…

0基础实现微信推送天气,生日等(女朋友快乐眼)

最近微信小程序推送的功能很火&#xff0c;我也是去看了很多攻略&#xff0c;最后选了一个0基础的版本&#xff0c;最后也是实现了推送功能&#xff0c;如图 如何实现&#xff1f; 首先&#xff0c;打开微信官方提供的一个接口生成网址&#xff0c;微信扫码登录&#xff0c;然…

数据挖掘(作业汇总)

目录 环境配置 实验1 数据 作业2 环境配置 实验开始前先配置环境 以实验室2023安装的版本为例&#xff1a; 1、安装anaconda&#xff1a;&#xff08;anaconda自带Python,安装了anaconda就不用再安装Python了&#xff09; 下载并安装 Anaconda3-2022.10-Windows-x86_64.ex…

剑指offer JZ77 按之字形顺序打印二叉树

Java JZ77 按之字形顺序打印二叉树 文章目录Java JZ77 按之字形顺序打印二叉树一、题目描述二、双栈法三、队列reverse()法使用双栈法和队列reverse()法解决剑指offer JZ77 按之字形顺序打印二叉树的问题。 一、题目描述 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍…

【pytorch】深度学习模型调参策略(五):采用贝叶斯工具进行最优参数搜索及最佳步数确认

目录1.如何决定是否应用某个新的超参数配置2.参数优化工具optuna确定最终最优配置为什么在调整的探索阶段使用准随机搜索而不是更复杂的黑盒优化算法&#xff1f;optuna库简介pytorch实现代码搜索参数详解输出结果3.确定每次训练运行的步数使用学习率扫描选择max_train_steps初…
最新文章