0
点赞
收藏
分享

微信扫一扫

分布式系统原理Day03-基于副本协议



基于副本协议


  • ​​基本概念​​
  • ​​中心化副本控制协议​​

  • ​​primary-secondary协议​​

  • ​​数据更新流程​​
  • ​​数据读取方式​​
  • ​​primary副本的确定与切换​​
  • ​​数据同步​​


  • ​​去中心化副本控制协议​​


基本概念


  • 副本控制协议:

  • 按特定的协议流程控制副本数据的读写行为
  • 使得副本满足一定的可用性和一致性要求的分布式协议

  • 副本控制协议要具有一定的对抗异常状态的容错能力,从而使得系统具有一定的可用性,同时副本控制协议要能提供一定的一致性级别
  • 根据CAP原理,要设计一种满足强一致性,且出现在任何网络异常时都可用的副本协议是不可能的.因此,实际中的副本协议总是在可用性,一致性与性能等各要素之间按照具体的需求折中
  • 副本控制协议可以分为两大类:

  • 中心化副本控制协议
  • 去中心化副本控制协议


中心化副本控制协议


  • 中心化副本控制协议的基本思路:
  • 有一个中心节点协调副本数据的更新,维护副本之间的一致性
  • 中心化副本控制协议的优点:

  • 协议相对较为简单,所有的副本相关的控制交由中心节点完成
  • 并发控制将由中心节点完成,从而使得一个分布式并发控制问题,简化为一个单机并发控制问题

  • 并发控制:​ 多个节点同时需要修改副本数据时,需要解决“写写”,“读写”等并发冲突.单机系统上常用加锁等方式进行并发控制
  • 分布式并发控制:​ 通常也是使用加锁实现分布式并发控制,但是如果没有中心节点统一进行锁管理,就需要完全分布式化的锁系统,会使得协议非常复杂


  • 中心化副本控制协议的缺点:

  • 系统的可用心依赖于中心化节点
  • 当中心节点异常或者与中心节点通信中断时,系统将失去某些服务,通常至少会失去更新服务
  • 所以中心化副本控制协议会存在一定的停服务时间


primary-secondary协议


  • primary-secondary类型的协议:

  • 副本被分为两大类
  • 有且仅有一个副本作为​primary​副本,除​primary​以外的副本都作为​secondary​副本
  • 维护​primary​副本的节点作为中心节点.中心节点负责维护数据的更新,并发控制,协调副本的一致性

  • primary-secondary类型的协议要解决四大类问题:

  • 数据更新流程
  • 数据读取方式
  • primary​副本的确定和切换
  • 数据同步​reconcile


数据更新流程

  • 数据更新都由​primary​节点协调完成
  • 外部节点将更新操作发给​primary​节点
  • primary​节点进行并发控制,也就是确定并发更新操作的先后顺序
  • primary​节点将更新操作发送给​secondary​节点
  • primary​根据​secondary​节点的完成情况决定更新是否成功并将结果返回给外部节点
    分布式系统原理Day03-基于副本协议_分布式

分布式系统原理Day03-基于副本协议_并发控制_02

  • 为了解决这个问题,使用接力的方式同步数据:​ primary将更新发送给第一个​secondary​副本,第一个​secondary​副本发送给第二个​secondary​副本,依次类推

数据读取方式

  • 数据读取方式与一致性高度相关:

  • 如果只需要最终一致性,则读取任何副本都可以满足要求
  • 如果需要会话一致性,则可以为副本设置版本号,每次更新递增版本号,用户读取副本时验证版本号,从而保证用户读到的数据在会话范围内单调递增

  • 使用​primary-secondary​实现强一致性比较困难:

  • 由于数据的更新流程都是由​primary​控制的 ​,primary​副本上的数据一定是最新的,所以如果始终只读​primary​副本的数据,可以实现强一致性
  • 如果只读​primary​副本,则​secondary​副本将不提供读服务
  • 工程实践中,如果副本不与机器绑定,而是按照数据段为单位维护副本,仅有​primary​副本提供读服务在很多场景下并不会造成机器资源浪费

  • 将副本分散到集群中,假设​primary​也是随机确定的,那么每台机器上都有一些数据的​primary​副本,也有另一些数据段的​secondary​副本,从而某台服务器实际都提供读写服务:

  • 由​primary​节点控制​secondary​节点的可用性
  • 当​primary​更新某个​secondary​副本不成功时 ​,primary​将该​secondary​副本标记为不可用,从而用户不再读取该不可用副本
  • 不可用的​secondary​副本可以继续尝试与​primary​同步数据,当与​primary​完成数据同步后 ​,primary​可以将副本标记为可用

  • 这种方式使得所有的可用的副本,无论是​primary​还是​secondary​都是可读的
  • 并且在一个确定的时间内,某​secondary​副本要么更新到与​primary​一致的最新状态,要么被标记为不可用,从而符合较高的一致性要求
  • 这种方式依赖于一个中心元数据管理系统,用于记录哪些副本可用,哪些副本不可用.通过降低系统的可用性来提高系统的一致性



primary副本的确定与切换

  • primary-secondary​类型的协议中的另一个核心问题就是如何确定副本
  • 在原​primary​副本所在机器出现宕机等异常时,需要有某种机制切换​primary​副本,使得某个​secondary​副本成为新的​primary​副本
  • 在​primary-secondary​类型的分布式系统中,哪个副本是​primary​这样的信息属于元信息,由专门的元数据服务器维护
  • 执行更新操作时,首先查询元数据服务器获取副本的​primary​信息,从而进一步执行更新流程
  • primary-backup类副本协议的最大缺点就是由于primary切换带来的一定的停服时间:

  • 分布式系统中可靠的发现节点异常是需要一定的探测时间的
  • 这样的探测时间通常是​10​秒级别.意味着一旦​primary​异常,最多需要​10​秒级别的发现时间,系统才能开始​primary​切换
  • 在​10​秒的时间内,由于没有​primary,​ 系统不能提供更新服务.如果系统只能读​primary​副本,则这段时间内不能提供读服务


数据同步

  • 不一致的​secondary​副本需要与​primary​进行同步​reconcile
  • secondary​不一致的形式有三种:

  • 由于网络分化等异常 ​,secondary​上的数据落后于​primary​上的数据
  • 在某些协议下 ​,secondary​上的数据可能是​脏数据,​ 需要被丢弃
  • 脏数据:​ 由于​primary​没有进行更新操作,而​secondary​副本上反而进行多余的修改操作,从而造成​secondary​副本数据错误
  • secondary​是一个新增加的副本,完全没有数据,需要从其余副本上拷贝数据

  • secondary数据落后:
  • 回放​primary​上的操作日志,通常是​redo​日志,从而追上​primary​的更新进度
  • secondary脏数据:

  • 较好的做法是设计的分布式协议不产生脏数据
  • 如果协议一定有产生脏数据的的可能,则应该使得产生脏数据的概率降到非常低的情况,从而一旦发生脏数据的情况可以直接丢弃脏数据的副本,这样也相当于副本没有脏数据
  • 也可以设计基于​undo​日志的方式从而可以删除脏数据

  • secondary副本完全没有数据:

  • 直接拷贝​primary​副本的数据,这种方法比回放日志追更新进度的方法要快得多
  • 拷贝数据时​primary​副本需要能够继续提供更新服务,这就要求​primary​副本支持快照​snapshot​功能:
  • 对某一刻的副本数据形成快照,然后拷贝快照,拷贝完成后使用回放日志的方式追快照形成后的更新操作


去中心化副本控制协议


  • 去中心化副本控制协议没有中心节点,协议中所有的节点都是完全对等的,节点之间通过平等协商达到一致.因而去中心化协议没有因为中心化节点异常而带来的停服务问题
  • 去中心化协议的最大的缺点:


    • 协议过程通常比较复杂
    • 当去中心化协议需要实现强一致性时,协议流程变得复杂且不容易理解


  • 由于流程的复杂,去中心化协议的效率或者性能一般较中心化协议低
    分布式系统原理Day03-基于副本协议_并发控制_03


举报

相关推荐

0 条评论