两阶段提交协议 (原文链接http://blog.youkuaiyun.com/nieanan3602/article/details/8375077)

本文详细介绍了两阶段提交协议和三阶段提交协议在解决分布式环境中一致性问题上的应用与区别,分析了各自存在的问题及解决思路,包括‘死等’和‘脑裂’问题,并对比了两种协议在网络通信开销和实际应用中的表现。

本文以CS服务模式为例,对两阶段提交协议的背景、流程、存在的问题及解决办法等进行了讨论,最后进行了简要总结。

0. 背景

在CS服务模式中,服务器集群提供服务,客户端消费服务。当服务器数据发生变更时,需要保证服务器集群中的单台状态一致,并能够对外提供可用的服务。所谓状态一致,指的是每个单台服务器在完成变更后要数据要一致,比如在一次插入操作中,要么全部插入成功、要么全部插入失败。

客户端较少时,服务器可以为单机,如图1所示。这时,只要变更信息写入服务器并保存到本地磁盘,本次变更就成功了——这时,不存在一致性问题,但存在安全问题。


 

客户端增多时,需要采用服务器集群的方式对外提供服务,如图2所示。服务器1和2的内容完全一样,组成一个服务器集群;客户端1、2和3认为服务器集群是一个服务提供商,他们感受到的、由集群提供的服务是一样的。当产生变更时,变更信息被直接发送给不同的单台服务器,然后由单台服务器完成数据更新。假设在更新过程中,服务器1成功、服务器2失败,这时在客户端看来,服务器集群对外提供了不一致的服务——客户端1和2感受到了更新、客户端3没有感受到变更。两阶段提交协议,是为了解决这个问题而被提出的。


 

1. 协议流程

如图3所示,在两阶段提交协议中,引入了协调者。相比直接更新而言,在两阶段提交中,变更信息首先被发送给了协调者,然后由协调者去控制服务器集群的变更。


两阶段协议的流程如图4所示,描述如下:


准备阶段(prepare)

①协调者向各单台服务器发送prepare消息,询问对方是否具备变更条件;开启prepare询问超时机制

②各单台服务器收到prepare消息后,回复协调者:如果具备条件,回复yes,并挂起自身等待协调者的进一步通知;反之,回复no但不进入挂起状态

 

提交阶段(commit)

③协调者整理各单机的prepare反馈消息。如果全部单台服务器均准时回复yes,则协调者认为此次变更可以推行,于是向各单台服务器发送提交消息commit;如果存在回复no或者超时的服务器,则协调者认为此次变更不可以推行,于是向各单台服务器发送放弃消息abort。在协调者发送完commit或abrot后,其陷入等待状态,直到收到所有单台服务器的回执

④如果收到commit,则单台服务器执行本次更新,更新完毕后回执协调者c_ack(commit_ack);如果收到abort,则单台服务器解除本地资源锁,然后回执协调者a_ack(abort_ack)

 

2. 协议存在的问题及解决思路

由协议流程的描述,可以看出很明显的问题。问题1称为“死等”,协调者在第③步会挂起,直到收到所有单台服务器的回执,如果某台服务器宕机,则协调者将永远挂起;同时,单台服务器也可能会因为等待协调者的进一步指令而挂起;此时,服务器集群将不能对外提供服务。问题2是,如果步骤③协调者发送commit给服务器1成功,在发送给2时发送了宕机,这样,服务器1进行了更新,而服务器2没有收到commit消息而不能进行更新,这样服务器1和服务器2的内容就不一致了(“脑裂”)。

对于问题1,可以采用三阶段提交的方式解决。问题2,可以采用添加观察者的方式解决。本文只讨论问题1的解决方法。三阶段提交的流程如图5所示,其中步骤①和②与两阶段提交协议相同,放弃提交的流程业余两阶段相同。


当协调者认为可以提交变更时,

③协调者首先会向各个单台服务器发送一个pre_commit消息,然后自己进入超市机制;

④如果单台服务器能够正常提交更新,则回复yes同时进入超市机制等待协调者的进一步通知,反之回复no;

⑤协调者收集各单台服务器的pre_commit回执,只有在全部服务器回复了yes的情况下,协调者发送commit给各服务器,然后终止工作;否则,发送abort消息给各服务器,然后停止工作。单台服务器执行commit或abort消息,执行完毕后停止工作。

 

由上述分析可知,两阶段提交中的挂起状态,被三阶段提交改进称为超时机制,从而解决了“死等”的问题;但不能解决“脑裂”问题。

 

3. 总结

有上述分析,两阶段提交协议很大程度上解决了分布式环境下的一致性问题,但仍然存在“死等”和“脑裂”问题;三阶段提交协议解决了“死等”问题,但不能解决“脑裂”问题,还增加了网络通信的开销。实际使用过程中,三阶段提交协议很少使用。两阶段提交不能直接使用,但其变体使用很广泛。

<think>嗯,用户想访问优快云博客126023737的内容,但直接访问可能有问题。首先,我需要确认这个博客ID是否正确。通常,优快云的博客文章链接是类似“https://blog.csdn.net/用户名/article/details/数字”的形式,而用户提供的ID是126023737,这可能是指文章详情页的ID。不过,直接输入这个数字到URL中可能无法访问,因为正确的URL结构需要用户名和文章ID组合。比如,正确的链接应该是“https://blog.csdn.net/作者用户名/article/details/126023737”。接下来,用户可能需要验证这个ID是否存在。如果用户无法直接访问,可能需要通过其他方法,比如使用优快云的搜索功能,输入文章标题或关键词,或者使用文章ID进行搜索。但优快云的搜索可能不支持直接通过数字ID查找,这时候可能需要借助其他方式,比如站内搜索或第三方工具。另外,用户可能没有意识到需要正确的URL结构,所以需要指导他们如何构造正确的链接。如果用户不知道作者用户名,可能需要通过其他途径获取,比如联系发布者或查找相关引用。此外,用户可能想保存或打印该博客内容,这时候可以建议使用浏览器控制台的方法来移除侧边栏和其他干扰元素,直接打印成PDF,如引用3所述的方法。还有,用户可能遇到权限问题,比如文章被删除或设置为私有,这时候需要提示用户检查是否有访问权限,或者联系优快云客服。如果用户希望爬取内容,可以引用4中的Python爬虫方法,但需注意遵守优快云的robots.txt和版权规定。 最后,需要生成相关问题,帮助用户进一步解决可能遇到的问题,比如如何构造正确URL、如何搜索特定文章、如何保存为PDF等。确保回答结构清晰,步骤明确,参考已有的引用内容提供可行的方法。</think>根据您提供的博客ID(126023737),优快云博客的访问通常需要完整的URL结构。以下为几种可能的访问方式及注意事项: ### 1. 直接通过文章ID构造URL访问 标准优快云博客链接格式为: $$https://blog.csdn.net/作者用户名/article/details/文章ID$$ 若您已知作者用户名,可将链接构造为: $$https://blog.csdn.net/作者名/article/details/126023737$$ *注意*:当前优快云的URL策略已改为优先显示文章标题而非纯数字ID,建议通过其他方式获取完整链接[^3]。 ### 2. 站内搜索方法 在优快云搜索栏尝试: - 输入已知的文章标题片段 - 使用高级搜索语法:`site:blog.csdn.net inurl:126023737` - 通过作者的其他文章追溯关联内容[^4] ### 3. 技术手段辅助访问 若需保存内容,可参考打印优化方法: ```javascript // 在浏览器控制台执行此脚本清理页面元素 (function(){ $("#side").remove(); window.print(); })() ``` 此脚本可移除侧边栏等干扰元素后打印为PDF[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值