【后端面试题】【中间件】【NoSQL】ElasticSearch 节点角色、写入数据过程、Translog和索引与分片

中间件的常考方向:

  1. 中间件如何做到高可用和高性能的?

  2. 你在实践中怎么做的高可用和高性能的?

Elasticsearch节点角色

Elasticsearch的节点可以分为很多种角色,并且一个节点可以扮演多种角色,下面列举几种主要的:

  • 候选主节点:可以被选举为主节点的节点。主节点主要负责集群本身的管理,比如创建索引。类似的还有仅投票节点,这类节点只参与主从选举,但是自身并不会被选举为主节点

  • 协调节点:协调节点负责协调请求的处理过程。一个查询请求会被发送到协调节点上,协调节点确定数据节点,然后让数据节点执行查询,最后协调节点合并数据节点返回的数据集。大多数节点都会兼任这个角色

  • 数据节点:存储数据的节点。当协调节点发来查询请求的时候,也会执行查询并且把结果返回给协调节点。类似的还有热数据节点、暖数据节点、冷数据节点,它们只是用于存储不同热度的数据

在这里插入图片描述

给节点设置不同的角色的原则:如果有足够的资源,就考虑一个节点只扮演一个角色;资源不足的话,就考虑一个节点扮演多个角色。

写入数据

在这里插入图片描述

写入数据的过程整体如上所述

  1. 文档首先被写入到Buffer里面,这个是Elasticsearch自己的Buffer

  2. 定时刷新到Page Cache里,这个过程叫做refresh,默认一秒钟执行一次

  3. 刷新到磁盘里,这个时候还会同步记录一个Commit Point

在写入Page Cache之后会产生很多段(Segment),一个段里面包含了多个文档。文档只有写到了这里之后才可以被搜索到。

从支持搜索的角度来说,Elasticsearch是近实时的

不断写入会不断产生段,而每一个段都需要消耗CPU、内存和文件句柄,所以需要考虑合并。但是,这些段本身还在支持搜索,因此在合并段的时候,不能对已有的查询产生影响。

基本的过程如下,类似数据迁移:

  1. 已有的段不动

  2. 创建一个新的段,把已有段的数据写过去,标记为删除的文档就不会被写到段里面

  3. 告知查询使用新的段

  4. 等使用老的段的查询都结束了,直接删掉老的段

在这里插入图片描述

那么查询怎么知道应该使用合并段了呢?这依赖于统一的机制,就是Commit Point,里面记录了哪些段是可用的。

所以当合并段之后,产生了一个新的Commit Point,里面有合并后的段,但是没有被合并的段,相当于告知了查询使用新的段。

Translog

Elasticsearch在写入的时候,还要写入Translog。可以把这个看作是MySQL里和redo log差不多的东西,如果宕机了可以通过Translog来恢复数据。

MySQL写入的时候,修改了内存里的值,然后记录了日志,也就是binlog、redo log和undo log

Elasticsearch写入的时候,也是写入了Buffer里,然后记录了Translog

两者的区别是:Translog是固定间隔刷新到磁盘上的,默认是5秒。

在这里插入图片描述

Translog是只追加的,也就是顺序写的,所以效率很高。只有刷新到磁盘的时候,才会非常慢。

但是,就算有Translog,还是有数据丢失的可能,最差情况下,会丢失5秒的数据。

Elasticsearch索引与分片

一个Elasticsearch的索引并不仅仅指倒排索引,还包括了对应的文档。这个和关系型数据库下的语义是不同的。

Elasticsearch的一个索引有多个分片,每个分片又有主从结构,类似于数据库的分库分表。可以这样理解:

  • 一个索引是一个逻辑表

  • 分片就是分库分表

  • 每个分片都有主从结构,在分库分表里面,一般也是用主从集群来存储数据

在这里插入图片描述

Elasticsearch会尽量把分片分散在不同的节点上,这一点和kafka尽量把分区分散在不同broker上是一样的,为了保证在节点崩溃的时候将影响最小化

主分片崩溃后,是怎么选出新的主分片呢?

主节点选择一个分片作为主分片,类似于Redis Sentinel里的机制,如果主节点宕机了,Sentinel会从节点里选出一个作为主节点

面试准备

  • 公司有没有使用Elasticsearch,用来解决什么问题?

  • Elasticsearch性能怎么样?读写流量多大?存储数据量多大?

  • 创建的索引有多大?有多少个分片?如何确定分片数量的?

  • 有没有采用一些措施来保证Elasticsearch的可用性?有没有用过Elasticsearch的网关?

  • Elasticsearch有没有出过问题?如何解决的?

项目介绍的时候也可以强调一下项目可用性的一个关键点就是Elasticsearch,从而打开话题。面试的时候可以收集一些使用Elasticsearch的基本案例,这样面试讲到一些理论的时候,也可以用这些案例来佐证。

和Elasticsearch相关的面试题目有很多,比如:

  • 有没有用过Elasticsearch?用来解决什么问题

  • 用Elasticsearch的过程中,有没有遇到过什么问题?最后是如何解决的?

  • 为什么Elasticsearch是近实时的?

  • Elasticsearch的flush指的是什么?refresh又是什么?

  • Elasticsearch的写入过程是什么样的?

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

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

相关文章

【软件测试】白盒测试(知识点 + 习题 + 答案)

《 软件测试基础持续更新中》 最近大家总是催更……,我也是百忙之中给大家详细总结了白盒测试的重点内容! 知识点题型答案,让你用最短的时间,学到最高效的知识! 整理不易,求个三连 ₍ᐢ..ᐢ₎ ♡ 目录 一、…

Spring专题一:源码编译

下载源码 因为公司使用的是Spring5.2.x所以就下载了这个版本,github源码地址如下: GitHub - spring-projects/spring-framework at v5.2.6.RELEASE: 如果网络不稳定可以使用下载压缩版即可,网络稳定的话还是建议使用git clone …

【redis】redis RDB

1、概述 1.1定义 RDB (Redis Database) 是 Redis 的默认持久化机制,它能够在指定的时间间隔内将内存中的数据集快照写入磁盘。RDB 持久化产生的文件是一个经过压缩的二进制文件,通过该文件可以还原生成 RDB 文件时的数据库状态。 1.2特点 一次性全量备…

【工具分享】SQLmap

文章目录 工具介绍安装方式环境准备安装 sqlmap 工具介绍 sqlmap 是一个非常强大的自动化 SQL 注入工具,主要用于渗透测试和安全审计。它能够检测和利用 SQL 注入漏洞,进而访问数据库服务器。 GitHub:https://github.com/sqlmapproject/sql…

Everything 一款功能强大的搜索工具

要在电脑上使用Everything搜索文件,您需要使用以下步骤: 在您的电脑上下载并安装Everything软件。您可以从官方网站https://www.voidtools.com/downloads/下载最新版本的软件。 安装完成后,打开Everything软件。 在搜索栏中输入您要查找的文…

JsonCpp:更简洁的序列化及反序列化

简介 jsoncpp 提供了一组简单易用的 API&#xff0c;使得在 C 程序中处理 JSON 数据变得更加方便和高效。 安装 linux环境下安装jsoncpp sudo apt-get update sudo apt-get install --reinstall libjsoncpp-dev建立软链接确保编译器找到头文件 #include <json/json.h>…

Java数据结构6-栈与队列

1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则 压栈…

机电公司管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;管理员管理&#xff0c;客户管理&#xff0c;公告管理&#xff0c;考勤管理&#xff0c;请假管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;机电零件&…

gitee配置ssh教程

生成公钥 执行命令&#xff1a; ssh-keygen -t rsa查看公钥 cat ~/.ssh/id_rsa.pub这个公钥就是要复制粘贴到Gitee中的ssh公钥。 配置Gitee SSH公钥 来到Gitee的ssh公钥中&#xff0c;配置

代码随想录算法训练营第四十六天| 121. 买卖股票的最佳时机 ,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III

121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int[] prices) {if(prices.length 0){return 0;}int[][] dp new int[prices.length][2];dp[0][0] 0;dp[0][1] -prices[0];for(int i1;i<prices.length;i){dp[i][0…

Go环境安装---附带每一步截图

Windows环境 Go安装包下载 下载后直接安装步骤按照即可。 测试 winR 输入cmd 在命令行输出go version可以看到自己的版本。 go env 查看环境变量 在桌面创建hello.go的文件 编写代码。注意&#xff0c;编码必修是UTF-8 在命令行输入路径刚刚代码所在的路径&#x…

动态选线,动态的选择变量的位宽

一、原理 参考博客&#xff1a;&#xff1c;Verilog&#xff1e; 语法技巧&#xff1a;数据位操作_verilog移位操作-CSDN博客 下图是从作者的博客cv过来的一张图&#xff0c;讲的非常的清晰。实现了动态的选择选择数据的位宽&#xff0c;只需要动态的改变base_expr就可以。 …

Python 潮流周刊#58:最快运行原型的语言

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 本周刊由 Python猫 出品&#xff0c;精心筛选国内外的 250 信息源&#xff0c;为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景&#xff1a;帮助所有读者精进 Python 技术&am…

暑假集中备考2024年汉字小达人:来做18道历年选择题备考吧

结合最近几年的活动安排&#xff0c;预计2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地准备汉字小达人比赛呢&#xff1f; 我的建议是充分利用即将到来的暑假&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0…

Python应用开发——30天学习Streamlit Python包进行APP的构建(12)

st.checkbox 显示复选框部件。 Function signature[source] st.checkbox(label, valueFalse, keyNone, helpNone, on_changeNone, argsNone, kwargsNone, *, disabledFalse, label_visibility"visible") Returns (bool) Whether or not the checkbox is checked. …

昇思25天学习打卡营第04天|数据集 Dataset

数据是深度学习的基础&#xff0c;高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎&#xff0c;通过数据集&#xff08;Dataset&#xff09;和数据变换&#xff08;Transforms&#xff09;实现高效的数据预处理。其中Dataset是Pipel…

【QT】设置QTabWidget样式:上、下边线的显示与去除

目录 0.简介 1.环境 2.详细介绍 2.1我的原代码和显示效果 2.2 去掉QTabWidget的边框 2.3 单独留下边线 2.3.1 法一&#xff1a;通过【this->setDocumentMode(true);】设置下边线 2.3.2 通过【QTabWidget::pane】设置下边线 2.4单独设置上边线 2.5 优化界面tab 2.…

STM32的SPI通信

1 SPI协议简介 SPI&#xff08;Serial Peripheral Interface&#xff09;协议是由摩托罗拉公司提出的通信协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间&#xff0c;使用于对通信速率要求较高的场合。 …

css 布局出现无法去除的空白

案件介绍&#xff1a;在没有设置任何的css样式的情况下 文字顶部出现无法去除的空白 源代码 <div click"onClick" ><div class"tableTextButton--container"></div><Icon v-if"loading || thisLoading" type"ios-lo…

LeetCode热题100刷题2:283. 移动零、11. 盛最多水的容器、15. 三数之和、42. 接雨水

283. 移动零 挺简单的没啥说的 class Solution { public:void moveZeroes(vector<int>& nums) {//快慢指针 // 快指针负责往前遍历&#xff0c;慢指针记录快指针遍历过的把0撵走的最后一个元素的位置// 然后快指针遍历完之后&#xff0c;慢指针到结尾直接赋0就行in…