事务超时时间无效_什么是ZooKeeper?ZooKeeper分布式事务详解

b23444103b3a0782faef19adf0c02307.png

前言

zookeeper当初到底面临什么问题?而zookeeper又是如何解决这些问题的?

实际上zookeeper主要就是解决分布式环境下的一致性问题。那么解决这个问题到底有哪些难点呢?我们一步一步来阐述和推理这个过程。

分布式事务

我们首先考虑一致性的特殊情况,即分布式事务的情况。分布式事务对于一致性的要求是强一致性,因此对于我们后续讨论有一定的借鉴意义。这里我们用到一个经典的例子:bob给smith转账,强一致性的要求一定是需要对外来说bob减钱的同时smith加钱。

单机环境下是这样的:

f23685464d6b0086df750b2add30c5b2.png

简单讲就是有关bob的减钱和smith的加钱都转同一个库来做,可以采用数据库的事务特性轻松支持。保证bob给smith转账的安全性。

而分布式环境就变这样了:

394faf4ef0d308c2d199335d1d71e554.png

假设应用服务器是A,bob端的数据库是B,smith端的数据是C,那么A做成一个转账,需要B事务成功提交,并且C事务成功提交。然而因为网络的影响,可能出现两种情况

  1. 如果bob扣款成功,而网络通知smith失败了,则会出现bob的钱减了,smith的钱没加
  2. 如果bob扣款不成功,而smith加钱成功了,则会出现smith钱增加了,但是bob的钱也没减少

2PC

这种不一致的问题困扰着大家。任意一边出错想要回滚另一边都不是简单的数据库回滚的事情( 因为此时已经成功提交),而是需要做业务的逆向操作,而不同业务的逆操作都不同,导致复杂性增加。考虑数据库事务的执行实际上是先将执行操作写入binlog,等到最后通过一个commit指令将binlog的内容一次更新到表中,或者写到一半通过一个rollback指令将binlog中的内容回滚。于是乎,可以想到使用2个阶段来执行这个过程,第一阶段,写入binlog;第二阶段执行commit或者rollback。这就是著名的两阶段提交协议(2PC)。如果仔细考虑,会发现两阶段协议并没有解决问题,只不过降低了出错的概率而已,因为第二阶段同样存在上面的两种情况。注意最终状态是多台机器的状态&&的 结果。以下是两阶段协议的时序图:

3c881f63b4f82ffe249051a464bd339e.png
  1. 考虑prepare阶段的响应(因为请求阶段和执行阶段都可以在最后响应中体现出来),对于分布式环境中,任意时刻考虑3种状态:成功、失败、超时。

a.成功。不必处理,执行后续行为commit。

b.失败。这是执行阶段出错,执行后续行为rollback。

c.超时。这可能是执行阶段太慢,也可能是网络阶段太慢或丢包,但是保守处理,超时可以当做出错。

可以看出,prepare阶段的问题能够完全避免。

  1. 考虑commit阶段,同样考虑成功失败超时3种状态。

a. 成功。整个事务成功执行

b. 失败。提交出错,假设此时前面的B已经提交成功了,则同样面临需要回滚B却无法回滚的问题,因为B已经提交成功了。

c. 超时。同上。

还有一种例外情况,即prepare阶段完成后A挂了,则B,C即进入不知所措的状态。

可以看出,在2PC中事务无法做到像单机一样安全,只不过降低了出问题的概率。

3PC

针对如何解决2PC中的例外情况,出现了3阶段提交协议。3阶段的主要改进是把2阶段的prepare再分为canCommit和preCommit两个阶段。

38bc53bf863205ea2822c009d3914151.png
  1. 考虑cancommit阶段的响应。

a.成功。不必处理,执行后续行为precommit。

b.失败。说明无法执行,无须后续提交或回滚行为。

c.超时。保守处理,超时可以当做失败。

  1. 考虑precommit阶段的响应。

a.成功。不必处理,执行后续行为docommit。

b.失败。执行阶段出错,执行后续行为rollback。

c.超时。执行阶段太慢,也可能是网络阶段太慢或丢包,但是保守处理,超时可以当做出错。

  1. 考虑cancommit阶段的响应。

a.成功。整个事务成功执行。

b.失败。提交出错,假设此时前面的B已经提交成功了,则同样面临无法回滚的问题。

c.超时。保守处理,超时可以当做失败。

例外情况,即自cancommit返回成功后的任意阶段A挂掉了,那么BC同样能够知道这个事务正在发生(因为cancommit已经提交了足够信息让BC知晓此事),于是BC可以在无A的情况下继续执行后续的阶段(比如BC投票启动新的A’,并提供A’足够信息)。于是3PC正好解决了2PC的例外情况。

但是3PC仍然存在类似2PC的问题,即最后阶段失败或超时同样有可能出现数据不一致的问题。所以3PC仍然只是降低了发生概率,并没有真正解决问题。

XTS

工业界的对分布式事务的应用是如何呢?可以参考某宝的知名分布式框架XTS。

XTS本质上是2PC(实际上如果引入3PC会多2n次网络交互,在量大时反而更加不安全)。XTS引入协调者A的server部分,实际上是一个大集群,以配置的方式接入各种需要分布式事务的业务,集群由专门的团队维护,保证其可用性和性能;而协调者A的client部分则通过发起方调用,prepare阶段时,先通过client将本次事务信息发送到server,落库,然后即时推送prepare请求到B和C,当收到B,C的响应时把他们状态入库,如果正常,则做commit提交;否则会用定时任务去推送未完成的状态直到完成。上文提到的prepare之后协调者A挂了这种情况,在server集群的保证下,几乎很少会发生。而上文提到的所有超时的情况,都可以通过定时任务推送拿到一个确定的状态而不是盲目的选择回滚或者提交。另外由于B和C都是集群,很少会发生多次请求过去无响应的情况。直到最后一种情况就是commit时B成功了C失败了,或者反过来B失败C成功,这种情况成为悬挂事务,最终等待人工来解决,据说每天都有几笔到几十笔。

无疑XTS作为2PC在工业界的应用,是相当了不起的设计,通过各种方式规避了各种可能的不一致性,在性能,效率等方面做到了平衡。

TCC(Try/Confirm/Cancel)

业务补偿类型,其基本思想是对每一个业务操作做一个逆操作,一旦成功了,就做正向业务,一旦失败了就做业务的逆操作。通常在业务逻辑简单并且正逆操作清晰的时候用比较好。

查询补偿

典型的场景是向银行发送了转账请求未得到明确的成功失败返回码,此时先做业务结果的查询,根据结果做相应处理,比如查询结果成功,则置状态为成功,查询结果失败,则做相应的业务补偿,查询结果为未知,则继续查询。

消息事务及消息重试

事务消息及消息重试本质上都是将一些通用的事务交给消息中间件,通过消息中间件来保证消息的最终一致性。

事实上,消息事务解决了这类问题,即本地事务和消息应当有一致性,解决这个一致性比较麻烦,比如消息中间件和业务同时实现XA;或者采用一些更加复杂的方式,比如将消息表与业务表放同库,利用数据库的事务来保证一致性,而消息系统只需要轮训该消息表即可;当然,也有消息的二阶段提交+补偿的方式。消息事务解决了消息发起方,即生产者与消息中间件之间的一致性问题。

try{      //数据库操作      //消息投递  }catch(Exception e){      //回滚  }

消息中间件与消费者之间的一致性问题则需要通过重试+幂等来解决。消息重试中主要考虑重试次数以及重试时间的阈值变化。

最后

4634874eada552bc17dbb8b920e56c37.png

我这边整理了一份:Zookeeper相关资料,Java核心知识点(包括Spring全家桶系列、面试专题和20年最新的互联网真题、电子书等)有需要的朋友可以私信回复【面试题】即可获取。

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

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

相关文章

MongoDB解决“Error parsing YAML config file: yaml-cpp: error at line 2, column value(安装服务)

解决“Error parsing YAML config file: yaml-cpp: error at line 2, column 13: illegal map value”(安装服务) 在安装 MongoDB服务中,我遇到以下报错: 解决: 于是我,我打开配置文件mongod.cfg&#x…

from mysql partition select_玩转select条件查询,避免踩坑

条件查询语法:select 列名 from 表名 where 列 运算符 值说明:注意关键字where,where后面跟上一个或者多个条件,条件是对前面数据的过滤,只有满足where后面条件的数据才会被返回。下面介绍常见的查询运算符。操作符描述…

Linux使用vi/vim打开文档/文件报错E325:ATTENTION Found a swap file by the name

重点:解决方法是: rm -rf .文件名.文件类型后缀.swp 如 rm -r .mongod.conf.swp 1、对于同一个文件如果上次已经打开,而未关闭的情况下,又打开该文件进行编辑时,会出现如下提醒: 这是由于已经打开但未闭关…

vue 怎么样不重复往数组里插入数据_前端数据结构与算法(1) -二分查找vs二叉树...

今天给大家开始介绍前端方面的数据结构,刚把vue源码过完就开始数据结构,可见它的地位有多重要。有人说我一前端又不是后端学这个数据结构干嘛,好吧,只能说你还没有这个意识,一是面试很多大厂就会考察,我面试…

MongoDB出错:ERROR: child process failed, exited with error number 1 To see additional infor

linux中安装mongoDB之后,启动不了,出现下边的错误,网上搜原因,很多说需要删除.lock文件,需要bin/mongod --repair修复,但是都不成功,最后发现是配置文件中路径问题。 [rootwqd mongodb]# bin/m…

js中立即执行函数会预编译吗_作为前端你了解JavaScript运行机制吗?

作为前端工程师,大家都知道js是前端一开始就要学会的知识点,js的代码你会写了,那js的运行机制你了解吗?只有了解了js的运行机制,才能在工作中如鱼得水,今天就跟随珠峰的老师一起来了解下js的运行机制吧。Ja…

nfine框架 上传文件_MVC之Struts2框架--你并不了解的高级应用

《“爱读书”--给你讲技术》,我来看书,你来进步,让我们开始吧!本书简介书名为《轻量级JavaEE企业应用实战》,是本人在学习JavaEE框架的时候阅读的第一本书,本书对于框架及相关基础知识讲述的比较详细和浅显…

阿里云服务器ping不通解决办法

阿里云服务器ping不通解决办法 阿里云服务器ping不通解决办法(云服务器搭建完环境访问不了ip解决办法) 问题:这里的服务器我以阿里云为例最近搞服务器,然后Ubuntu16.04下搭建LAMP环境后发现输入ip(http://1XX.XX.XX.…

java移动端接口测试_走进Java接口测试之测试框架TestNG数据驱动(入门篇)

前言我们在前面的文章中,和大家分享过接口自动化测试一些基本的实现方法,但是,你很快就会发现,如果在测试脚本中硬编码测试数据的话,测试脚本灵活性会非常低。而且,对于那些具有重复的请求,而只…

Windows更新右下角出现 天气温度等提示,如何取消

Windows更新后出现桌面下面出现 天气温度等提示,如何取消 解决:点击鼠标右键

经济专业为什么学python_既然有了会计学专业,为什么还要有税收学专业?

很多人说会计学也学税务知识,税务局招收公务员也面向会计,税务师事务所也招会计专业,那还有设置税收学专业的必要吗?按照国际通用说法,税收学只是会计学的组成部分,也可以说是一个方向,考会计师…

解决MongoDB Compass

远程连接mongoDB踩过的坑 我使用的是阿里云的服务器,用在服务器上安装完mongoDB之后,使用mongoDB Compass远程连接,连接不上。防火墙27017端口开放了,阿里云安全组27017端口也开放了,还是无法成功。 最后发现ping我的…

预测回归_回归分析预测技术简介

回归分析的基本概念是用一群变量预测另一个变量的方法。通俗点来讲,就是根据几件事情的相关程度来预测另一件事情发生的概率。回归分析的目的是找到一个联系输入变量和输出变量的最优模型。回归方法有许多种,可通过 3 种方法进行分类:自变量的…

【MongoDB 工具篇】MongoDB Compass介绍与简单使用

MongoDB Compass 是一款GUI工具,用于对MongoDB进行简单管理。 1 软件环境 使用的软件分别为: MongoDB Compass 1.19.12 MongoDB 4.2.0 2 软件介绍 2.1 连接到主机界面 安装完MongoDB Compass后,打开软件,进入连接到主机界面…

计算机网络—一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块

计算机网络:一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为:91,150,3,15。该自治系统分配到的IP地址块为30.138.118/23。试给出每一个局域网的地址块(包括前缀&#xf…

取消语法检测_中考取消了考纲,学生要如何得高分

日前,教育部宣布取消初中学业水平考试大纲。对于广州的考生而言,意味着中考考纲取消。连日来,这一消息引发了学生、家长、老师们的巨大关注。为此,广州日报邀请了广州大学附属中学语文一级教师王琪、数学高级教师罗剑文以及广州广…

某公司为本科以上学历的人重新分配工作,分配原则如下。 (1)如果年龄不满18岁,学历是本科,男性要求报考研究生,女性则担任行政工作; (2)如果年龄满18岁不满5o 岁,学历本科,不分男女,任中层领导

软件测试——决策表 10.某公司为本科以上学历的人重新分配工作,分配原则如下。 (1)如果年龄不满18岁,学历是本科,男性要求报考研究生,女性则担任行政工作; (2)如果年龄满18岁不满5o 岁,学历本科,不分男女&…

.某学校的学生公寓有14栋楼,用A~N这14个大写字母的其中一个代表楼号,每栋楼的层数为6层,用1~6六个数字表示。每层楼有40个房间,编号为01~40。具体表示一个宿舍房间时,用1个字母加3位数字表

软件测试——等价类划分法 1.某学校的学生公寓有14栋楼,用A~N这14个大写字母的其中一个代表楼号,每栋楼的层数为6层,用1~6六个数字表示。每层楼有40个房间,编号为01~40。具体表示一个宿舍房间时…

如何免费下载和安装Windows 11

微软今天放出了 Windows 11 Build 22000.51 预览版,如果你想要尝鲜或者冒险,那么本文分享如何免费下载和安装 Windows 11 的小技巧。再次需要提醒的是,目前 Windows 11 系统极不稳定,充斥着大量 BUG,可能会导致系统崩溃…

北大青鸟消防控制器组网_北大青鸟JBF-61S20防火门监控器控制器接线示意图

北大青鸟JBF-61S20防火门监控器控制器接线示意图一,北大青鸟JBF-61S20防火门监控器控制器接线示意图功能防火门控制及状态 监测功能手动、自动关闭常开防火门;实时监控常开或常闭防火门的状态信息,并进行上报和显示。联网功能监控器可以与青鸟…