分布式事务:2PC、3PC、TCC、zab协议回顾

2PC:两阶段提交协议。

        事务分为提交和执行两个阶段。

阶段一:协调者发送事务的请求到事务的执行方,执行方执行事务并记录undo和redo,但不提交事务。然后返回执行情况。

阶段二:协调者发送提交事务请求到各执行方,让各方提交事务或者回滚事务。

        存在问题:1)协调者是个单点问题。2)如果第二阶段超时了会导致脏数据。

3PC:两阶段协议的改进。二阶段一来就开始执行执行事务,如果有人不能执行这样会导致占用资源。所以将一阶段拆分为两个阶段。增加先询问对方是否可以执行事务。

阶段一:协调者询问各方能否执行事务。

阶段二:协调者发送事务的请求到事务的执行方,执行方执行事务并记录undo和redo,但不提交事务。然后返回执行情况。

阶段三:协调者发送提交事务请求到各执行方,让各方提交事务或者回滚事务。

        存在问题:和上面问题一样,还多了一次执行请求。

TCC协议:上面2阶段,3阶段都是数据库层面的常用协议,tcc是上层应用的协议。

Try尝试阶段:尝试执行。比如先把状态改为一个中间状态。确保别人不会动这个数据。
Confirm确认阶段:确认执行。把这个中间状态改为最终状态。
Cancel取消阶段:取消执行。如果失败了把这个中间状态恢复到原始状态。

zab协议:是分布式协调组件zookeeper采用的分布式一致性协议。他的目的就是要保证数据的一致性。

zab协议要讲清楚可以分为几个部分:

1,协议里有三种成员:

        领导者:接收写请求,集群只有一个领导者。所以这也是zookeeper会有写入瓶颈的原因。

        跟随者:参与写入请求的投票和选举,并随时准备成为新的领导者。

        观察者:只负责只读请求,他的作用是分摊读的压力。

2,怎么选举的?怎么恢复数据?

      当跟随者发现和leader断开链接时会发起选举。其中有个最重要的就是投票信息。这个投票信息由:任期编号(谁当选leader,这个任期就+1,可以理解为多少届)+事务编号+节点编号(配置节点时填的那个数字编号)组成。

        当节点发现和leader失去联系时,节点会发起选举。节点会拿着投票信息,先投自己一票,然后广播出去叫别人投自己。最后对比自己的选票池,谁的票最多谁就是leader。那么选谁做为leader呢?关键就在于这个投票信息的判断了。

        1)判断任期大的优先。

        2)任期一样的判断事物id大的优先。

        3)事务ID也一样那就选节点编号大的优先。

        当别人叫你投票时,你判定别人比你更适合当leader时,你就会把票投给他。否则不与投票。当一个投票周期结束时,你会对比自己的投票池,看你收到了几个票,投出去了几个票,你是否满足票数过半。如果满足就宣布你是leader,并广播出去。别人收到你是leader的广播后,别人也会看他的投票池,并确认你是否为leader。如果都确定了,那么将进行数据同步,将leader的数据同步到跟追者。等数据都同步完成时,leader才能接收写入请求。

2,怎么写数据?

        leader写入数据时,会往跟追者也写一份(这时还没真正提交数据)。当过半的跟随者都写入时成功时,leader会让跟随者提交数据,这时跟随者才提交数据。这时一个写入才算完成。类似二阶段写入。所以写入性能不会很高,是单机的。而且这里是一个请求完成才会进行下一个请求,所以也是有顺序的。

3,怎么读数据?

        所有节点都可以直接读数据。

4,会不会丢数据呢?

        当一个事务被过半的跟随者成功响应ack后,只向其中一个跟随者发送commit信息则或者一个commit都没发出则leader退出了。这种情况,跟随者会将自己没提交的提交了,然后进行选举,有高事务ID的跟随者会当选leader。这个数据不会丢。

        当一个事务刚被发出来,比如只有一个跟随者收到了消息后,其他都还还没收到。这时leader退出了,那么这个接收者会提交本事务。这里又分两种情况:这个跟随者自己也挂了,那么其他跟随者选举出来的肯定就没这个数据。这个跟随者没挂,他当选了,这个数据就没丢。就算当这个跟随者恢复了,别人已经当选了。那么他多出的这个数据也会被要求丢掉。

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

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

相关文章

“语法糖“

在计算机编程中,"语法糖"是指一种编程语言的语法特性或语法结构,它在语法上提供了更简洁、易读、易写的方式来表达某些常见的操作或模式,而不是引入新的功能或概念。语法糖是一种语法上的改进,旨在使代码更加清晰和易于…

shell脚本5 函数 数组

函数 试题1 查看版本 如果想更方便,可以建立一个专门存函数的文件 将func.sh里面的命令都移到func文件夹里面,在脚本里面执行文件夹更方便 输入echo $?反馈的结果都是0,都认为是正确的 无法使用$?去检验是否正确,所以要在后面增…

【Java反序列化】Shiro-550漏洞分析笔记

目录 前言 一、漏洞原理 二、Shiro环境搭建 三、Shiro-550漏洞分析 解密分析 加密分析 四、URLDNS 链 前言 shiro-550反序列化漏洞大约在2016年就被披露了,在上学时期也分析过,最近在学CC链时有用到这个漏洞,重新分析下并做个笔记&…

代码随想录算法训练营第十九天|654 最大二叉树、617 合并二叉树、700 二叉搜索树中的搜索、98 验证二叉搜索树

654 最大二叉树 题目链接:最大二叉树 思路 这道题目是让我们构造最大二叉树并返回根节点。谈及二叉树,首先要确定遍历方式,这道题目一个符合思维的遍历方式是前序遍历(中左右),先有中间节点,然后递归构造左节点和右…

LocalContainerEntityManagerFactoryBean源码

是 Spring Data JPA 中的一个类,它用于创建 EntityManagerFactory 的实例,获取EntityManager实例 public class LocalContainerEntityManagerFactoryBean extends AbstractEntityManagerFactoryBeanimplements ResourceLoaderAware, LoadTimeWeaverAwar…

Java 集合 04 综合练习-查找用户是否存在

练习、 代码: public class User{private String id;private String username;private int password;public User() {}public User(String id, String username, int password) {this.id id;this.username username;this.password password;}public String getI…

Linux提权:Docker组挂载 Rsync未授权 Sudo-CVE Polkit-CVE

目录 Rsync未授权访问 docker组挂载 Sudo-CVE漏洞 Polkit-CVE漏洞 这里的提权手法是需要有一个普通用户的权限,一般情况下取得的webshell权限可能不够 Rsync未授权访问 Rsync是linux下一款数据备份工具,默认开启873端口 https://vulhub.org/#/envir…

如何制作一个简单的HTML个人网页

在当今的数字化时代,个人网页已经成为展示个人品牌、项目或兴趣爱好的重要平台。对于许多初学者来说,如何制作一个简单而精美的个人网页可能会有些困惑。本文将向您介绍如何制作一个简单的HTML个人网页,帮助您轻松入门网页制作。 一、准备工…

系统架构设计师-21年-论文题目

系统架构设计师-21年-论文题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 摘要字数在400字以内,可以分条叙述,但不允许有图、表、流程图。 正文字数为2000字至300字,文中可以分条叙述,但不要全部用分条叙述的方式。 …

go-zero 统一返回

1、整体目录结构 2、全局处理主入口 package manageimport ("net/http""github.com/zeromicro/go-zero/rest/httpx" )type Body struct {Code int json:"code"Message string json:"message"Result interface{} jso…

RocketMq源码搭建报错No route info of this topic: TopicTest

原因 因为broker没有注册到namsesrv中,导致无法创建Topic 解决办法 启动Borker时,指定namsesrv地址 over!!!

防御保护常用知识

防火墙的主要职责在于:控制和防护 --- 安全策略 --- 防火墙可以根据安全策略来抓取流量之 后做出对应的动作 防火墙分类主要有四类: 防火墙吞吐量 --- 防火墙同一时间能处理的数据量多少 防火墙的发展主要经过以下阶段; 传统防火墙&#xf…

SpringBoot之JWT登录

JWT JSON Web Token(JSON Web令牌) 是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任,因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…

Element table组件内容\n换行

漂亮的页面总是让人心旷神怡,层次清晰的页面让用户操作起来也是易于上手及展示。 如下的页面展示就是非常low的:用户根本阅读其中的数据。 在这个页面,根据用户填写过程生成多次填写记录,如果不进行层次性的展示,数据…

【python】积分

scipy.integrate 函数说明quad(func,a,b,args)一重积分 ,a,b:x方向的积分区间dblquad(func, a, b, gfun, hfun, args())二重积分,gfun、hfun:y方向的积分区间tplquad(func, a, b, gfun, hfun, qfun, rfun, args())三重积分&#…

多重背包I

多重背包I 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 输入格式 第一行两个整数&…

qemu调试kernel启动(从第一行汇编开始)

一、背景 大部分qemu调试kernel 都是讲解从start_kernel开始设置断点,然后开启调试; 但是我们熟悉linux启动流程的伙伴肯定知道,在start_kernel之前还有一段汇编,包括初始化页表及mmu等操作, 这部分如何调试呢&#x…

漏洞原理linux操作系统的SqlMap工具的使用

漏洞原理linux操作系统的SqlMap工具的使用 Linux操作系统基础操作链接: 1024一篇通俗易懂的liunx命令操作总结(第十课)-CSDN博客 kali的IP地址:192.168.56.1 实操 # kali中使用sqlmap http://192.168.56.1/ sqlmap -u http://192.168.56.1/news/show.php?id46 sqlmap -u …

​ArcGIS Pro 如何批量删除字段

在某些时候,我们得到的图层属性表内可能会有很多不需要的字段,如果挨个去删除会十分的麻烦,对于这种情况,我们可以使用工具箱内的字段删除工具批量删除,这里为大家介绍一下使用方法,希望能对你有所帮助。 …

如何创建用户友好的软件产品说明书?(上:建议篇)

之前我有写过关于制作和编写用户友好的产品说明书需要注意哪些地方,以及有哪些方法可以比较快速制作编写产品说明书。但是有网友在后台私信我,说想要知道细化到软件的产品说明书需要注意什么?所以我打算将关于“软件产品说明书”的主题分成两…