ImageVerifierCode 换一换
格式:DOCX , 页数:4 ,大小:240.77KB ,
资源ID:4281244      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4281244.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(分布式系统事务原子性的非阻塞实现.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

分布式系统事务原子性的非阻塞实现.docx

1、分布式系统事务原子性的非阻塞实现分布式系统事务原子性的非阻塞实现分布式系统事务原子性在现实的分布式系统中,多对象更新的操作很常见,但是实现起来却并不简单。同时更新两个或多个对象时,对于这些对象的其他读取者,原子性很重要:你的更新要么全部可见,要么全部不可见。这里所说的原子性和线性一致并不是一个概念,数据一致性在Gilbert和Lynch证明CAP原理时被提到过,后来通常被称为原子一致性。而线性一致化关注实时的顺序操作,是一个单对象的问题。这里的“原子性”源于数据库环境(ACID中的“A”),涉及对多个对象的执行和查询操作。为了避免混淆,我们称这个原子性为“事务原子性”。许多场景中都会遇到这种问

2、题,从社交网络图(例如Facebook的TAO系统,双向的朋友关系被保存在两个单向的指针中)到类似计数器(例如Twitter的Rainbird分层聚合器)和二级索引的分布式数据结构。本文中,我将假设我们的工作都是高可用的事务,原子性的多对象更新,或事务的原子性,是其首要特性。现有的技术多对象更新的事务操作通常采用以下三种策略之一:锁使用锁来同时更新多个项目。执行更新操作时加写锁,执行读操作时加读锁,就可以保证事务的原子性。但是在分布式环境中,局部故障和网络延迟都意味着锁操作可能会导致Bad Time。具体来讲,锁操作有可能会导致一些怪异的结果。如果客户端在持有锁时宕机,服务器本应该最终撤销这个

3、锁。这需要某种形式的故障检测或超时(在异步网络中会导致一些尴尬的情况)以及在撤销锁前同时撤销以前的操作。但是在执行更新操作时阻塞读操作显然是不合理的,反之亦然。如果我们追求高可用性,锁不是一个值得考虑的方案。实体组将想要同时更新的对象放在一起。这种策略通常称为“实体组”,可以让事务性原子更简单:在一台机器上加锁很快,而且不会遇到分布式锁的局部故障和网络延迟的问题。不幸的是,这种解决方案会影响数据布局和分布,而且不适用于难于分割的数据。Fuck-it模式使用“fuck-it”模式,不进行任何并发控制的情况下更新所有的对象,并保持事务的原子性。这个策略是很常见的:扩展性良好,适用于任何系统,但是直

4、到系统达到稳定状态后,才会提供原子性保证(例如聚合,或者说最终一致性)。NBTA在这篇文章中,作者会介绍一种简单的替代方案,作者称其为事务原子性的非阻塞实现,简称为NBTA(Non-blocking transactional atomicity),使用多版本和一些额外的元数据在不使用锁的情况下,保证事务的原子性。具体来说,这种方案不会由于过程错误而阻塞读取和写入操作。关键的想法是避免执行局部更新,并且利用额外的元数据代替副本间的同步。NBTA示例可以用这个简单的场景来说明NBTA:有两个服务器,server for x上存储x,server for y上存储y,初值都是0。假设有两个客户端,

5、Client1要执行写入操作,使x=1,y=1,Client2要同时读取x和y,关于副本的问题稍后会讨论。作者将Client1要执行的写入操作称为一个事务,而这个事务的操作对象server for x和server for y被称为事务兄弟。good和pending将每台服务器的存储分为两中状态:good和pending。要保证同属于一个事务的写入操作,如果其中一个操作被存储为good状态,这个事务的其它写入操作要么被存储为good,要么被存储为pending。比如在上面所说的场景中,如果x=1在server for x上被存储为good,那么必须保证y=1在server for y被存储为g

6、ood或pending。首先,各服务器会收到到写操作请求保存为pending状态,然后一旦服务器知晓(可能是异步的)某个写入操作相关的事务兄弟都已经将操作请求保存为pending状态,这个服务器就会更新这个操作为good状态。客户端进行两轮通信,就可以使服务器得到写操作已经稳定的信息:第一轮通信中,server for x和server for y会将从Client1收到请求保存为pending状态,并将确认回复给Client1,Client1收到确认后会进行第二轮通信,通知server for x和server for y写操作已达到稳定状态。竞争危害和指针理想的状态是,只读取good状态的

7、数据,就可以保证事务的原子性。但是存在一种竞争条件的情况:比如server for x已经更新x=1,并保存为good状态,但在其事务兄弟server for y中相关操作y=1依旧是pending状态,Client2如果只读取good状态的数据,得到的结果将是x=1,y=0,破坏了事务的原子性。我们希望这种情况下,第二个服务器能够自动调用pending状态的数据以供读取。为了解决这个问题,可以在每个写入操作中加入一些额外的信息:事务兄弟的列表以及一个时间戳。这个时间戳是客户端进行多值更新前,为每个写操作唯一生成的,比如,可以是客户端ID+本地时间或一个随机数。这样的话,当一个客户端读取goo

8、d状态的数据时,还会读到时间戳和具有相同时间戳的事务兄弟的列表。客户端也会在发送读取请求附带一个时间戳,服务器会根据时间戳从pending或good中取出数据交付给客户端。如果客户端的请求中没有附带时间戳,服务器会将good中时间戳最高的值交付给客户端。优化以下是NBTA算法的一些优化:pending和good的规模如果用在good中只保存最近的写入操作,那么一个写入操作的兄弟事务可能会被覆盖,为了避免这种情况的发生,服务器会在good中将历史数据保留一定的时间。更快的写操作有一种方案可以替代客户端的第二轮通信操作。服务器一旦将写操作存入pending中,就直接互相通信,可使用类似于PAXOS

9、的算法实现。此外,客户端也可以异步发起第二轮通信。然而,为了确保客户端在这些情况下读取写操作,它们要保留元数据直到每个写操作都被存为good状态。副本目前为止的讨论都基于每个数据项只存储在一个服务器上。算法实现的前提条件是每个服务器的强一致性。服务器间的副本有两种情况:如果所有的客户端都只能访问一部分服务器,那么客户端只需要对这些对应的服务器集合进行更新,这组服务器都存有数据的副本。如果客户端可以访问任何服务器,那么需要花费较长的时间去同步数据。读/写事务以上讨论的算法同样适用于读/写操作。对于ANSI标准的可重复读模型,主要的问题是保证从一个事务的原子组中读取。可以在事务执行前,事先声明所有

10、的读取操作或者通过类似向量时间的元数据实现。元数据的规模最谨慎的做法是将元数据一直保存,但是也可以在写操作在所有服务器中都达到good状态时,将元数据删除。算法的实现作者采用LevelDB数据库实现了NBTA算法及其改进。在Yahoo!的云平台上,8个操作的NBTA事务可以达到最终一致性的33%(所有都是写操作)至95.2%(所有都是读操作)峰值吞吐量。并且这种实现是线性扩展的,运行50个EC2实例,对于长度为8的事务(50%的读操作,50%的写操作),可以达到每秒执行250000次操作。实验结果表明NBTA的性能大大优于基于锁的操作,因为不会发生阻塞。主要的花销来自于元数据以及将写入操作从p

11、ending更新为good。基于这些结果,作者已经开始将NBTA应用于其它数据存储和二级索引上。结论这篇文章展现了如何在不使用锁的情况下,实现在任意数据分片的原子性多对象更新。数据库中有很多类似于NBTA的算法。例如客户端第二轮通信的优化是通过PAXOS的算法实现的,使用额外的元数据保持并发更新类似于B树或其它非锁的数据结构。当然,多版本并发控制和基于时间戳的并发控制在数据库系统中也都有悠久的历史。但是NBTA的关键是实现事务的原子性,同时避免中央集权的时间戳或并发控制机制。具体来说要在数据读取操作前达到一个稳定状态,主要的挑战是解决竞争条件。在实际中,相比其它基于锁的技术,这个算法表现得很好。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1