拜占庭容错机制

看redis文档的时候注意到这样一句:

Leases: an efficient fault-tolerant mechanism for distributed file cache consistency.

Leases are proposed as a time-based mechanism that provides efficient consistent access to cached data in distributed systems. Non-Byzantine failures affect performance, not correctness, with their effect minimized by short leases. An analytic model and an evaluation for file access in the V system show that leases of short duration provide good performance. The impact of leases on performance grows more significant in systems of larger scale and higher processor performance.

拜占庭将军问题

对,我的第一注意点不是Leases而是Byzantine~

拜占庭将军问题是一个有关协议(agreement)的问题,最初是由 Marshall Pease等人在1980年提出来的点对点通信中的基本问题。含义是在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。因此对一致性的研究一般假设信道是可靠的,或不存在本问题。这个难题也被称为“拜占庭容错”、“拜占庭将军问题”、或者“两军问题”。

这个问题是说,一个拜占庭的陆军部队正在准备攻击一个防御强大的城市。每一队陆军部队都是由一位将军来带领的,这位将军驻扎在敌军所在城市的周边。仅仅可以依靠信使来进行信息的交流,将军必须要同意一个常规的进攻计划。然而,一个或者多个将军有可能已经背叛了军队,可能对其他将军去混淆视听。那么问题就是找到一种算法来确保忠诚的将军能够达成一致。如果仅仅使用口头传递消息的话,只有在多于三分之二的将军还是忠诚的条件下才可以解决这个问题,所以一个叛徒可以混淆两个忠诚的将军。如果使用不可伪造的手写消息的话,任意数量的将军和可能的叛徒都可以解决这个问题。在当今的可信赖的电脑系统中,是可以找到能够解决这个拜占庭将军问题的解决方案的。

拜占庭容错(Byzantine Fault Tolerance, BFT)可以通过让忠诚的(非叛徒)将军能够对他们制定的策略达成一致协议的方式来实现。拜占庭容错的目标是能够防御拜占庭错误。

在redis哨兵部署中,sentinel是采用paxos拜占庭协议。

paxos算法

paxos算法认为,在信道不可信的前提下,通过消息传递的方式达成一致性,是不可能的。因此,paxos算法的前提是不存在拜占庭将军问题。也就是,认为信道是可信的,集群间传递的消息,不会被篡改。分布式系统中,各个节点消息的传递方式有两种,共享内存和消息传递。paxos是基于消息传递通信模型。

在paxos算法中有三种角色,每种角色有不同的功能,一个进程也可以充当多个角色:

  • Proposer:提案者
  • Accecptor:决策者
  • Learner:学习者,同步者

paxos算法的一致性

paxos算法的一致性,通过以下几点去保证:

  • 每个提案者在提案的时候,首先需要获取一个全局唯一,递增的编号N,将N赋给提案。N的生成方式有两种,全局性生成器、提案者自身维护。
  • 每个表决者在接收到提案之后,会把提案编号保存在本地。这样每个表决者都有一个最大编号,假设是maxN。而每个表决者只会accept编号大于自己本地maxN的提案。
  • 最终只有一个提案被选定,一旦一个提案被选定,那么learner会同步该提案到本地。当然,没有提案选出就不会有提案被选定。

(未完成)

你可能感兴趣的:(redis,分布式)