【大规模分布式存储系统系列篇——分布式协议】

分布式系统的协议有:租约、复制协议,一致性协议(相对有名的有Paxos协议和两阶段提交协议)。

1.租约协议

分布式系统的集群规模越大,发生故障的概率也会不断增大,那么设计分布式系统就必须考虑到“容错性”。当然,首先分布式系统需能够检测到机器故障,而这往往是通过租约(lease)协议实现的。

    何为租约协议?假设有A和B两台机器,A需要检测B是否发生故障,那么A可以给B发送租约,B在租约期内才被允许提供服务,就像你学校的小卖部,需要跟学校缴纳租金,才可以向学生售卖东西(提供服务),那么租约快到期怎么办?对的,续租!B向A重新申请租约,继续提供服务。如此反复。当B出现故障时,那么B的租约必定会过期,那么机器A就可以确保B不再提供服务,机器B的服务就可以被安全迁移到其他服务器。

    注意:实现租约协议需要考虑一个提前量。我们假设小卖部30日租约到期,那比如29号小卖部老板出去旅游,要到31号才能交租约,那么在30号就将它的服务迁移是不合理的。同理,如果B租约为10s,那么A要加上一个提前量,比如11s,才可以认为机器B的租约过期。小卖部老板可能出去旅游或者其他原因,而B与A之间有时钟不一致的原因,所以有个前提假设,AB两台机器的本地时钟差不大,这个数值比如是0.5s。

2.复制协议

前面基础篇有提到,分布式存储系统需要高可靠高可用,正因此,我们在存储数据的时候,往往会存储多个副本。当某个副本出现故障时,系统自动将服务切换到其他的副本,从而实现自动容错。

复制协议有两种——强同步复制与异步复制

这两者的区别在于返回成功的时机。假如用户发送了一个写请求,当主副本(primary)操作成功后,它需要同步到其他备副本(backup),保证主备副本之间的一致性,才可以返回成功,这就是强同步。而异步则是主副本操作成功后就可以返回,然后再将写请求同步到备副本。这种方式与操作系统中对内存的读写操作是否实时写到磁盘有点神似。

很明显,强同步复制保证了主备副本的一致性,但是当备副本出现故障时,也可能阻塞存储系统的正常写服务,也就是降低了可用性。相反,异步复制提高了可用性,但也降低了一致性(如果主副本出现故障,那将可能丢失数据)这就是架构设计的tradeoff。

3.一致性协议

3.1 两阶段提交协议

两阶段提交协议一般包括两类节点:一类是协调者(coordinator),一类是参与者(participants),一般包含多个。

两个阶段:

3.1.1 请求阶段

 协调者通知事务参与者准备提交或者取消事务。然后进入表决过程。表决过程参与者告知协调者自己的意见:同意(事务参与者本地执行成功),取消(事务参与者本地执行失败)

3.1.2提交阶段

协调者基于第一个阶段的投票结果进行决策:提交或者取消。当所有参与者都同意时,通知所有参与者提交事务,否则通知所有参与者取消事务。

那么当参与者或者协调者出现故障怎办?

参与者发生故障,无法向协调者提交自己的意见,那么很简单的只需要给该事务设定一个超时时间,如果某个事务参与者不响应,到达超时时间整个事务失败。就像你组织一次活动,询问某位参与者是否参加并设定回复截止时间,在规定时间得不到回复就当他不去参加活动。

那么当协调者出现故障怎么办?

协调者将事务相关信息记录到操作日志并同步到备份协调者(如果有的话)由备份协调者完成后续工作,如果有多个协调者,还将涉及如何选择协调者这是后面paxos协议要解决的问题。如果没有协调者,那么事务参与者将无法完成事务而一直等待下去。

两阶段提交协议因此是阻塞协议,执行过程需要锁住其他更新,且不能容错。

3.2 paxos协议

在这篇博客中:https://www.cnblogs.com/endsock/p/3480093.html,提供了源码链接以及作者相关解释,写得通俗易懂,大家可以转至该博客,我就不浪费笔墨。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值