雪花新闻

区块基础-容错问题

分布式容错

区块链,有一种理解为分布式统一账本,那么分布式的架构肯定会存在一个容错的问题。这里简单概述下容错相关内容。

分布式容错约定概念:

上述大致说明了一些分布式容错的约定概念。接下来简单介绍下一些协议。

理想化的两阶段协议

  1. step-1

  2. 客户端发起请求至所有分布式的服务器

  3. step-2

  4. if

  5. 发起请求的客户端获得了所有的服务器的锁

  6. then

  7. 客户端一次发送消息,结束后解锁

  8. else

  9. 客户端未获得所有服务器的锁

  10. 重新进入step-1

  11. end

这是一个理想化的模式。类似数据库系统,第一阶段就是事务的准备阶段,第二年阶段就是提交或者回滚。

问题

那么通过两阶段,出现节点故障的状态,那么请求无法完全,理想化的两阶段协议必须要求节点都正常,如果只是一部分服务器处于锁的状态,将无法正常完成整个过程。且客户端将无法判断服务器节点锁的状态,导致系统出现故障,问题:如何有效解决这种这种模式?

PAXOS

在票上加一个序列号,服务节点在收到票的时候记录票的序号,保证票不重复和本地记录的一致。通过超过半数的票来作为容错机制。

票协议:

  1. step-1

  2. 客户端向所有节点发送带序号的票

  3. step-2

  4. if

  5. 客户端收到半数服务节点收到票的回复

  6. then

  7. 客户端再次发起票,且加上命令消息一起发送给所有服务器

  8. 服务器节点收到消息,判断票有效性后,存储命令消息

  9. 服务器返回客户端信息

  10. else

  11. 客户端等待,返回step-1

  12. endif

  13. step-3

  14. if

  15. 客户端收到半数服务器的返回客户端消息

  16. 客户端通知所有服务器执行之前的命令

  17. else

  18. 客户端等待,返回step-1

  19. endif

这种票协议还是会出现服务节点存储本地票号,但是客户端在发起请求的时候票号会不一致,且命令存储会出现不一致。故再对这种模式进行改进。

PAXOS大致流程

引入本地记录票号的计数、半数确认容错。

服务端 客户端
初始化 初始化
票号t=0、命令c 票号Tmax=0、命令C、存储命令的票Tc
step-1 step-1
发起请求、t=t+1,请求票号为t
服务节点判断:t>Tmax、那么Tmax=t,回复确认(Tc、C)
step-2 step-2
客户端如果收到半数服务节点回复确认、选择(Tc、C)验证Tc>0、那么c=C、发送消息p(t、c )
服务节点收到p、判断t=Tmax、那么C=c、Tc=t、回复成功
step-3 step-3
接收到半数以上服务节点回复成功,向每个服务节点发送执行c操作

说明:

PAXOS中有三阶段,三角色(提案者、接收者、学习者)

上述流程中一个p(t、c)称为一个提案,那么提案根据算法存储在半数以上的服务器,那么后续再出现新的p(t、c)则因为t的顺序判断,故会顺序执行。可以通过反证法,同时出现两个p(t、c)出现在服务节点,且都超过半数,那么两个p提案在服务器之间肯定会有一个不为空的交集。根据两个p中t的顺序号,那么肯定有一个p提案被存储在服务器节点中,成为有效提案。在step-2中t为判断为与最高票编号比较,于是执行之前已经存储的p提案中的c命令。

场景分析:

Leslie Lamport在1989年提出PAXOS有兴趣可以看看论文原文。

相关文章