【后端面试题】【中间件】【NoSQL】ElasticSearch面试基本思路和高可用方案(限流、消息队列、协调节点、双集群)

news2024/10/6 16:19:18

基本思路

业务开发面试Elasticsearch的时候基本问的是基础知识以及倒排索引。

Elasticsearch最基本的可用性保障就是分片,而且是主从分片,所以遇到Elasticsearch如何做到高可用这个问题的时候,首先要提到这一点。

Elasticsearch高可用的核心是分片,而且每个分片都有主从之分。如果主分片崩溃了,还可以使用从分片,从而保证最基本的可用性。

接着要补充Translog的作用

而且Elasticsearch在写入数据的时候,为了保证高性能,都是写到自己的Buffer里,后面再刷新到磁盘上。为了降低数据丢失的风险,Elasticsearch还额外写了一个Translog,类似MySQL的redo log,如果Elasticsearch崩溃的话,可以利用Translog来恢复数据。

接着尝试把话题引导到准备的高可用方案中

我维护的业务对可用性要求比较高,所以在Elasticsearch的基础上,还做了一些额外的优化,来保证Elasticsearch的高可用

Elasticsearch高可用方案

限流保护节点

限流是一个治标的策略,但是它能够保证Elasticsearch不会因为突发大流量而直接崩溃。

可以通过Elasticsearch的插件机制来实现自定义的限流策略,注意Elasticsearch集群本身提供了限流的功能,也可以通过控制线程池大小和队列大小来间接实现限流的功能。

如果打算利用插件来实现限流功能的时候,就一定能够要有特殊之处。比如可以考虑结合Elasticsearch的内存使用率和CPU使用率设计限流策略。

之前用Elasticsearch的插件机制,设计过一个限流插件。功能比较简单,根据Elasticsearch当前的内存使用率和CPU使用率来判断是否需要执行限流。不管是内存使用率还是CPU使用率,只要超过阈值一段时间,就触发限流。

这里面试官也会考察怎么确定限流的阈值,超过阈值多少才会触发限流,限流之后怎么恢复等问题。

当然,如果你会研发限流插件,你也可以用插件来实现熔断、降级。熔断比较好处理,就是直接拒绝新的查询请求,但是降级这个就要考虑怎么降级了。如果你能够知道不同查询的业务价值,那么你就可以考虑触发降级的时候优先保障核心业务的请求,但是把非核心的请求拒绝了。总而言之,你之前在微服务学习到的熔断、限流、降级的思想,在这里一样适用。

如果你从来没有研发过 Elasticsearch 插件,那么也可以考虑其他两种策略,一种是在 Elasticsearch 之前加一个网关,查询经过网关的时候会被限流、熔断或者降级。当然,引代理也可以。
在这里插入图片描述

目前市面上这方面的产品不多,比较成熟的是极限网关,可以用一种自己了解但是没有实践过的话术说。

我还了解过Elasticsearch网关或代理,希望能够借助这些产品来做Elasticsearch的治理。比如借助网关做熔断、限流、降级这些,但是市面上相关的产品较少,也担心引入网关后的性能损耗,所以最后并没有实施这个方案。

另一种是在客户端这边限流各个业务方需要限制住自己的查询频率,防止把整个Elasticsearch打崩。相比之下,这种方式是最好落地的。

为了保护Elasticsearch,在客户端这边做了限流。比如某个业务的查询都比较慢,对Elasticsearch的压力很大,那么限流的阈值就比较小。

不过 Elasticsearch 设计之初就是为了支持高并发大数据的,所以最佳方式还是要考虑扩容

不管如何,限流都只能算是治标。如果经常触发限流,或者发现 Elasticsearch 有性能问题,那么还是要及时扩容的。

利用消息队列

在一些对数据实时性要求不高的场景下,完全可以考虑在业务方和Elasticsearch中加入一个消息队列。可以抓住关键字 削峰和限流来回答。

之前优化过我们业务的架构,在数据同步到Elasticsearch之前,加入一个消息队列来削峰。在早期的时候,我们都是双写,一方面写数据库,一方面写Elasticsearch,在业务高峰期,Elasticsearch就会有性能瓶颈。

而实际上,我们业务对实时性的要求不高,在这种情况下,引入了消息队列。业务方只是写入数据库就返回,监听binlog并生成消息丢到kafka上。在这种情况下,如果Elasticsearch空闲的话,消费速率就高;如果Elasticsearch性能比较差,消费就比较慢,这样起到削峰和限流的效果

在这里插入图片描述

在这个架构的基础上,还可以考虑引入降级,也就是在 Elasticsearch 真的有性能问题的时候,关闭一部分消费者。

在这个架构的基础上,还做了一个简单的降级。如果有两类消费者写入数据到Elasticsearch,一类是核心数据消费者,一类是非核心数据消费者。

如果我监控到Elasticsearch性能已经比较差了,比如说写入的时候会遇到超时问题,就会把非核心数据消费者停下来。等Elasticsearch恢复过来再启动。

在这里插入图片描述

如果在大促或秒杀这种活动中,可以把整个数据同步都停掉,让Elasticsearch只支持查询操作。如果业务是电商类的,可以考虑这个策略。

保护协调节点

在Elasticsearch里,比较容易出问题的还有协调节点。协调节点类似分库分表代理,负责分发请求,处理结果集。如果一个查询需要消耗非常多的资源,就有可能把协调节点搞崩溃。如果有一个查询命中了10个分片,并且每个分片都返回了几万条数据,协调节点本身的资源使用量一下就会上去,甚至出现CPU100%或OOM问题。

因此要保证Elasticsearch高可用就要考虑防止突发大请求打崩协调节点问题。

整个面试思路是层层递进的。首先你可以指出如果公司内部资源比较多,那么可以考虑部署纯粹的协调节点

要想提高 Elasticsearch 的可用性,就要想办法防止协调节点在遇到大请求的时候崩溃。最简单的做法就是使用纯粹的协调节点。比如说专门部署一批节点,只扮演协调节点的角色。

在这里插入图片描述

接着可以补充怎么用好这些协调节点,关键词就是隔离

如果整个Elasticsearch除了这种纯粹的协调节点,还有一些兼任多个角色的协调节点,那么就可以考虑使用隔离策略。也就是说,如果客户端能够判定自己是大请求,就将请求发送到纯粹的协调节点上,否则发送到其他兼任的协调节点上。

这种做法的好处就是,大请求即使把协调节点打崩了,也只会影响到其他大请求。但是占据绝大多数的普通请求,并不会受到影响。

在这里插入图片描述

这种做法的好处是和隔离结合在了一起,因此你可以尝试把话题引导到隔离策略上。在一些技术实力很强的大厂,它们还会对 Elasticsearch 进行二次开发。可以修改协调节点的逻辑,让协调节点在资源快不足的时候,直接拒绝这种大请求。如果你在大厂,可以了解一下自己公司有没有在这方面做优化。

你可以在这个基础上进一步总结,就是只使用单一角色的节点以提高可用性

在资源足够的情况下,我是建议所有的节点都只扮演单一角色。这样做不仅仅能够带来可用性的提升,也能带来性能的提升。

双集群

双集群算是一个很高级、投入也很大的高可用方案。

最简单的方案就是直接使用付费的CCR跨集群复制,面试的时候简单提一下就可以。

提高 Elasticsearch 可用性还有一个方法,就是使用双集群。比如说直接使用付费的 CCR 功能,不过我司比较穷,肯定是不愿意买的。

在不使用这种付费功能的情况下,就只能考虑自己做了。这里有一个比较简单的方案,假如说有 A 和 B 两个集群,那么基本思路就是这样的:

  • 使用消息队列来保持双写

  • 在查询的时候,优先使用 A 集群,当确认 A 集群出了问题的时候,切换到 B 集群。

在这里插入图片描述

抓住关键词消息队列双写回答。

我们采用的是一个比较简单的双集群方案。就是写入的时候并不是直接写入到 Elasticsearch,而是写入到消息队列,而后启动两个消费者,分别消费消息,然后写到两个集群 AB 里面。关键在于查询的时候,要判断集群 A 有没有出问题,出了问题就切换到集群 B。

而怎么判断集群 A 是否已经出问题,可以参考微服务中判断节点是否健康的部分,思路都是类似的。

具体怎么切换,有两种思路。一种是你使用的客户端切换,一种是利用 DNS 机制切换。也就是说,正常情况下,你使用的 Elasticsearch 的连接信息,DNS 解析的时候返回的是集群 A 的 IP。但是当触发了容灾切换的时候,DNS 解析得到的是集群 B 的地址。

你在回答的时候可以选择其中任意一种,这里我以客户端为例来说一说。

为了实现自动切换的效果,我们对 Elasticsearch 的客户端进行了二次封装。在封装之后,正常情况下,会访问集群 A。同时客户端监控集群 A 的响应时间。如果响应时间超出预期,又或者返回了比较多超时响应,客户端就会自动切换到集群 B 上。

在这里插入图片描述

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

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

相关文章

昇思25天学习打卡营第12天|文本解码原理--以MindNLP为例

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) 文本解码原理--以MindNLP为例 回顾:自回归语言模型 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 𝑊_0:初始上下文单词序…

Unity之HTC VIVE Cosmos环境安装(适合新手小白)(一)

提示:能力有限,错误之处,还望指出,不胜感激! 文章目录 前言一、unity版本电脑配置相关关于unity版本下载建议:0.先下载unity Hub1.不要用过于旧的版本2.不要下载最新版本或者其他非长期支持版本 二、官网下…

鸿蒙项目实战-月木学途:2.自定义底部导航

效果预览 Tabs组件简介 Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabBar是导航页签栏,页面结构如下图所示,根据不同的导航类型,布局会有区别,可以分为底部导航、顶部…

AD PCB板子裁剪与泪滴设置

在剪裁板子时。首先,选择选择板子的机械层,之后选择画线。在原来的板子上画上自己想要裁剪的图形。如下下图 之后,选择按照所画的线裁剪板子即可,如下 在焊接PCB时,为了防止多次焊接导至焊盘脱落可以加大焊点的接触面积…

读AI新生:破解人机共存密码笔记16对人工智能的治理

1. 愚蠢的、情绪化的人类 1.1. 与完美理性所设定的不可企及的标准相比,我们都是极其愚蠢的,我们受制于各种情绪的起伏,这些情绪在很大程度上支配着我们的行为 1.2. 为了充分了解人类的认知,我们(或者更确切地说&…

python中lxml库的使用简介

目录 1.ElementTree 类 2.Element 类 3.ElementTree 类或 Element 类的查找方法 为方便开发人员在程序中使用 XPath 的路径表达式提取节点对应的内容, Python 提供了 第三方库 lxml 。开发人员通过 lxml 库可以轻松地对 HTM…

25考研:今年初试时间比去年更早了?

过去5年考研初试时间安排如下: 24考研:2023年12月23-24日(倒数第二个周末) 23考研:2022年12月24-25日(倒数第二个周末) 22考研:2021年12月25-26日(最后一个周末&#xf…

JVM原理(四):JVM垃圾收集算法与分代收集理论

从如何判定消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”和“追踪式垃圾收集”两大类。 本文主要介绍的是追踪式垃圾收集。 1. 分代收集理论 当代垃圾收集器大多遵循“分代收集”的理论进行设计,它建立在两个假说之上: 弱分…

宇宙第一大厂亚马逊云科技AWS人工智能/机器学习证书即将上线,一篇文章教你轻松拿下

据麦肯锡《在华企业如何填补AI人才缺口》研究表明,到2030年人工智能为中国带来的潜在价值有望超过1万亿美元,而随着各大企业进入人工智能化,对该领域的人才需求将从目前的100万增长到2030年的600万。然而到保守估计,到2030可以满足…

DP(动态规划)【3】 最长公共子序列 最长回文子串

目录 1.最长公共子序列 状态转移方程需要二维数组,1-dim已经不太够了 又是这个问题:如何读入字符串 2.最长回文子串 1.最长公共子序列 状态转移方程需要二维数组,1-dim已经不太够了 这里dp[i][j]是说S的前i位与T的前j位公共序列&#xff…

数据库期末,一篇就够了!【全面】【期末考试】

1. 数据库系统概论 数据库3个特点:永久存储,有组织,可共享 数据库管理技术: 人工管理:无专门的软件,数据不共享,程序与数据不具有独立性 文件系统管理:有专门用于管理数据的应用软…

【python - 数据】

一、序列 序列(sequence)是一组有顺序的值的集合,是计算机科学中的一个强大且基本的抽象概念。序列并不是特定内置类型或抽象数据表示的实例,而是一个包含不同类型数据间共享行为的集合。也就是说,序列有很多种类&…

345亿!博世这次瞄上另一家制造业巨头了,打不过就买下它~

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 汽车零部件巨头博世近日传出收购风声,其目标直指美国家电制造巨头惠而浦。尽管尚未有确切消息证实收购要约的提出,但这一…

OFDM技术简介——背景

l 1966 年, R. W. Chang 提出在带限信道中用 正交信号 同时传输 多路数据 的原理,同时这种传输方式保证系统中不存在符号间串扰和子信道间干扰,该技术可以有效提高频谱利用率,可以有效对抗信道多径衰落。 l 1971 年, …

LLM应用开发-RAG系统评估与优化

前言 Hello,大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者,在上一篇文章中,我们学习了如何基于LangChain构建RAG应用,并且通过Streamlit将这个RAG应用部署到了阿里云服务器;&am…

【Qt知识】Geometry属性

一、走进Geometry的世界 Geometry属性是Qt框架中用于处理和操作几何形状的一系列类的集合。它包括了QPoint、QPointF、QSize、QSizeF、QRect和QRectF等。这些类分别代表点、大小、矩形等基本几何概念,它们的存在让图形界面的创建变得既简单又直观。 位置和尺寸。 其…

DCS-11双位置继电器 DC220V 板前接线带底座 约瑟 JOSEF

系列型号: DCS-11双位置继电器; DCS-12双位置继电器; DCS-13双位置继电器; ​用途 RXMVB2(DCS-10)系列双位置继电器用于需要大容量双稳态触点的工业控制和其它一般控制场合。 特点 体积小,拆装方便,能安…

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

法一:第一次安装宝塔 第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了 法二:第一种方法没解决用这种 出现mysqli::real_connect(): (HY000/2002): No such file or directory错误通…

java spring 拦截器和过滤器+过滤器处理数据

java spring 拦截器和过滤器过滤器处理数据 介绍Spring拦截器(Interceptor)导入依赖完整代码 Java过滤器(Filter)完整代码分为 2 个文件,请看下面BodyReaderHttpServletRequestWrapper.javaMyFilter.java Spring过滤器…

昇思25天学习打卡营第6天|linchenfengxue

​​​​​​SSD目标检测 SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上,SSD对于输入尺寸300x300的网络,达到74.3%mAP(mean Average Precision)以…