zoukankan      html  css  js  c++  java
  • 分布式系统阅读笔记(十八)-----副本备份技术

    介绍

    在分布式系统中,副本和备份是一个用来提供高可用性和一定的容错能力的手段和措施。HA(高可用性)在当前越来越成为一个趋势在一些移动计算的领域和一些失去连接的状态场景之下。在这篇笔记中,我会介绍一些副本备份的相关技术点,比如基于隶属度管理的组通信,还有被动和主动备份技术,以及最后的副本分区的一些情况。

    1、副本在分布式系统中被用的非常的广泛,比如说被用于资源的缓存的访问,放置在代理服务器上或者说存在于客户端的本地机子上,对于源资源的一个拷贝。

    2、副本的技术的出现加强了服务的性能,首先可以避免了请求服务的延迟,当远程访问源服务器资源的时候,第2点,提高了高可用性,当服务器宕机的时候,至少还有他的副本资源的存在,以至于在客户端失去连接的时候还能正常使用,这其实也是容错能力的一个表现。这里用一个数字来体现这一点,如果说服务器有2个副本,每个服务器宕机的概率为5%,只有当2个服务器都不可用的时候才会造成系统真正的不可用,概率p=1-0.05*0.05=0.9975,也就是说是99.75%,这已经是很一个高度可用的比例值了。

    3、但是这里就会有一个比较重要的问题,已经有这么多的副本备份了,如何维护他们的一致性问题,数据不一致了,后果可很严重哦,比如说一些资金,银行等方面的,显然是不容有失的。

    系统模型和组通信

    各个副本其实是一个物理对象,存放在各个单一的机子上的。这里提供了一种组通信的机制用来协调他们之间的一致性。

    系统模型

    为了使得问题变得一般化,我们构造了一个基本的结构模型用来管理副本数据。在这个结构中,我们用到了一个主要的角色RM(Replication Manager)副本管理器,在这里,你可以把副本管理器就理解为一个Server服务端。所以这个结构就变成了常见的C-S的模型了。在这里每个副本管理器包含了每个对象的一个副本。

    1、当客户端发出一个请求操作的时候,他并不是直接马上的发给RM,而是先到一个专门处理请求的组件,叫做front end,front end的作用才是通过消息传递与RM副本管理器通信的一个角色。

    2、然后执行后面的5个阶段的过程:(1)、Requesting请求。(2)、Coordination协调。(3)、Execution执行阶段。(4)、Agreement一致性阶段。(5)、Response回复阶段。

    3、在之前的章节中,我们提到过组通信中用到的covering algorithm覆盖算法,当在副本技术中,这里要求一个更高要求的动态隶属度方法,意味着在进程进入或者离开系统的时候,组的隶属度会发生改变。因此就衍生出了一个额外的服务叫做membership service服务。

    容错服务

    容错服务与上面提到的高可用的区别在于对于数据的正确性上的处理上,也就是说,当服务器挂了的时候,此时如果你的副本数据已经正确更新了,当然没问题,但是如果此时的你的副本上的数据还是旧的话,显然还达不到系统的要求,所以这里说的容错服务是对于数据一致性的要求。

    1、在数据一致性的分类中,这里分为了2类:Linearizability consistency和sequential consistency。

    Passive replication

    Passive replication的意思是被动副本的意思,一句话说,就是当最初的RM副本管理器挂掉的时候,在这些备份的副本中会选出一个作为新的主要的备份管理器,将会重新恢复刚刚操作失败时的状态。被动副本技术的缺点在于比较高的沟通成本,在这里的过程会发生数次的来回的消息通信,无疑也会造成一定的延迟。而且当主副本上更新了数据的时候,必须one-to-one的方式更新备份副本上的数据,效率还是比较低下的。

    Active replication

    与上面的方式相对的是Active replication,积极的备份技术,如果在此模式下,如果服务器的RM挂了,将不会对系统的性能有任何的影响,剩下的副本管理器还是会继续的响应回复。所以积极的副本技术的原理就是他会向所有的副本管理器发出请求,然后请求会在所有的RM上跑一遍,然后客户端获取到所有的回复,最后第一个回复的结果将会被采纳。所以在积极副本技术中,其中的全局有序性就显得比较重要了。

    HA服务例子:gossip结构,Bayou,Coda

    在下面,将会列举出几个应用了副本技术使得服务变得高可用性的例子。

    Gossip结构

    1、gossip结构实现高可用的措施是通过副本管理器之间进行周期性的交换gossip message,为了是副本之间能及时获取到来自客户端的更新操作以此保持一致性。gossip服务提供2种类型的操作,query操作和update更新操作。

    2、为了保持进程操作的有序性,每个请求采用了类似于一个vector timestamp时间戳向量的概念。当每次操作结束,就会更新新的时间戳向量的新的值。

    3、每个gossip信息包含了2个项,一个是副本管理器RM的log,和副本的timestamp,日志是用来合并用的。

    4、gossip结构并没有规定什么时候或者说在哪里进行副本管理器之间的信息交换,这里推荐了一种update-propagation更新传播的策略。

    Bayou

    Bayou系统是一个提供数据副本的高可用性但是在一致性的方面略微差一点的系统。他的副本形式是以数据库的形式保存的,因此可以支持增删改查的操作。Bayou的更新操作会被标记为暂存的临时的版本直到下一次的更新操作来到的时候,上次的更新操作才会被应用。更新的冲突需要一个独立的检验过程和合并过程。

    Coda

    Coda是一个文件系统,他的出现是为了弥补AFS文件系统的不足之处。Coda的一个为了提高可用性的核心措施是利用了数据的本地副本实现了HA特性。Coda的副本策略是乐观的,为什么这么说呢,他允许在网络分区的情况下,或者失去连接的条件下,对于副本数据进行修改的处理。然后依靠每个副本文件的Coda version vector(CVV)来提供足够的信息表明了文件的更新历史,以便最后做冲突的检测。

    事务和副本数据

    我们已经知道客户端请求单一操作在一系列的对象副本中。一个事务用在有副本对象的场景与无副本对象的场景的表现应该是要一样的。这个属性叫做one-copy serializability。还好,每个RM提供了一定的并发控制能力和恢复对象的能力。one-copy Serializability的实现依靠的是read-one和write-all的机理实现。怎么说呢?read-one指的是读操作只会在你一个单一的副本管理器RM上执行,毕竟只是读操作而已,而write-all则要在每个RM上应用到,所以他的体系结构要求,当到来一个写请求时,所有的RM都要执行一遍,至于请求怎么传达到各个副本管理器,不需要客户端一个个请求到每个RM里,RM之间可以自己交流,传播消息。

    副本管理器的拷贝

    副本管理器的拷贝复制是为了防止,RM意外发生宕机或者说通信失败,要求拷贝一个与他一样数据的RM,一遍能够选择另外的方式进行操作。

    网络分区

    网络的分区会导致副本管理器的group会本分成2个或者2个以上的子组,而子组之间由于分区的原因是无法通信的,所以这往往造成数据的不一致性。解决这个问题的办法叫available copies algorithm可用拷贝算法,应用在每个分区中,当分区已经被修复的时候,再进行冲突的验证。冲突的验证可以用Version vector版本向量标记写操作。在网络分区中,还有一个重要的概念叫virtual partition algorithm虚拟分区算法。


    参考文献:<<Distributed Sysytems Concepts And Design>>原版第五版,author:George Coulouris,Jean Dollimore, Tim Kindberg,Gordon Blair

  • 相关阅读:
    跨域问题----CORS
    java设计模式--简单工厂模式
    vue+java后台通信报403,cors解决跨域问题(该贴说的不是很清楚,不过大概如此,可再去网上查相关内容)
    CMake实践(2)
    CMake实践(1)
    Centos6.5下编译安装ACE6.0
    回调函数的应用误区4(c/s OK版本回调小程序)
    回调函数的应用误区3(大彻大悟的回调小程序,例子的解释相当给力)
    回调函数的应用误区2(与原理相悖的回调函数)
    回调函数的应用误区1(原汁原味的函数指针应用)
  • 原文地址:https://www.cnblogs.com/bianqi/p/12184037.html
Copyright © 2011-2022 走看看