Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen

在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。

从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持久性保证,包括我们如何使用安全检查隔离新的写入和删除,以防止陈旧节点不安全地确认这些操作。

在以下博客文章中,我们将介绍持久性承诺的基础知识以及 Elasticsearch 如何使用操作日志 (translog) 来快速安全地确认对客户端的写入。接下来,我们将深入研究问题,介绍对我们有帮助的概念,最后解释额外的安全检查,使我们能够自信地确认对客户端的写入。

持久性承诺和 translog

当客户端将数据写入 Elasticsearch 时(例如使用 _bulk API),Elasticsearch 将为该请求提供 HTTP 响应代码。Elasticsearch 仅在数据已安全存储时才提供成功的 HTTP 响应代码 (200/201)。我们使用操作日志(称为 translog),请求在确认写入之前附加并存储在其中。translog 允许我们重放未成功持久化到底层 Lucene 索引的操作(例如,如果在我们确认写入到客户端后节点崩溃)。有关 translog 和 Lucene 索引的更多信息,请参阅我们最近关于薄索引分片的博客文章中的此部分,其中我们解释了我们现在如何在对象存储中存储 Lucene 索引和 translog。

不知道是最糟糕的 - 问题

主节点将分片分配给索引节点,然后该节点负责将传入的数据索引到该分片中。但是,我们必须考虑此节点与主节点和/或集群其余部分失去通信的情况。

在这种情况下,主节点将(在超时后)假定该节点不再运行,并将受影响的分片重新分配给其他节点。先前的分配现在将被视为过时或陈旧(stale)。过时的节点可能仍在运行,试图索引和保存它收到的数据。

在这种情况下,可能有两个分片所有者试图确认写入但彼此失去通信,我们有两个问题需要解决:

  • 避免对象存储中的文件覆盖
  • 确保已确认的写入不会丢失

Primary terms - 数量增加以求得救

Elasticsearch 多年来一直使用我们称为 primary terms 的东西。每当将主分片分配给节点时,都会为其分配一个 primary term。如果主分片发生故障或从未分配(unassigned)变为已分配(assiined),主服务器(master)将在重新分配主分片之前增加 promary term 的值。这给出了主分片分配和所有权的严格顺序,在较低的 primary terms 之后分配较高的 primary terms。

对于无状态(stateless),我们在写入对象存储的索引文件路径中使用 primary terms,以确保不会发生上述第一个问题。如果分片发生故障并被重新分配,我们知道它将具有更高的 primary term。分片只会在 primary term 特定的路径中写入文件,因此较旧的分片分配和较新的分片分配不可能写入相同的文件。它们只是写入不同的路径。

Primary term 也用于最终提供耐用性保证,稍后会详细介绍。

请注意,主分片重定位不会增加 primary term 的值,而是涉及主分片重定位的两个节点通过明确的协议交接所有权。

Coordination term 和节点离开生成( node-left generation)

Elasticsearch 中的协调子系统是一种用于集群级别协调的强一致性机制,包括集群成员资格和集群元数据(均称为集群状态)。

在无状态(stateless)中,此系统还建立在对象存储之上,上传新的集群状态版本。与有状态一样,它为称为 “term” 的选举维护一个不断增加的数字(我们在此将其称为 coordination term,以将其与上一节中描述的 primary term 区分开来)。每当一个节点决定开始新的选举时,它都会在新的 coordination term 内这样做,该 term 高于之前看到的任何 term(有关有状态中此工作的更多详细信息,请参阅此处的博客文章)。

在无状态中,选举通过我们称为租约(lease file)文件的对象存储文件进行。此文件包含 coordination term 和声称该 term 是该 term 的当选主节点的节点。

此文件将有助于我们在此处感兴趣的安全检查。如果 coordination term 仍然相同,我们就知道当选主节点没有改变。

然而,仅有协调项是不够的,因为即使节点离开集群,这也不一定会发生改变。为了检测数据节点是否未离开集群,我们还将节点离开生成添加到租约文件中。这是一个递增的数字,每次节点离开集群时都会增加。当 term 发生变化时,它会从零重置(但在这里我们可以忽略这一点)。

租约文件作为持久化新集群状态的一部分写入对象存储。此写入发生在根据新集群状态采取任何操作(如分片恢复)之前。

对象存储先读后写语义

我们使用对象存储以无状态存储所有数据,因此对象存储的可见性保证非常重要。最终,安全检查建立在这些保证之上。

以下是我们依赖的主要对象存储可见性保证:

  • 先读后写:成功写入后,任何读取都将返回新内容。
  • 先列表后写入:成功写入后,任何与新文件匹配的列表都将返回该文件。

这些在几年前并不是必然的,但现在已在 AWS S3、GCP 和 Azure blob 存储中提供。

安全检查

有了上述必要的构建块,我们现在可以进行实际的安全检查和安全论证。虽然 translog 保证了写入的持久性,但在确认写入之前,我们需要确保节点仍然是指定的索引节点。事实来源是集群状态,因此数据节点需要确定它具有足够新的集群状态,以确定确认写入是否安全。

我们只对非优雅事件感兴趣,例如节点崩溃、网络分区等。分片重定位等优雅事件通过显式交接来处理,以保证其正确性(我们不会在本篇博文中深入讨论这个问题)。

让我们考虑一个非优雅事件,例如主节点检测到保存分片的数据节点不再响应,因此它将节点从集群中弹出。我们将在这种情况下检查安全检查,看看它如何避免陈旧的节点可能错误地确认对客户端的写入。

安全检查在响应客户端之前添加了一项额外检查:

  • 从对象存储中读取租约文件。如果 coordination term 或节点左代已超过节点本地集群状态中的值,则它不能依赖集群状态,直到收到具有更高或相等coordination term 和节点离开生成的更新版本。有了足够新的集群状态,可以使用它来检查分片的 primary term 是否已更改。如果已更改,则写入将失败。

在理想情况下,这里不会有任何等待,因为与正常写请求的频率相比,term 和节点离开生成的变化非常不频繁。因此,这个检查的开销很小。

请注意,顺序是重要的:在安全检查之前,translog 文件已经成功上传。稍后我们将解释原因。

非正常的节点离开事件会导致租约文件中的节点离开生成编号递增。之后,一个新节点可能会被分配到该分片并开始恢复数据(这可能只是一次集群状态更新,但这里唯一重要的部分是租约文件写入和节点开始恢复的顺序,这一点是有保证的)。

新分配的节点随后会读取分片数据并恢复 translog 中包含的数据。

我们看到事件的顺序如下:

  • 原始数据节点在读取租约文件之前写入 translog。
  • 主节点在新数据节点开始恢复之前(因此也在读取 translog 之前)将递增的节点离开生成写入租约文件。
  • 对象存储保证了对租约文件和 translog 文件的先读后写(read-after-write)。

这里需要考虑两种主要情况:

  • 原始数据节点写入了 translog 文件,并读取了一个租约文件,表明它仍在集群中且是分片的拥有者(primary term 没有改变)。
    • 我们可以确定主节点在数据节点读取之前未成功更新租约文件。因此,原始数据节点对 translog 的写入发生在新节点分配读取 translog 之前,保证这些操作可供新节点进行恢复。
  • 原始数据节点写入了 translog 文件,但在等待租约文件中的信息反映的新集群状态后,它不再是分片的拥有者(导致写入请求失败)。
    • 我们不会成功响应该写入请求,因此不会承诺持久性。
    • translog 数据可能在恢复期间对新节点分配可用,但这没问题。写入失败的请求实际上持久化了数据,这也是可以接受的。

因此,我们可以看到,Elasticsearch 成功响应的任何写入将对同一分片的未来拥有者可用,进而证明了我们的安全性论点。

同样,我们可以论证主节点故障转移的情况也是安全的。在这种情况下,coordination term 而不是节点离开生成会发生变化。我们这里不再详细说明。

这种相同的安全检查也应用于其他一些关键情况:

  • 在索引文件删除期间。当 Lucene 合并段时,旧段可以被删除。我们在这里添加了安全检查,以防止删除新节点分配可能需要的文件。
  • 在 translog 文件删除期间。当对象存储中的索引数据包含所有操作时,translog 可以被删除。同样,我们在这里添加了安全检查,以防止删除新节点分配可能需要的 translog 文件。

结论

恭喜,你已经读到了最后,希望你喜欢这里的深入研究。我们描述了一种新颖的机制,用于确保 Elasticsearch 持久安全地将写入持久化到对象存储,即使在出现任何类型的中断导致 Elasticsearch 有两个节点拥有对同一分片的索引的情况下也是如此。我们非常关心这些方面,如果你也这样做,也许可以看看我们的开放职位。

向 David Turner、Francisco Fernández Castaño 和 Tim Brooks 致敬,他们在这里完成了大部分实际工作。

准备好自己尝试一下了吗?开始免费试用。

想要获得 Elastic 认证?了解下一次 Elasticsearch 工程师培训何时开始!

原文:Data safety in a stateless world — Search Labs

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

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

相关文章

QT6聊天室项目 网络通信实现逻辑分析

实现逻辑 模块话网络通信设计分析 NetClient类 功能:负责与服务器进行通信httpClient:处理HTTP请求websocketClient:处理WebSocket通信 HTTP请求封装 设计请求和服务器响应的接口设计函数测试网络连接性设计处理的函数处理HTTP请求(后期实现…

【Linux】System V通信

目录 System V共享内存 共享内存数据结构 共享内存函数 共享内存的关联 共享内存的去关联 用共享内存实现serve&client通信 共享内存与管道进行对比 System V共享内存 管道通信本质是基于文件的,也就是说操作系统并没有为此做过多的设计工作,…

【网络安全】服务基础第二阶段——第二节:Linux系统管理基础----Linux统计,高阶命令

目录 一、Linux高阶命令 1.1 管道符的基本原理 1.2 重定向 1.2.1 输出重定向 1.2.2 输入重定向 1.2.3 wc命令基本用法 1.3 别名 1.3.1 which命令基本语法 1.3.2 alias命令基本语法 1.4 压缩归档tar 1.4.1 第一种:gzip压缩 1.4.2 第二种:bzip…

SpringBoot3 简单集成 Mybatis plus

SpringBoot3 集成 Mybatis plus 1、引入Mybatisplus的starter <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency>2、引入数据…

前端HTML基础笔记

HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是一种用于创建网页的标准标记语言。它通过一系列的元素&#xff08;或称为标签&#xff09;来定义网页的结构和内容。HTML文档由一系列的元素组成&#xff0c;这些元素可以包含文本、图片、链…

LEAP模型在能源环境发展、碳排放建模预测及分析中实践应用

在国家“3060”碳达峰碳中和的政策背景下&#xff0c;如何寻求经济-能源-环境的平衡有效发展是国家、省份、城市及园区等不同级别经济体的重要课题。根据国家政策、当地能源结构、能源技术发展水平以及相关碳排放指标制定合理有效的低碳能源发展规划需要以科学准确的能源环境发…

培训第九周(部署k8s基础环境)

一、前期系统环境准备 1、关闭防火墙与selinux [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-o…

机器学习-神经网络:循环神经网络(RNN)详解

引言 在当今人工智能(AI)和深度学习(DL)领域,循环神经网络(RNN)作为一种专门处理序列数据的模型,具有不可忽视的重要性。RNN 的设计目标是模拟和处理序列中的时间依赖关系,使其成为许多应用场景的理想选择,如自然语言处理(NLP)、时间序列预测和语音识别等。它不仅…

【C语言】插入排序、希尔排序——动图展示

目录 1. 插入排序1.1 基本概念1.2 实现思路1.3 代码部分 2. 希尔排序2.1 为什么会有希尔排序&#xff1f;2.2 基本概念2.3 实现思想1&#xff09;单组排序2&#xff09;多组排序 2.4 代码部分 3. 总结 1. 插入排序 1.1 基本概念 把待排序的记录逐个插入到一个已经排好序的有序…

[数据集][目标检测]电动车头盔佩戴检测数据集VOC+YOLO格式4235张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4235 标注数量(xml文件个数)&#xff1a;4235 标注数量(txt文件个数)&#xff1a;4235 标注…

在OpenEuler(欧拉)系统上用kubeadm部署(k8s)Kubernetes集群

一、OpenEuler(欧拉) 系统简介 openEuler 是开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff1b; openEuler作为一个操作系统发行版平台&#xff0c;每两年推出一个LTS版本。该版本为企业级用户提供一个安全稳定可靠的操作系统。…

[数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4040 标注数量(xml文件个数)&#xff1a;4040 标注数量(txt文件个数)&#xff1a;4040 标注…

10个好用的AI写作工具【亲测免费】

1. 光速写作 传送入口&#xff1a;http://u3v.cn/6hXWYa AI打工神器&#xff0c;一键生成文章&ppt 2. 讯飞写作 传送入口&#xff1a;http://m6z.cn/5ODiSw 3. 讯飞绘文 传送入口&#xff1a;https://turbodesk.xfyun.cn/?channelidgj3 4. AI排版助手 传送入口&#…

jenkins 安装

jenkins安装 jenkins官网 中文网址 安装设置 所有jenkins版本 内存512M以上&#xff0c;10Gb磁盘&#xff1b;安装jdk&#xff0c;需要java8以上下载较新的版本&#xff0c;否则安装插件时可能报错版本过低 # 搜索java yum search java | grep -iE "jdk"# 安装jd…

网络安全知识科普:什么是网络准入控制系统?有哪些?

在当今数字化时代&#xff0c;网络安全已成为企业和组织不可忽视的重要议题。随着远程工作模式的普及和物联网设备的增加&#xff0c;网络边界越来越模糊&#xff0c;传统防火墙已经不足以应对日益复杂的威胁环境。在这种背景下&#xff0c;网络准入控制系统(Network Access Co…

最多购买宝石数目

题目描述 橱窗里有一排宝石&#xff0c;不同的宝石对应不同的价格&#xff0c;宝石的价格标记为 gems[i] 0≤i<nn gems.length 宝石可同时出售0个或多个&#xff0c;如果同时出售多个&#xff0c;则要求出售的宝石编号连续; 例如客户最大购买宝石个数为m&#xff0c;购买…

Nginx 负载均衡+高可用 集群部署(Keepalived+LVS DR模式)

一、LVS负载均衡简介 1.1 LVS基本介绍 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是由章文嵩博士主导开发的开源负载均衡项目&#xff0c;目前LVS已经被集成在Linux内核中。该项目在Linux内核中实现了基于IP地址的请求数据负载均衡调度方…

如何使用正则表达式替换字符串中的特定位置数字

如何使用正则表达式替换字符串中的特定位置数字 1、效果 把字符串中的第一个123替换掉: 2、代码 使用正则中的sub函数: re.sub(pattern,repl,string,count=0,flags=0) pattern:表示需要匹配的模式,即需要被替换的字符或字符串。 repl:表示替换后的字符串或函数,用于…

多目标应用:四种多目标优化算法(NSGA2、NSPSO、NSDBO、NSCOA)求解柔性作业车间调度问题(FJSP),MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题(Flexible Job Scheduling Problem, FJSP) 的描述如下&#xff1a;n个工件 { J , J 2 , . . , J n } \{J,J_2,..,J_n\} {J,J2​,..,Jn​}要在 m m m 台机器 { M 1 , M 2 , . . , M m } \{M_1,M_2,..,M_m\} {M1​,M2​,..,Mm​} …

spring 事物使用场景说明

事务使用场景。 在某些业务场景下&#xff0c;如果一个请求中&#xff0c;需要同时写入多张表的数据。为了保证操作的原子性&#xff08;要么同时成功&#xff0c;要么同时失败&#xff09;&#xff0c;避免数据不一致的情况&#xff0c;我们一般都会用到spring事务。 确实&am…