ElasticSearch-文档元数据乐观并发控制

文章目录

  • 什么是文档?
  • 文档元数据
  • 文档的部分更新
  • Update 乐观并发控制

最近日常工作开发过程中使用到了 ES,最近在检索资料的时候翻阅到了 ES 的官方文档,里面对 ES 的基础与案例进行了通俗易懂的解释,读下来也有不少收获,所以打算记录一下。果真官方文档才是最好的“菜鸟教程”。

贴上官方文档:

Elasticsearch:权威指南-基础入门

什么是文档?

Elasticsearch 中,术语 文档 有着特定的含义。它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。可以简单理解为我们平时操作存储的对象在 ES 中通过 JSON 序列化存储的内容,是 ES 中操作的最小单位。

{
    "name":         "John Smith",
    "age":          42,
    "confirmed":    true,
    "join_date":    "2014-06-01",
    "home": {
        "lat":      51.5,
        "lon":      0.1
    },
    "accounts": [
        {
            "type": "facebook",
            "id":   "johnsmith"
        },
        {
            "type": "twitter",
            "id":   "johnsmith"
        }
    ]
}

文档元数据

一个文档不仅包含着其本身的数据,也包含文档有关的信息,可以称之为 「元数据」。

三个必须的元数据元素如下:

  • _index

    文档在哪存放,就是我们平时建立的索引

  • _type

    文档表示的对象类别,这个平时用的比较少,算是同一索引下的一个更细的类别划分

  • _id

    文档唯一标识,可以通过它检索唯一的文档。当创建一个新文档的时候,要么自己提供 _id,要么让 ES 自动生成

文档的部分更新

ES update API 似乎对文档直接进行了修改,但是实际上 ES 中文档是「不能被修改,只能被替换」,详细的过程如下:

  1. 从旧文档构建 JSON
  2. 更改该 JSON
  3. 删除旧文档
  4. 索引一个新文档

注意:其中操作“删除文档”也并不会立即将文档从磁盘中删除,只是将文档标记为已删除状态,即软删。随着我们不断索引更多的数据,ES 才会在后台线程中清理标记为已删除的文档。

Update API 整体遵循 检索-修改-重建索引 的处理过程,并且这三步都是发生在 ES 节点内部的,避免了客户端和 ES 集群的多次网络交互开销。通过减少检索和重建索引步骤之间的事件,也减少了其他进程的变更带来冲突的可能性。但是这不能完全消除冲突的可能性,可能还是会有某个进程在 update 设法重建索引前,另一进程请求修改了文档。

Update 乐观并发控制

ES 是分布式的,当文档创建、更新或删除的时候,新版本的文档必须复制到集群中的其他节点。ES 也是异步和并发的,这意味着这些复制请求被并行发送,并且到达目的地时也许是「乱序」的,ES 需要一种方法确保文档的旧版本不会覆盖新的版本。

ES 中每个文档都有一个 _version 号,可以当作其元数据的一部分,当文档被修改时,版本号会递增。ES 可以使用 _version 来确保变更以正确的顺序执行,如果旧版本的文档在新版本之后到达,可以被简单的忽略。

并且通过 _version 版本号还可以进行更新的乐观并发控制,这可以确保应用中相互冲突的变更不会导致数据冲突。我们可以通过指定想要修改的文档的 _version 来达到这个目的,如果该版本不是当前版本号,我们的请求会失败。

Update API 乐观并发控制:

Update API 的 检索-修改-重建索引 步骤拆解下来就是如下的 Get - Update - Put 请求,三个步骤不是原子的话就会产生冲突,像下面的示意图所示就会产生更新数据覆盖的问题

在这里插入图片描述

为了避免并发更新时产生的数据丢失,Update API 在「检索」步骤时检索得到当前文档的 _version 号,并传递版本号到 「重建索引」的请求上。如果另一个进程修改了处于「检索」和「重建索引」步骤之间的文档,那么 _version 号将不匹配,更新请求将会失败。这种场景就是先到的 request1 由于执行时间过长,反倒被后到的&执行时间更短的 request2 给冲突导致失败了。

在增量操作无关顺序的场景下,两个进程更新操作发生的顺序不太重要(比方说两个进程都对页面访问量进行递增计数),那么由于冲突导致更新失败的请求,唯一需要做的就是重试。

这可以通过设置参数 retry_on_conflict 来自动完成,这个参数规定了失败之前 update 应该重试的次数,它的默认值是 0,也就是默认不重试。下面的例子表示失败之前需要重试 5 次。

POST /website/pageviews/1/_update?retry_on_conflict=5 
{
   "script" : "ctx._source.views+=1",
   "upsert": {
       "views": 0
   }
}

但是在其他情况下变更可能要求是「有序的」,那么在 ES update 的这个角度上来说,就不能开启重试逻辑,比方在更新账户余额场景下(非递增递减操作),先到的 request1 被后到的 request2 冲突失败了,此时 request2 是最新的数据,ES 也是能够维持「最终一致性的」,但如果让 request1 重试一次,账户余额就会被老的数据覆盖了,显然是不能接受的。

再拓展一下思路,上面仅仅是在 ES 系统内保证 update 的有序,如果放在整个分布式系统中去看,比方说消息系统生产者发送消息,消费者消费并更新 ES(canal 就有这种模式),如果要保证分布式系统的全局有序,就得额外考虑 1.生产者到 MQ 2.MQ 到消费者 3.消费者到更新ES 每个环节的「有序性」。

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

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

相关文章

67-《蓝金花》

蓝金花 蓝金花,又名蓝鲸花。是属于玄参科植物,分布于巴西。株高50~90公分,叶对生,长椭圆形,先端锐,细锯齿缘。春至秋季开花,腋生,花冠长管状,花瓣蓝紫色&…

1月27(信息差)

🌍喜大普奔,适用于 VS Code 的 GitHub Copilot 全新免费版本正式推出,GitHub 全球开发者突破1.5亿 🎄Kimi深夜炸场:满血版多模态o1级推理模型!OpenAI外全球首次!Jim Fan:同天两款国…

WIN11 UEFI漏洞被发现, 可以绕过安全启动机制

近日,一个新的UEFI漏洞被发现,可通过多个系统恢复工具传播,微软已经正式将该漏洞标记为追踪编号“CVE-2024-7344”。根据报告的说明,该漏洞能让攻击者绕过安全启动机制,并部署对操作系统隐形的引导工具包。 据TomsH…

xss靶场

xss-labs下载地址&#xff1a;GitHub - do0dl3/xss-labs: xss 跨站漏洞平台 xss常见触发标签&#xff1a;XSS跨站脚本攻击实例与防御策略-CSDN博客 level-1 首先查看网页的源代码发现get传参的name的值test插入了html里头&#xff0c;还回显了payload的长度。 <!DOCTYPE …

Python案例--100到200的素数

一、问题描述 素数&#xff08;Prime Number&#xff09;是指在大于1的自然数中&#xff0c;除了1和它本身以外不再有其他因数的数。判断一个数是否为素数是计算机科学和数学中的一个经典问题。本实例的目标是找出101到200之间的所有素数&#xff0c;并统计它们的数量。 二、…

JavaScript中的隐式类型转换

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…

Git Bash 配置 zsh

博客食用更佳 博客链接 安装 zsh 安装 Zsh 安装 Oh-my-zsh github仓库 sh -c "$(curl -fsSL https://install.ohmyz.sh/)"让 zsh 成为 git bash 默认终端 vi ~/.bashrc写入&#xff1a; if [ -t 1 ]; thenexec zsh fisource ~/.bashrc再重启即可。 更换主题 …

具身智能体俯视全局的导航策略!TopV-Nav: 解锁多模态语言模型在零样本目标导航中的顶视空间推理潜力

作者&#xff1a;Linqing Zhong, Chen Gao, Zihan Ding, Yue Liao, Si Liu 单位&#xff1a;北京航空航天大学&#xff0c;新加坡国立大学&#xff0c;香港中文大学多模态实验室 论文标题&#xff1a;TopV-Nav: Unlocking the Top-View Spatial Reasoning Potential of MLLM …

python爬虫入门(一) - requests库与re库,一个简单的爬虫程序

目录 web请求与requests库 1. web请求 1.1 客户端渲染与服务端渲染 1.2 抓包 1.3 HTTP状态代码 2. requests库 2.1 requests模块的下载 2.2 发送请求头与请求参数 2.3 GET请求与POST请求 GET请求的例子&#xff1a; POST请求的例子&#xff1a; 3. 案例&#xff1a;…

思科交换机telnet配置案例

目录 1.telnet简述2.网络拓扑3.设备说明4.网络配置4.1 电脑PC ip设置4.2 网络交换机telnet配置 5.小结 1.telnet简述 Telnet是远程登录服务的一个协议&#xff0c;该协议定义了远程登录用户与服务器交互的方式。它允许用户在一台联网的计算机上登录到一个远程分时系统中&#…

【C++高并发服务器WebServer】-7:共享内存

本文目录 一、共享内存1.1 shmget函数1.2 shmat1.3 shmdt1.4 shmctl1.5 ftok1.6 共享内存和内存映射的关联1.7 小demo 二、共享内存操作命令 一、共享内存 共享内存允许两个或者多个进程共享物理内存的同一块区域&#xff08;通常被称为段&#xff09;。由于一个共享内存段会称…

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型

摘要&#xff1a;我们推出了Sigma&#xff0c;这是一个专为系统领域设计的高效大型语言模型&#xff0c;其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构&#xff0c;并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询&#xff08;Q&…

Day27-【13003】短文,单链表应用代码举例

文章目录 单链表的应用概览查找单链表倒数第k个结点查找单链表的中间结点将单链表逆置 第二章真题检测 单链表的应用概览 查找单链表倒数第k个结点 本节给出单链表的4个应用示例。单链表结点的定义与本章第三节中的定义相同。为了方便&#xff0c;重新写出来。 #define TRUE …

java求职学习day18

常用的设计原则和设计模式 1 常用的设计原则&#xff08;记住&#xff09; 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 &#xff08;1&#xff09;开闭原则&#xff08;Open Close Principle…

2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)

2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.1.4问题1样例代码运行结果&…

UART ,IIC 和SPI三种总线协议

1.UART 1.1 简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;即通用异步收发器。 常见的串行、异步通信总线&#xff0c;两条数据线Tx、Rx&#xff0c;实现全双工通信&#xff0c;常用于主机与外设的通信&#xff0c;点对点。 1.2 硬件连接 交叉…

IPhone14 Pro 设备详情

目录 产品宣传图内部图——后设备详细信息 产品宣传图 内部图——后 设备详细信息 信息收集于HubWeb.cn

海外问卷调查渠道查如何设置:最佳实践+示例

随着经济全球化和一体化进程的加速&#xff0c;企业间的竞争日益加剧&#xff0c;为了获得更大的市场份额&#xff0c;对企业和品牌而言&#xff0c;了解受众群体的的需求、偏好和痛点才是走向成功的关键。而海外问卷调查才是获得受众群体痛点的关键&#xff0c;制作海外问卷调…

如何跨互联网adb连接到远程手机-蓝牙电话集中维护

如何跨互联网adb连接到远程手机-蓝牙电话集中维护 --ADB连接专题 一、前言 随便找一个手机&#xff0c;安装一个App并简单设置一下&#xff0c;就可以跨互联网的ADB连接到这个手机&#xff0c;从而远程操控这个手机做各种操作。你敢相信吗&#xff1f;而这正是本篇想要描述的…