`
welcome66
  • 浏览: 403643 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分布式系统的一致性算法简介

阅读更多

在分布式系统中,我们经常遇到多数据副本保持一致的问题,在我们所能找到的资料中该问题讲的很笼统,模模糊糊的,把多个问题或分类糅合在一起,难以理解。在思考和翻阅资料后,通俗地把一致性的问题可分解为2个问题:

1、任何一次修改保证数据一致性。

2、多次数据修改的一致性。

在弱一致性的算法,不要求每次修改的内容在修改后多副本的内容是一致的,对问题1的解决比较宽松,更多解决问题2,该类算法追求每次修改的高度并发性,减少多副本之间修改的关联性,以获得更好的并发性能。例如最终一致性,无所谓每次用户修改后的多副本的一致性及格过,只要求在单调的时间方向上,数据最终保持一致,如此获得了修改极大的并发性能。

在强一致性的算法中,强调单次修改后结果的一致,需要保证了对问题1和问题2要求的实现,牺牲了并发性能。本文是讨论对解决问题1实现算法,这些算法往往在强一致性要求的应用中使用。

解决问题1的方法,通常有两阶段提交算法、采用分布式锁服务和采用乐观锁原理实现的同步方式,下面分别介绍这几种算法的实现原理。

 

  • 两阶段提交算法

 

 

在两阶段提交协议中,系统一般包含两类机器(或节点):一类为协调者(coordinator),通常一个系统中只有一个;另一类为事务参与者(participants,cohorts或workers),一般包含多个,在数据存储系统中可以理解为数据副本的个数。两阶段提交协议由两个阶段组成,在正常的执行下,这两个阶段的执行过程如下所述:

  • 阶段1:请求阶段(commit-request phase,或称表决阶段,voting phase)。

         在请求阶段,协调者将通知事务参与者准备提交或取消事务,然后进入表决过程。在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)。

  • 阶段2:提交阶段(commit phase)。

        在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。当且仅当所有的参与者同意提交事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务。参与者在接收到协调者发来的消息后将执行响应的操作。

          举个例子:A组织B、C和D三个人去爬长城:如果所有人都同意去爬长城,那么活动将举行;如果有一人不同意去爬长城,那么活动将取消。用2PC算法解决该问题的过程如下:
  • 首先A将成为该活动的协调者,B、C和D将成为该活动的参与者。
  • 阶段1:A发邮件给B、C和D,提出下周三去爬山,问是否同意。那么此时A需要等待B、C和D的邮件。B、C和D分别查看自己的日程安排表。B、C发现自己在当日没有活动安排,则发邮件告诉A它们同意下周三去爬长城。由于某种原因,D白天没有查看邮件。那么此时A、B和C均需要等待。到晚上的时候,D发现了A的邮件,然后查看日程安排,发现周三当天已经有别的安排,那么D回复A说活动取消吧。
  • 阶段2:此时A收到了所有活动参与者的邮件,并且A发现D下周三不能去爬山。那么A将发邮件通知B、C和D,下周三爬长城活动取消。此时B、C回复A“太可惜了”,D回复A“不好意思”。至此该事务终止。

两阶段提交算法在分布式系统结合,可实现单用户对文件(对象)多个副本的修改,多副本数据的同步。其结合的原理如下:

          1、客户端(协调者)向所有的数据副本的存储主机(参与者)发送:修改具体的文件名、偏移量、数据和长度信息,请求修改数据,该消息是1阶段的请求消息。

2、存储主机接收到请求后,备份修改前的数据以备回滚,修改文件数据后,向客户端回应修改成功的消息。 如果存储主机由于某些原因(磁盘损坏、空间不足等)不能修改数据,回应修改失败的消息。

3、客户端接收发送出去的每一个消息回应,如果存储主机全部回应都修改成功,向每存储主机发送确认修改的提交消息;如果存在存储主机回应修改失败,或者超时未回应,客户端向所有存储主机发送取消修改的提交消息。该消息是2阶段的提交消息。

4、存储主机接收到客户端的提交消息,如果是确认修改,则直接回应该提交OK消息;如果是取消修改,则将修改数据还原为修改前,然后回应取消修改OK的消息。

5、 客户端接收全部存储主机的回应,整个操作成功。

      在该过程中可能存在通信失败,例如网络中断、主机宕机等诸多的原因,对于未在算法中定义的其它异常,都认为是提交失败,都需要回滚,这是该算法基于确定的通信回复实现的,在参与者的确定回复(无论是回复失败还是回复成功)之上执行逻辑处理,符合确定性的条件当然能够获得确定性的结果哲学原理。

  • 分布式锁服务

 分布式锁是对数据被外界修改持保守态度,在整个数据处理过程中将数据处于锁定状态,在用户修改数据的同时,其它用户不允许修改。
      采用分布式锁服务实现数据一致性,是在操作目标之前先获取操作许可,然后再执行操作,如果其他用户同时尝试操作该目标将被阻止,直到前一个用户释放许可后,其他用户才能够操作目标。分析这个过程,如果只有一个用户操作目标,没有多个用户并发冲突,也申请了操作许可,造成了由于申请操作许可所带来的资源使用消耗,浪费网络通信和增加了延时。
      采用分布式锁实现多副本内容修改的一致性问题, 选择控制内容颗粒度实现申请锁服务。例如我们要保证一个文件的多个副本修改一致, 可以对整个文件修改设置一把锁,修改时申请锁,修改这个文件的多个副本,确保多个副本修改的一致,修改完成后释放锁;也可以对文件分段,或者是文件中的单个字节设置锁, 实现更细颗粒度的锁操作,减少冲突。

常用的锁实现算法有Lamport bakery algorithm (俗称面包店算法), 还有Paxos算法。下面对其原理做简单概述。

 

 

  • Lamport面包店算法

 

 

是解决多个线程并发访问一个共享的单用户资源的互斥问题的算法。 由Leslie Lamport英语Leslie Lamport)发明。    
    Lamport把这个并发控制算法可以非常直观地类比为顾客去面包店采购。面包店只能接待一位顾客的采购。已知有n位顾客要进入面包店采购,安排他们按照次序在前台登记一个签到号码。该签到号码逐次加1。根据签到号码的由小到大的顺序依次入店购货。完成购买的顾客在前台把其签到号码归0. 如果完成购买的顾客要再次进店购买,就必须重新排队。

     这个类比中的顾客就相当于线程,而入店购货就是进入临界区独占访问该共享资源。由于计算机实现的特点,存在两个线程获得相同的签到号码的情况,这是因为两个线程几乎同时申请排队的签到号码,读取已经发出去的签到号码情况,这两个线程读到的数据是完全一样的,然后各自在读到的数据上找到最大值,再加1作为自己的排队签到号码。为此,该算法规定如果两个线程的排队签到号码相等,则线程id号较小的具有优先权。

把该算法原理与分布式系统相结合,即可实现分步锁。

 

 

  • Paxos算法

 

 

 该算法比较热门,参见WIKI,http://zh.wikipedia.org/wiki/Paxos%E7%AE%97%E6%B3%95

Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致。一个通用的一致性算法可以应用在许多场景中,是分布式计算中的重要问题。节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。Paxos算法就是一种基于消息传递模型的一致性算法。BigTable使用一个分布式数据锁服务Chubby,而Chubby使用Paxos算法来保证备份的一致性。

  • 采用乐观锁原理实现的同步

      我们举个例子说明该算法的实现原理。如一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户帐户余额),如果采用前面的分布式锁服务机制,也就意味着整个操作过程中(从操作员读出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对几百上千个并发,这样的情况将导致怎样的后果。
      乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
      
 对于上面修改用户帐户信息的例子而言,假设数据库中帐户信息表中有一个 version 字段,当前值为 1 ;而当前帐户余额字段( balance )为 $100 。

  1. 操作员 A 此时将其读出(version=1 ),并从其帐户余额中扣除 $50($100-$50 )。
  2. 在操作员 A 操作的过程中,操作员B也读入此用户信息( version=1 ),并从其帐户余额中扣除 $20 ( $100-$20 )。
  3. 操作员 A 完成了修改工作,将数据版本号加一( version=2 ),连同帐户扣除后余额( balance=$50 ),提交至数据库更新,此时由于提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。
  4. 操作员 B 完成了操作,也将版本号加一( version=2 )试图向数据库提交数据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,不满足 “ 提交版本必须大于记录当前版本才能执行更新 “ 的乐观锁策略,因此,操作员 B 的提交被驳回。这样,就避免了操作员 B 用基于 version=1 的旧数据修改的结果覆盖操作员A 的操作结果的可能。

乐观锁机制与分布式系统相结合上, 我整理了伪代码如下:

obj  操作的目标
vlaue 修改的值
atom_update_ver 每个目标上的版本,每次修改该值递增
set( obj, value)
{
     //从每个节点上取出修改前的对象版本
    get original_ver = obj.atom_update_ver from each node;
     //将值赋到每个节点的obj目标
    set obj = value from each node;
     //条件修改每个节点的obj版本,目标版本加一
     //比较和修改操作是原子操作
    result = (set obj.atom_update_ver = original_ver + 1
                  where  original_ver + 1 >  obj.atom_update_ver
                   for each node);
    if(result == ok)
        return set_ok;
    else
        return set(obj, value);//不成功递归修改

该算法未考虑节点下线、失效等问题,在后续我将分析采用乐观锁原理实现一致性算法,解决问题2、节点失效、通信失败等问题。

分享到:
评论

相关推荐

    分布式一致性系统算法

    #### 二、分布式系统一致性问题 在分布式系统中,由于数据分布在不同的节点上,这些节点之间可能存在网络延迟或故障等问题,导致数据一致性成为一大难题。具体包括: - **单一业务操作涉及多个数据副本**:例如,...

    分布式一致性算法Yac.pdf

    在分布式系统中,一致性算法是实现节点间数据同步的基础。传统的分布式一致性算法如Zookeeper采用的是静态拓扑主从模型,这种模型存在严重的负载不均问题以及单点性能瓶颈,特别是当超过一半的节点出现故障时,算法...

    改进概率量化分布式一致性算法.pdf

    为了提高分布式一致性算法在量化通信下的收敛精度,研究人员提出了概率量化分布式一致性算法。 概率量化分布式一致性算法是一种通过概率方法处理量化问题的算法,它允许节点根据自身状态和邻接节点的概率量化信息...

    分布式一致性原理与实践.pdf(完整书签)

    ZooKeeper是一个开源的分布式协调服务,它基于Paxos等一致性算法实现了一套高可用的分布式数据管理和服务框架。ZooKeeper提供了命名服务、配置管理、组服务、分布式锁和领导者选举等基础功能。 **ZooKeeper的主要...

    多智能体系统分布式一致性算法研究现状.pdf

    分布式一致性算法是多智能体系统中用来确保所有智能体间信息一致的关键技术。一致性问题是指在一个网络中,各个智能体通过某些协调控制率或一致性协议来确保某些量(比如位置、速度、状态等)达成一致的值。分布式...

    分布式一致性算法的研究及应用.pdf

    Paxos算法是一种解决分布式系统一致性问题的有效算法,由微软的Leslie Lamport于1989年提出。Paxos算法主要基于消息传递机制,用于在分布式系统中就某个决议达成一致,例如数据的复制、命名服务、配置管理、权限设置...

    分布式一致性算法Yac

    总之,Yac是一种适应现代分布式系统需求的一致性算法,它提供了可靠、高效的解决方案,对于处理大规模、高并发的Java应用来说尤其有价值。通过深入学习和实践,开发者可以充分利用Yac来提升系统的稳定性和可扩展性。

    基于改进分布式一致性算法的电池储能阵列分组控制策略.pdf

    首先,分布式一致性算法是指在分布式系统中实现一致性状态的算法,该算法可以应用于电池储能阵列系统,以实现电池单元之间的协调控制。分布式一致性算法的优点是可以实时监控电池单元的状态,实现实时优化控制。 在...

    matlab 一致性算法

    总之,“matlab 一致性算法”是一个涉及多智能体系统协调的重要主题,对于学习和研究分布式控制、协同计算等领域有着广泛的应用价值。通过MATLAB进行实践,可以直观地理解和掌握一致性算法的原理和实现。

    一致性哈希算法在分布式系统中的应用.pdf

    一致性哈希算法是一种在分布式系统中用于解决数据分发和负载均衡问题的算法。随着互联网技术的快速发展,分布式系统已经成为支撑大规模服务的关键技术之一。在分布式系统中,多个节点通过网络协同工作,提供高可用性...

    带有可信个体的分布式量化一致性算法.pdf

    分布式量化一致性算法关注的是网络化系统在面对攻击性个体时,如何量化系统的状态,并保持所有节点之间的状态一致性。这种算法通常需要在网络拓扑结构发生变化时依然有效,这就需要算法具备一定的自适应能力。 可信...

    MATLAB代码《基于多智能体系统一致性算法的电力系统分布式经济调度》 软件环境:MATLAB 内容:集中式优化方法难以应对未来

    MATLAB代码《基于多智能体系统一致性算法的电力系统分布式经济调度》 软件环境:MATLAB 内容:集中式优化方法难以应对未来电网柔性负荷广泛渗透以及电力元件“即插即用”的技术要求。 区别于集中式经济调度,提出一种...

    分布式系统一致性问题解决方案

    总而言之,分布式系统一致性问题的解决方案多种多样,选择哪一种方案需要综合考虑系统的规模、业务需求、性能要求等因素。在不同的业务场景下,合理地应用ACID原则和BASE理论,以及分布式一致性协议和最终一致性模式...

    离散高阶分布式一致性算法.pdf

    离散高阶分布式一致性算法是分布式系统领域的一个重要研究课题,特别是在多智能体系统中,该算法的应用对于实现系统的一致性具有至关重要的作用。分布式一致性问题涉及到多智能体系统中的各个节点如何在没有中心控制...

    面向分布式融合估计的快速一致性算法.pdf

    快速一致性算法可以有效提高分布式系统中多传感器网络信息融合估计的收敛速度,尤其是当传感器网络的连通度较低时,这种算法的优越性更为显著。在实际应用中,分布式融合估计和快速一致性算法的研究对于提升分布式...

    分布式数据库一致性保证算法.pptx

    #### 一、分布式系统一致性概念与CAP定理 **分布式系统一致性**是指在一个分布式环境中,系统中的各个组件能够共同维护数据的一致性。这通常意味着,无论用户从哪个节点读取数据,都应该获得相同的结果。 **CAP...

    基于多智能体系统一致性算法的电力系统分布式经济调度策略

    应用多智能体系统中的一致性算法,以发电机组的增量成本和柔性负荷的增量效益作为一致性变量,设计一种用于电力系统经济调度的算法,通过分布式优化的方式求解经济调度问题。算例仿真与分析验证了所提调度策略的有效...

Global site tag (gtag.js) - Google Analytics