分布式事务解决方案(八股)

1. CAP理论
  • 一致性【Consistency】所有节点访问最新的数据
  • 可用性【Availability】非故障节点响应正常
  • 分区容错性【Partition Tolerance】分布式系统出现网络分区,仍能对外提供服务

附:网络分区:分布式系统中,由于出现网络故障或其他原因【物理断开,人为配置更改,安全攻击等】,导致原本联通的网络被分割成多个独立的子网,子网之间节点无法通信。解决的方式通常是分布式的超时和重试策略,服务发现的动态识别连接,采用Raft等一致性协议

CAP理论不是3选2,而是在出现P网络分区【必须处理的问题】的时候,只能保证数据的强一致性或者节点可用性
举例说明就是,当网络出现分区,某个节点1在进行写操作,如果要保证数据一致性C,那就要别的节点234.都要禁止写操作,那这就是违法了A可用性。总得来说就是满足所有非故障节点都正常运行的话那么数据一致性是无法保证的。但是如果没有发生分区的话,那就要保证如何实现CA。

2. BASE理论–基于CA的平衡,对于AP的补充
  • 基本可用【Basically Available】:允许损失部分性能/功能上的可用性
  • 软状态【Soft-state】:允许不同节点数据之间同步存在延时
  • 最终一致性【Eventually Consistent】:经过上面的性能损失、非核心功能不可用后,数据慢同步后,最终能够达到数据强一致性的状态。

附:分布式一致性的三种级别,强一致性【写什么读什么】、弱一致性【某个时刻一致就行】、最终一致性【最后一致就行】。
那实现最终一致性的方式是什么呢?
思想就是在数据方面解决,比如增加一个版本号,数据更新时增加。读时修复【读取数据时,不同节点数据不一致更新数据状态】。写时修复【写数据时修复-更推荐】。异步修复【定时检测数据一致性修复】。

ACID是数据库实例内部的数据-事务完整性理论,CAP是分布式系统-设计理论。

3. 分布式系统中如何保证一致性

事务一致性:操作的正确性,所有节点最终状态是一致的。如追踪电商平台的“优惠券”状态,订单和优惠券之间是强关联的。

副本一致性:数据多个副本之间是一致性的,保证数据更新时的分区同步。如下面的基于图书馆的Raft算法理解。

3.1 事务一致性

在分布式中影响事务一致性的原因通常是因为各个微服务之间解耦【每个服务都有独立数据存储】,产生了跨数据库事务。MySQL如何根据Redo和Undo log来实现事务一致性

总结补充:Redo Log【正向修改-向前补偿】记录对数据库的增删改正向操作,也就是数据变更的SQL语句用于重做恢复,而Undo Log【逆向恢复-向后补偿】记录的是数据变更前足够的恢复原始数据的信息即之前的状态,事务提交后会被清理。

常见的解决方案:

  1. 技术角度:数据版本控制【参考MySQL】、事务协议(2PC、3PC、XA协议)、TCC补偿模式等

    • 2PC:两阶段提交-准备阶段和提交阶段,经典分布式事务协议,由协调者发出请求,所有参与者做出应答,任何一者回复“拒绝”,所有事务撤销。

    2PC的问题点

    同步阻塞问题:这也是事务的常见问题了,意思就是prepare阶段锁定的资源,别的事务也要就必须阻塞等待事务完成。

    单点故障问题:这也是3PC加了preCommit来解决的问题,意思就是一阶段prepare成功,但是二阶段commit宕机,导致资源处于锁定状态,事务无限期等待【故障】。

    数据不一致问题:同二,二阶段commit失败,数据也会因此不一致。

    • 3PC:三阶段提交-可以提交阶段、预提交阶段、最终提交阶段,表面上增加了预提交显得更可靠,用来确认所有的参与事务都已经准备好提交,但实际增加了通信开销的同时并不能解决极端情况无法提交回滚的问题。

    3PC的问题点

    字面意思“更可靠”,preCommit的存在是给最终提交上了个保险,检测事务参与者都准备好了那就commit,但很显然【存在极端情况】rollback请求没收到的话,数据也会不一致。

    • XA:传统的XA模式也是三阶段【seata XA二阶段不作详解1. 开始事务-生成全局事务XID 2. prepare阶段-确定是否可以提交 3. commit/rollback阶段-最终阶段,释放资源】,与2PC/3PC作区分的话,大概就是TM会首先开启一个全局事务并生成唯一标识XID,各个AP通过本地RM向TM上注册,TM首先会发送prepare请求,确定是否commit,这期间也是通过XID来管理的,当所有的分支事务都说ready了,那就最终执行commit,否则rollback,最后TM完成收尾,释放资源。

    补充:AP【应用服务】,TM【事务管理器-Transaction Manager】,RM【资源管理器-Resource Manager】

    XID的作用:每个分支事务都要带XID注册到TM,同时XID可以隔离和区分识别是哪个全局事务,同时在日志中记录XID和相关事务可以便于系统后期查询和恢复。

    • TCC:try-confirm-cancel 分布式解决方案(略)
  2. 业务角度:事务分类-关键事务、可补偿性事务、可重试性事务

    • 关键事务:核心功能,一旦提交失败,立马回滚。如核心下单操作,用户信息保存失败,事务立马回滚,避免优惠券和库存的一致性。
    • 可补偿性事务:正向操作提交失败,反向代偿。如优惠券和库存,正向扣券减库存不行,反向释放优惠券加库存代偿。
    • 可重试性事务:业务操作中由于网络波动等原因导致失败,可以通过重新多次执行来达到最终目的。如发送验证码登陆场景。

    可重试性事务可以支持@Retry自定义注解配置,或者MQ的Retry+幂等保障可重复性

  3. 场景落地实现:大致可分为-查询模型、任务检测模型、对账模型

    • 查询:查询接口是否完成,确定业务是否重新调用还是执行后续流程。
    • 自检:系统周期性跟踪对未执行任务检测并更新状态。
    • 对账:把不同业务的数据都拿来,一点点对,不一致就进行报警,需人工介入。
3.2 副本一致性

基于Paxos的Raft算法

分布式系统中由于网络分区或者节点故障等问题,不同节点对系统值有不同的认知,共识算法就是为了确保多个节点对某个值或一系列值达成一致性意见。

基本共识问题的核心是在分布式系统中,如果一个正确节点提出了某个值,在异步系统的其他正确节点最终会同意这个值,或者所有正确节点都同意不选择任何值。拜占庭共识算法是要考虑到系统中可能存在恶意节点,这些节点可能会发送错误信息或执行非预期行为。Raft的Leader选举算法用于协调其他节点的操作。2PC和3PC通常用于确保分布式数据库系统中事务的原子性和一致性。Paxos和Raft适用于需要强一致性和高可用性的场景。

Paxos的核心思想就是Baisc Paxos【多节点value共识】和Multi-Paxos【执行多次Baisc Paxos对一系列值达成共识】。

基础知识点:

Raft算法是一种分布式一致性算法,角色有三个:【Leader-领导者,Candidate-候选者,Follower-跟随者】核心思想是选举出一个Leader,由这个领导者负责管理数据复制和一致性。节点之间的通信用的是RPC【RequestVote RPC-候选人选举发起,AppendEntries RPC-心跳机制复制日志,InstallSnapshot RPC-发送快照给落后者】

raft算法首先会将时间划分为任意长度的term(任期),term号用连续数字表示,每一个任期的开始都是leader选举。当然多个Candidate竞选一个Leader,term期结束没有再继续下一个任期竞选,通信交换term号来判断小的更新成大的,过期的自动变成follower。

日志entry携带term,index,cmd。log是由entry组成的数组,标识是index,最新的最先添加到Leader的log数组中。

leader选举的过程是:1、增加term号;2、给自己投票;3、重置选举超时计时器;4、发送请求投票的RPC给其它节点

算法理解:背景就是目前有一个图书馆,图书馆里面有很多分馆,每个分馆都有一个分馆主和一本借书记录【全一致】,如何用Raft思想保证每个借书记录在某个时间点读取的借书信息都是相同的?

在领导者选举【Leader Election】阶段,原馆长辞职后,图书馆会自动启动一个选举过程来选出新馆长。新馆长上任后,首要任务是确保所有分馆的借书记录是一致的。新馆长会将新的借书记录首先更新到自己的日志中,然后同步到其他分馆,确保所有分馆的日志都是最新的,并且记录是有效的,这体现了安全性。如果发现有分馆的记录不一致,新馆长会强制这些分馆更新到自己的记录,保证一致性。在分馆出现故障时,新馆长能够从其他分馆获取最新的记录信息,并更新故障分馆,确保系统的高可用性。新馆长定期发送心跳消息与分馆建立联系,如果分馆在一定时间内没有收到心跳,它们会认为新馆长可能已经不在了,然后可能会开始新的领导者选举过程。

面试常见问题:

  1. Raft分为哪几部分?leader选举、任期管理、日志复制、日志压缩、心跳机制、租约管理等
  2. Raft选举发起的时机?刚启动/leader挂掉/每个任期开始,计时器最先归0的先发起,成员变更。
  3. Raft如何决定把票投出去?大概意思就是candidate通过投票RPC携带term_id和index的log日志与接收到的follower进行比较,如果本地follower的log比candidate的更新则拒绝投票,term_id最小更新,相同term_id的话日志哪个多就说了算。
  4. Raft网络分区数据一致性如何解决?分区的话就先在一个区内存在的follower进行选举,选举出leader后来处理客户端的请求和日志,如果故障修复,则老leader退出变成follower且此时的任何更新都要以新的leader为准。通过日志恢复来保持数据的一致性
  5. Raft和Paxos的区别?Raft拥有最新日志的节点才能成为leader,multi-paxos没有限制。Raft的leader有任期。
  6. Raft的lease租约机制?每个term任期内只有持有租约lease的节点才能成为leader,到期后必须重发租约。

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

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

相关文章

拳打开源SOTA脚踢商业闭源的LI-DiT是怎样炼成的?(商汤/MMLab/上海AI Lab)

文章地址:https://arxiv.org/pdf/2406.11831 仅基于解码器的 Transformer 的大语言模型(LLMs)与 CLIP 和 T5 系列模型相比,已经展示出卓越的文本理解能力。然而,在文本到图像扩散模型中利用当前先进的大语言模型的范例…

[机器学习]-3 万字话清从传统神经网络到深度学习

神经网络(Neural Networks, NNs)是机器学习的一种重要方法,灵感来源于生物神经系统,由大量互联的节点(称为神经元或单元)组成,通过调整这些节点间的连接权重来学习和表示复杂的非线性关系。传统…

中霖教育怎么样?注册会计师考试难吗?

中霖教育:注册会计师(CPA)考试的难度高吗? 对于不同背景的考生来说,注册会计师考试的挑战程度不同。那些有良好基础和充裕准备时间的考生,通过考试的可能性要超过那些从零开始且准备时间有限的人。 据最近…

GPOPS-II教程(5): 月球探测器着陆最优控制问题

文章目录 问题描述GPOPS代码main functioncontinuous functionendpoint function仿真结果 最后 问题描述 参考文献:[1] Meditch J. On the problem of optimal thrust programming for a lunar soft landing[J]. IEEE Transactions on Automatic Control, 1964, 9(4…

6.28学习笔记

一、马克思 1、对立的历史观:唯物史观、唯心史观(不是“主义”) 2、人口因素对社会发展起(制约和影响)作用 3、自然地理环境是人类社会生存和发展(永恒的、必要的条件) 4、哲学社会科学的发展水…

Linux基础- 使用 Apache 服务部署静态网站

目录 零. 简介 一. linux安装Apache 二. 创建网页 三. window访问 修改了一下默认端口 到 8080 零. 简介 Apache 是世界使用排名第一的 Web 服务器软件。 它具有以下一些显著特点和优势: 开源免费:可以免费使用和修改,拥有庞大的社区支…

Web渗透:任意文件下载

任意文件下载漏洞(Arbitrary File Download Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过修改输入参数,从服务器下载任意文件,而不仅仅是预期的文件;通常这种漏洞出现在处理用户输入的地方&…

343. 整数拆分(leetcode)

343. 整数拆分(leetcode) 题目描述 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。返回你可以获得的最大乘积 。 示例1 输入: n 2 输出: 1 解释: 2 1 1, 1 1…

python CSSE7030

1 Introduction In this assignment, you will implement a (heavily) simplified version of the video game ”Into The Breach”. In this game players defend a set of civilian buildings from giant monsters. In order to achieve this goal, the player commands a s…

Spring MVC数据绑定和响应——复杂数据绑定(三)复杂POJO绑定

一、复杂POJO数组绑定的使用场景 使用简单POJO类型已经可以完成多数的数据绑定,但有时客户端请求中传递的参数比较复杂。例如,在用户查询订单时,页面传递的参数可能包括订单编号、用户名称等信息,这就包含了订单和用户两个对象的信…

AI进阶指南第四课,大模型优缺点研究?

在上一篇文章中,我主要探讨了LM模型与企业级模型的融合。 但是,在文末对于具体的大模型优缺点只是简单地说明了一下,并不细致。 因此,在这一节,我将更为细致地说明一下大模型的优缺点。 一,隐私安全 将L…

2018年全国大学生数学建模竞赛A题高温服装设计(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分Matlab源代码问题11 求解h1h22 已知h1h2求解温度分布 问题21 求解第二层最佳厚度 四、完整word版论文和源代码(两种获取方式) 一、部分题目 2018 年高教社杯全国大学生数学建模竞赛题目 A 题 高温作业专用服…

vCenter- KMS Server healthy warning

- 问题摘要:KMS Server healthy warning. - 分析/故障排除: 检查集群配置-Security-Key Providers界面,发现KMS Server并没有完整配置并且目前集群内的虚机没有使用加密功能(VM Encryption),您可以忽略该告警提示。 …

Linux C 程序 【02】创建线程

1.开发背景 上一个篇章,基于 RK3568 平台的基础上,运行了最简单的程序,然而我们使用了 Linux 系统,系统自带的多线程特性还是比较重要的,这个篇章主要描述线程的创建。 2.开发需求 设计实验: 创建一个线程…

【linux】find命令详解

Linux中的find命令用于在文件系统中搜索符合条件的文件或目录。 一.基本语法 find [path] [expression] #path:搜索的起始目录,如果不指定,默认为当前目录 #expression:定义搜索条件的表达式 命令选项 -name 按文件名搜索 -size …

入门JavaWeb之 JavaBean 实体类

JavaBean 有特定写法: 1.必须有一个无参构造 2.属性必须私有 3.必须有对应的 get/set 方法 一般用来和数据库的字段做映射 ORM:对象关系映射 表->类 字段->属性 行记录->对象 连接数据库 没有的话去 Settings -> Plugins 搜索 Data…

Vue-路由

路由简介 SPA单页面应用。导航区和展示区 单页Web应用整个应用只有一个完整的页面点击页面中的导航连接不会刷新页面,只会做页面的局部更新数据需要通过ajax请求获取 路由:路由就是一组映射关系,服务器接收到请求时,根据请求路…

[论文阅读笔记33] Matching Anything by Segmenting Anything (CVPR2024 highlight)

这篇文章借助SAM模型强大的泛化性,在任意域上进行任意的多目标跟踪,而无需任何额外的标注。 其核心思想就是在训练的过程中,利用strong augmentation对一张图片进行变换,然后用SAM分割出其中的对象,因此可以找到一组图…

k8s集群node节点加入失败

出现这种情况: [preflight] FYI: You can look at this config file with kubectl -n kube-system get cm kubeadm-config -o yaml [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kub…

python 识别图片点击,设置坐标,离设置坐标越近的优先识别点击

import pyautogui import cv2 import numpy as np import mathdef find_and_click(template_path, target_x, target_y, match_threshold0.8):"""在屏幕上查找目标图片并点击。Args:template_path: 目标图片的路径。target_x: 预设的坐标 x 轴值。target_y: 预设…