Elasticsearch这几个很常见却很容易答错的问题,你都能答对吗?

大厂比较常见的10个JavaScript笔试题解析,大家能答上来几个? 作为JavaScript开发人员,我们可以挑战自己成长的一个方法就是用刷题来练习!下面的问题旨在具有挑战性和启发性。如果你确切地知道如何回答每一个问题,那很好,但如果你答错了,并知道为什么答错了,我认为那就更好了! 问题1:数组排序比较 考虑以下数组。在不同的排序条件中会输出什么? const arr1 = [‘a’, ‘b’, ‘c’]; const arr2 = [‘b’, ‘c’, ‘a’]; console.log( arr1.sort() === arr1, arr2.sort() == arr2 阅读详情

前言

elasticsearch发展至今,已经发展到7.X版本了,而其中的小版本更是不胜枚举。而每个版本的发布就会带来新的特性的加入以及旧的特性的修改,这就造成了elasticsearch的配置和使用方法不能一概而论。

在这个背景下,很多过时的使用方法以及配置在新版本就不再适用了;另外很多大家在其他NOSQL上习以为常的操作或者想法,也被平行挪到了elasticsearch上,这就造成了很多的谣言以及留言,本文就针对几个比较常见的问题进行下澄清,帮助大家去伪存真,更好的理解和使用elasticsearch。

另外对于某些知识点,大家平时正常情况下不会遇到,可能也不会去考虑,这里也拿出来几个一说讨论下,希望在特定情况下遇到类似的问题也会有自己的想法。

正文

下面就来讨论几个比较常见的问题以及说法,大家一起去伪存真,从底层了解elasticsearch的工作机制。另外,本文是基于elasticsearch 6.X及以上版本作为讨论的基础,5.X及以下版本可能不适用,请大家按需使用。

elasticsearch到底是先写index buffer还是先写translog

这个问题对于有nosql经验的小伙伴来说,可能会理所当然的认为为了保证数据的安全性,肯定是先写translog,然后再写index buffer。但elasticsearch真的是这么做的吗?

笔者曾经也是这么认为的,也有些人认为是两者同时写入。但是遗憾的是,elasticsearch一反常规,采用了先写入index buffer再写入translog后再返回客户端成功。惊掉了眼镜和下巴的小伙伴肯定觉得难以置信,话不多说,用源码来证明所有问题:

    public IndexResult index(Index index) throws IOException {
       .......
                final IndexResult indexResult;
                if (plan.earlyResultOnPreFlightError.isPresent()) {
                    indexResult = plan.earlyResultOnPreFlightError.get();
                    assert indexResult.getResultType() == Result.Type.FAILURE : indexResult.getResultType();
                } else if (plan.indexIntoLucene || plan.addStaleOpToLucene) {
                 // 将数据写入lucene,最终会调用lucene的文档写入接口
                    indexResult = indexIntoLucene(index, plan);
                } else {
                    indexResult = new IndexResult(
                        plan.versionForIndexing, getPrimaryTerm(), plan.seqNoForIndexing, plan.currentNotFoundOrDeleted);
                }
                if (index.origin().isFromTranslog() == false) {
                    final Translog.Location location;
                    if (indexResult.getResultType() == Result.Type.SUCCESS) {
                        location = translog.add(new Translog.Index(index, indexResult)); 
                    ......
                    // 将数据写入lucene后才开始写translog
                    indexResult.setTranslogLocation(location);
                }
              .......
        }

那elasticsearch为什么会选择这么操作呢?作者也曾经百思不得其解,后来经过网上查询资料以及部分源码的解读,发现大概的原因还是出在Lucene上。

数据在写入Lucene的segment时,Lucene会再对数据进行一些校验,有可能出现写入Lucene失败的情况。如果先写translog,那么就要处理写入translog成功但是写入Lucene一直失败的问题,容错成本比较高。所以ES采用了先写Lucene的方式后写translog的方式。

数据在写入index buffer之后在refresh之前真的无法查询吗

这个在大家看来应该是一个真命题了,原理index buffer的数据只有在refresh到os cache中,并生成segment file后才会被搜索到。好像没啥问题啊,但事实真的是这样吗?

其实这种说法不准确,因为上面的说法是数据不会被搜索到,翻译成英语是search,而get操作是可以拿到这条还没有refresh的数据的。如果查询包含get操作,那么上面的说法显然是不对的。那为什么get操作能拿到,search拿不到呢?大家考虑下?

这个之前其实在其他的文章中说过,这里再说一下,想想两者的差别,也就是查询流程的差别就能明白是怎么回事了。详细文章参见:

get操作:

search操作:

大家对比两张图看出差别了吗?

是的,差别就在于get操作首先读取的是translog数据,新数据在写入index buffer后也写入到了os cache的translog,所以在refresh之前就可以被查到;而search首先查询的是heap中的fst数据,这个数据是segment的前缀树索引,用以加速segment的查询,所以必须在flush以后才会被查询到。

单机elasticsearch服务crash之后会丢数据吗

这个问题其实就是在考察elasticsearch的failover机制。大家肯定知道elasticsearch的translog用以在服务crash后恢复数据,但是新数据写入时写入到的translog在os cache中,这样会不会丢数据呢?

答案是不会也会。为什么是这个答案呢?等于没说啊,下面就来分开说明下这两种场景。

首先说不会是因为在elasticsearch的默认配置下是不会丢数据的。这是为何?看下面几个配置项:

  • index.translog.durability:可选值(request(默认值),async)

  • index.translog.sync_interval:默认值5s

其实首先写入translog到os cache中其实是为了增加elasticsearch的写入效率,增大elasticsearch的写入吞吐量而做的设计。不管是为了提高内存使用效率还是最终保证数据安全,translog最终肯定会写入到disk的,即translog的flush操作。所以translog的flush周期就决定了elasticsearch的服务crash后会不会丢数据,以及丢多少数据。

回到那两个配置项:index.translog.durability这个配置项默认是request,就代表着elasticsearch默认会针对每个tranlog的写入都直接flush到硬盘,然后才返回客户端写入成功。在这种情况下,elasticsearch就不会丢数据了。

但是这种默认的配置虽然数据安全性得到了保障,但是一眼就能看到问题,每个request的操作都flush的话,效率明显会大受影响,那tranlog首先写入os cache增加效率和吞吐量的优势将荡然无存。所以除非数据安全性要求特别高的场景下会这么选择外,大部分场景下都会使用async配置项来增加elasticsearch的写入效率和吞吐量。

使用了async配置项后,上面的第二个配置项index.translog.sync_interval就会起作用,其意义就是os cache中的tranlog会异步flush到disk上,每5s执行一次。大家可以根据自己的场景来调整这个参数。在这种配置下,单机版的elasticsearch服务crash掉后就会丢数据了,而丢数据的量取决于index.translog.sync_interval这个参数配置的值,默认会丢5s的数据。

elasticsearch到底是强一致性数据库还是最终一致性数据库

这个问题其实就是在考察elasticsearch的shard多副本的同步机制了。这个就是一个参数控制的wait_for_active_shards。这个值的取值是在1到replica数量+1(即所有副本数量)。这里如果选择all(所有副本)的话,那么elasticsearch就会成为强一致性的数据库,能满足CAP属性中的CP,在保证了一致性的时候牺牲了可用性,即一个replica不可用后写入就会失败;而配置成其他值的时候elasticsearch就是最终一致性的数据库,能满足CAP属性中的AP,在保证了高可用性的时候牺牲了一致性(达到了弱一致性或最终一致性)。

至于把elasticsearch当强一致性数据库还是最终一致性数据库使用则完全看使用场景了。大多数情况下,elasticsearch还是作为最终一致性数据库使用。wait_for_active_shards这个值则取决于能容忍几个replica挂掉而进行相应的配置。

elasticsearch某个replica写入失败后,会导致脏读吗

众所周知,elasticsearch多有的replica都会提供读数据的服务。而到底使用哪个replica进行数据读取则使用round robin(轮询)算法进行选择。

那这样就会有问题了,如果某些replica写入失败未存储最新数据,会不会被client读到而造成脏读呢?

答案肯定是不会了,那么elasticsearch是怎么处理来避免这种情况的发生呢?

首先先来看看Replica写入失败后elasticsearch会怎么处理:

Replica写入失败,Primary会执行一些重试逻辑,尽可能保障Replica中写入成功。如果一个Replica最终写入失败,Primary会将Replica节点报告给Master,然后Master更新Meta中Index的InSyncAllocations配置,将Replica从中移除,移除后它就不再承担读请求。

在Meta更新到各个Node之前,用户可能还会读到这个Replica的数据,但是更新了Meta之后就不会了。所以这个方案并不是非常的严格,考虑到ES本身就是一个近实时系统,数据写入后需要refresh才可见,而且elasticsearch大多数场景下也是一个最终一致性的数据库,所以一般情况下,在短期内读到旧数据应该也是可接受的。

最后看一下elasticsearch的cluster state中的in_sync_allocations配置,查询数据时round robin(轮询)算法轮询的replica列表就是从这里拿到的:

这里面的id对应的就是cluster state中每个replica对应的id。

总结

上面的这几个场景在大家日常的工作中可能接触的不多,甚至不会考虑和接触到。但是在某些极端和特殊情况下很有可能就要考虑这些问题,所以对大家理解和掌握elasticsearch还是很有帮助的。而且弄清楚这些问题也会帮助大家了解elasticsearch内部的一些底层实现机制,进而进阶和精通elasticsearch。

退一万步讲,当你和别人讨论elasticsearch或者面试的时候,能了解这些特殊情况下elasticsearch的机制与使用,也会让对方对你刮目相看。

最后路漫漫其修远兮,大数据之路还很漫长。如果想一起大数据的小伙伴,欢迎点赞转发加关注,下次学习不迷路,我们在大数据的路上共同前进!

挂个公众号二维码,公众号的文章是最新的,优快云的会有些滞后,想追更的朋友欢迎大家关注公众号,谢谢大家支持。 

公众号地址:

Ubuntu无桥接模式或连不上网(详细解决方法 目录 问题1:Ubuntu没有未桥接的主机网络适配器 解决方法 1.打开VMware安装目录下的文件 ​编辑2.右键安装以上三个文件 3.打开网络状态属性,找到VMware bridgeProtocol,点击安装 问题2.Ubuntu桥接模式连不上网 1.win+r打开cmd终端,输入ipconfig /all 2.记录以下数据 3.打开VMware网络设置 问题1:Ubuntu没有未桥接的主机网络适配器 VMWare安装之后,虚拟网络一直使用默认配置 VMnet0为... 阅读详情

相关推荐

玩转Isaac Sim动态控制:从随机舞动到精准操控Franka的5种控制模式实测

本文深入实测了在NVIDIA Isaac Sim仿真平台中,利用Dynamic Control模块对Franka机械臂进行精准操控的五种核心模式:位置控制、单关节位置控制、速度控制、单关节速度控制和力矩控制。通过详细的代码示例和对比分析,阐述了每种模式的适用场景、参数调优技巧及从随机运动到闭环控制的实现路径,为机器人算法验证提供了实用指南。

night的博客 807

Elasticsearch 技术分析(七): Elasticsearch 的性能优化

硬件选择 Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在 ES 的配置文件../config/elasticsearch.yml中配置,如下: # ----------------------------------- Paths ------------------------------------ # # P...

JaJian的博客 1564

深入解析CycloneDDS跨域通信中的XML配置文件优化策略

本文深入解析了CycloneDDS跨域通信中XML配置文件的优化策略,重点介绍了网络接口配置、多播设置、性能调优参数及复杂场景下的配置案例。通过实战技巧和调试方法,帮助开发者在SoC环境中实现高效稳定的跨域通信,提升系统性能。

soda5的博客 688

Elasticsearch性能优化总结

Elasticsearch是目前大数据领域最热门的技术栈之一,经过近8年的发展,已从0.0.X版升级至6.X版本,虽然增加了很多的特性和功能,但是在主体架构上,还是没有太多的变化。下面就把我对于ES使用实践的一些经验总结一下,供大家参考;也请大家拍砖。 一、 硬件环境选择: 如果有条件,尽可能使用SSD硬盘, 不错的CPU。ES的厉害之处在于ES本身的分布式架构以及lucene的特性。IO的提升,会极大改进ES的速度和性能。 二、系统拓朴设计: ES集群在架构拓朴时,一般都会采用Hot-Warm的架

yht520100的专栏 1591

PaddleOCR多进程GPU推理实战:200万图片高效处理方案

本文详细介绍了PaddleOCR多进程GPU推理在高效处理200万张图片OCR任务中的实战方案。通过优化GPU利用率、多进程并发和关键参数调优,实现了从单进程3000张/小时到8进程3万张/小时的性能飞跃,为大规模OCR处理提供了可靠解决方案。

prometheus9mon的博客 260

密码学小白必看:三大顶级会议论文下载与阅读指南(附完整资源链接)

本文为密码学初学者提供了系统获取和阅读三大顶级会议(Crypto、Eurocrypt、Asiacrypt)论文的实战指南。详细介绍了通过IACR官方渠道、ePrint预印本等权威资源免费下载论文的方法,并分享了高效筛选、精读核心章节及构建个人知识体系的具体策略,帮助读者快速切入密码学研究前沿。

weixin_28363123的博客 389

ES--优化写入速度的方法--修改配置

本文介绍如何优化ElasticSearch的写入性能。

IT利刃出鞘的博客 2859

从安装到出图:一份给振动测试新手的LMS Test.Lab 2021完整避坑手册(含许可证更新和常见弹窗解决)

本文为振动测试新手提供LMS Test.Lab 2021的完整使用指南,涵盖安装配置、许可证更新、数据采集到频域后处理的全流程。特别针对常见弹窗错误提供解决方案,并详细讲解Colormap时频图分析技巧,帮助用户快速掌握振动数据分析核心技能。

weixin_29268331的博客 977

elasticsearch参数优化

写入速度优化 提升写入速度从以下几方面入手: · 加大translog flush间隔,目的是降低iops、writeblock。 ES 2.x开始,在默认设置下,translog的持久化策略为:每个请求都“flush”。对应配置项如下: index.translog.durability: request 由于数据既没有刷到Lucene,translog也没有刷盘,恢复时translog中没有这个数据,数据丢失),则调整translog持久化策略为周期性和一定大小的时候“flush”,例如: index.

wqy1200的专栏 2096

SAP-ABAP:SAP库存管理核心增强:IF_EX_MB_DOCUMENT_BADI 深度解析

SAP库存管理核心增强:IF_EX_MB_DOCUMENT_BADI 深度解析

baidu_35680696的博客 1446

算法真的是个很有用的东西,通过python或者golang实现对N张图片的自动排版,每张图片的长和宽都不一样,有的是横图,有的是竖图,最终需要生成一张完整的矩形图片

算法真的是个很有用的东西,通过python或者golang实现对N张图片的自动排版,每张图片的长和宽都不一样,有的是横图,有的是竖图,最终需要生成一张完整的矩形图片。

代码讲故事 501

ElasticSearch性能优化详解

为了提高索引性能,Elasticsearch 在写入数据的时候,采用延迟写入的策略,即数据先写到内存中,当超过默认1秒(index.refresh_interval)会进行一次写入操作,就是将内存中 segment 数据刷新到磁盘中,此时我们才能将数据搜索出来,所以这就是为什么 Elasticsearch 提供的是近实时搜索功能,而不是实时搜索功能。_all 字段及 _source 字段的使用,应该注意场景和需要,_all 字段包含了所有的索引字段,方便做全文检索,如果无此需求,可以禁用;

hellozhxy的博客 2678

成功解决使用jupyter notebook命令打开原先存的.ipynb文件突然消失的问题

成功解决使用jupyter notebook命令打开原先存的.ipynb文件突然消失的问题 目录 解决问题 解决思路 解决方法 T1、修改默认配置 T2、修改后缀参数(此方法是其他网友推荐,博主没有尝试) T3、如果以上还不成功,这个时候很可能是环境配置有问题 解决问题 使用jupyter notebook命令打开原先存的.ipynb文件突然消失的问题 解决思路 使用jupyter notebook命令打开原先存的.ipynb文件突然消失,说明...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5115

hihocoder 1285 智力竞赛 dp 类多重背包问题

题目连接  思路: 这个题算是一个类多重背包的问题吧,dp[i][j],表示第i关时回答了j道题至少答对了几道题目; 那么对于每一关的积分a[i]我们可以求出所要答对问题的最大值,然后在m道题的范围内枚举答对的次数,用答错题x来补剩余的分数,然后维护这个最小值. #include #define Ri(a) scanf("%d", &a) #define Rl(a) scanf("%lld

Marcus-Bao的个人主页 738

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java实现奇怪的比赛

** 奇怪的比赛** 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。 每位选手都有一个起步的分数为10分。 某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗? 如果把答对的记为1...

南 墙 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

简单java的for循环案例(随机产生10道加法题,用户进行答题,答对一题+10分,答题不加分)

System.out.println("请您开始答第("+i+")道题目" + ":" + num1 + "+" + num2 + "=" + "?i++) {// 循环10次跳出循环。if (n == result) {// 判断输入结果和两个随机数之和是否相等。System.out.println("答对了:" + count + "道题");System.out.println("总分:" + score);System.out.println("输入答案:");// 回答正确分数+10。

qq_51062772的博客 786

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

23年蓝桥杯省赛A组填空题:有奖问答 C++动态规划题解

原题链接:用户登录。

weixin_68629353的博客 1775

Agent 为什么一接 SQL 就开始答对表名却答错口径:从 Semantic Layer 到 Query Sandbox 的工程实战

很多团队把 Agent 接到数仓、BI 或湖仓查询后,发现最难治理的并不是 SQL 语法,而是业务语义。模型能写出可执行查询,却经常把测试订单、退款重试、快照错位和跨租户数据一起算进答案。本文围绕 Agent SQL 的高频翻车点,拆解指标口径、Join 纪律、权限边界和成本门禁为什么必须一起治理,并给出更适合生产环境的 Semantic Layer 与 Query Sandbox 方案。

m0_56902859的博客 379

Java中this关键字使用小结,这个问题你能答对吗?

Java中this关键字使用小结,这个问题你能答对吗?

技术宅,专注云原生、Go、Linux、Java等技术分享,原创文章、效率工具、实战解决方案!关注我,了解互联网动态,学 IT 不迷路 739

蓝桥杯竞赛java本科-奇怪的比赛

问题描述: 某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。 每位选手都有一个起步的分数为10分。 获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗? 如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。 你的任务是

m0_46428731的博客 877

python智力问答游戏,python 答题小游戏

#^_^coding=gbk ^_^import linecache#数据分割f = [ x.replace('\n','') for x in linecache.getlines('a.txt')]items = [filter(lambda k:k.startswith(str(x)),f) for x in range(1,6)]items1 = filter(lambda k:k.sta...

weixin_34268604的博客 984

奇怪的比赛(蓝桥杯)

四、奇怪的比赛     某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:     每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。     每位选手都有一个起步的分数为10分。     某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个

Achiberx 2062

C++ 奇怪的比赛

题目要求 选手初始分数为10,在10个问题中,答对的话,分数翻倍;答错的话,扣掉与题号相同的分数(不回答按错误处理)。最后得分为100时,算出所有答题的情况,答对记作1,答错记作0. 2.2解决方法 逐步递归,将每次答错和答对的情形通过程序表示出来,存在数组中,如果最后得分等于100,输出该数组. 2.3程序 2.3.1程序 #include <cstdio> using namespace std; const int N = 15; int p[N]; void dfs(int

m0_59003809的博客 400

python答题_python 答题小游戏

#^_^coding=gbk ^_^import linecache#数据分割f = [ x.replace('\n','') for x in linecache.getlines('a.txt')]items = [filter(lambda k:k.startswith(str(x)),f) for x in range(1,6)]items1 = filter(lambda k:k.sta...

weixin_39533659的博客 334
上一篇: 一个HBase查询问题引发的思考,作为HBase使用者这个问题你知道答案吗?
下一篇: Kafka的安全性、幂等性以及有序性,这些面试常客你都掌握了吗?
梦回从前
博客等级 码龄18年 65粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值