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

news2025/5/11 7:22:45

文章目录

  • 什么是文档?
  • 文档元数据
  • 文档的部分更新
  • 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 每个环节的「有序性」。

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

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

相关文章

海浪波高预测(背景调研)

#新星杯14天创作挑战营第7期# ps:图片由通义千问生成 历史工作: 针对更高细粒度、更高精度的波浪高度预测任务: Mumtaz Ali 等人提出了一种多元线性回归模型(MLR-CWLS),该模型利用协方差加权最小二乘法&a…

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日,中国人工智能产业发展联盟(简称AIIA)数据委员会数据标注分委会(以下简称“分委会”)正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: MySQL 🏠 基本查询回顾 假设有以下表结构: 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为…

书生大模型实战营2

L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先,确保你已经安装了Anaconda或Minico…

HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码

源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中,天上飘落着雪花。当鼠标滑过圣诞树时,可见到圣诞树上的灯光闪烁,同时左下角探出雪怪模样的半个脑袋,四处张望着。整体画面栩栩…

产业园管理系统提升企业综合管理效率与智能化水平的成功案例分析

内容概要 在当前科技迅猛发展的时代,越来越多的企业意识到数字化转型的重要性。为了提升管理效率和智能化水平,产业园管理系统应运而生,成为众多园区和商办写字楼不可或缺的一部分。无论是工业园、物流园还是公寓,这些系统都能为…

LeetCode - #195 Swift 实现打印文件中的第十行

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

强化学习数学原理(三)——值迭代

一、值迭代过程 上面是贝尔曼最优公式,之前我们说过,f(v)v,贝尔曼公式是满足contraction mapping theorem的,能够求解除它最优的策略和最优的state value,我们需要通过一个最优v*,这个v*来计算状态pi*&…

DeepSeek-R1:强化学习驱动的推理模型

1月20日晚,DeepSeek正式发布了全新的推理模型DeepSeek-R1,引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色,性能对标OpenAI的o1正式版。同时,DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…

scratch变魔术 2024年12月scratch三级真题 中国电子学会 图形化编程 scratch三级真题和答案解析

目录 scratch变魔术 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、 推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、py…

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 (1)数据库与数据表说明。 (2)字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) (1&…

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算

【0】基础定义 按位与运算:全1取1,其余取0。按位或运算:全0取0,其余取1。 【1】引言 前序学习进程中,已经对图像按位与计算进行了详细探究,相关文章链接如下: python学opencv|读取图像&…

蓝桥杯省一

四个月从c,cpp,算法一起学到省一(考研原因没参加国赛) 有疑问可以关注私信哦 帖子后续也会持续更新,分享算法竞赛(ccpc,天梯赛,蓝桥杯,浙大pta)相关知识

C++ 新特性实现 ThreadPool

序言 在之前我们实现过线程池,但是非常基础。答题思路就是实现一个安全的队列,再通过 ThreadPool 来管理队列和线程,对外提供一个接口放入需要执行的函数,但是这个函数是无参无返回值的。  参数的问题我们可以使用 bind 来封装&a…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现,详见下文: 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现,其形参均采用了…

本地Harbor仓库搭建流程

Harbor仓库搭建流程 本文主要介绍如何搭建harbor仓库,推送本地镜像供其他机器拉取构建服务 harbor文档:Harbor 文档 | 配置 Harbor YML 文件 - Harbor 中文 github下载离线安装包 Releases goharbor/harbor 这是harbor的GitHub下载地址&#xff0c…

环境搭建--vscode

vscode官网下载合适版本 安装vscode插件 安装 MinGW 配置环境变量 把安装目录D:\mingw64 配置在用户的环境变量path里即可 选择用户环境变量path 点确定保存后开启cmd输入g,如提示no input files 则说明Mingw64 安装成功,如果提示g 不是内…

30289_SC65XX功能机MMI开发笔记(ums9117)

建立窗口步骤: 引入图片资源 放入图片 然后跑make pprj new job8 可能会有bug,宏定义 还会有开关灯报错,看命令行注释掉 接着把ture改成false 然后命令行new一遍,编译一遍没报错后 把编译器的win文件删掉, 再跑一遍虚拟机命令行…

IDEA工具下载、配置和Tomcat配置

1. IDEA工具下载、配置 1.1. IDEA工具下载 1.1.1. 下载方式一 官方地址下载 1.1.2. 下载方式二 官方地址下载:https://www.jetbrains.com/idea/ 1.1.3. 注册账户 官网地址:https://account.jetbrains.com/login 1.1.4. JetBrains官方账号注册…

【10.2】队列-设计循环队列

一、题目 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普…