区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者汇集地算法
做者:吴寿鹤数据库
来源:区块链兄弟编程
原文连接:http://www.blockchainbrother.com/article/6缓存
著权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。服务器
分布式系统介绍网络
长期以来学习掌握分布式系统的知识很是庞杂混乱,要肯定分布式系统算法的分类,主要依据是搞清楚算法的各类属性。例如计时模型timing model; 进程间通信interprocess communication 和失败模型failure model等等。app
涉及的主要概念包括:异步
1. 定时模型(Timing Model)分布式
2. 进程间通讯(Interprocess Communication)ide
3. 失效模式(Failure Modes)
4. 失效检测器(Failure Detectors)
5. 领导人选举(Leader Election)
6. 共识(Consensus)
7. 法定人数(Quorums)
8. 分布式系统中的时间
计时模型timing model
计时模型分同步,异步两种,这几种模型都有时间计时这个共同特色。
同步模型 在同步分布式系统中消息传递时间的上限是已知的。
异步模型 异步分布式系统中消息可能在任什么时候间送达。
在同步分布式系统中,因为消息传递时间的上限已知,则能够根据超时来检测进程故障(非拜占庭故障),大大简化了分布式算法的设计,但遗憾的是,大部分实际的分布式系统每每是异步的,好比互联网就是异步分布式系统,若是为异步分布式系统中设计分布式算法,必须意识到消息可能延迟任意长的时间到达。
进程间通信
进程之间是如何通信的,这里有消息传递模型和共享内存模型,前者是经过消息发送通信,后者是访问内存中共享变量共享数据进行通信。这里进程有服务器节点的意思,一个进程可能表明分布式场景的一台服务器。
消息传递最难的是不能发送重复消息,每次只能精确一次传递,这里有不少设计,好比Perfect Links(能够理解为进程之间的信道) 抽象能够保证,可是它不能正常反映现实世界,虽然不真实,可是有用,咱们可使用Perfect Links 证实一个问题不可能被解决,而后咱们就知道其余相关问题也没有答案。消息传递老是能够被想象为FIFO之类队列或堆栈。
共享内存是咱们编程经常使用的方式,须要在一台服务器内才能完成。咱们可使用消息传递算法完成分布式状况下的内存共享对象,好比读写注册器,调用一个服务之间须要查询这个服务在哪一个服务器上,负载平衡器也是一个读写注册器,是一个全局共享的内存。
在理解基于消息传递模型的算法时,还必须弄清楚进程之间是哪种连接(能够理解为进程之间的信道)。不一样种类的连接抽象为算法提供的保证也不相同。例如,完美连接可以保证消息的可靠送达,不会重复发送消息;它保证消息会且只会一次送达。显然,现实世界并不是如此。当算法设计者在设计尽可能接近真实的模型时,他们会使用其余类型的连接抽象。请牢记,即便完美连接并不是那么真实,它仍然有用。例如,若是咱们能证实,即便连接是完美的咱们也没法解决某个问题,那么全部的相关问题也将是不可解的。在讨论连接时,研究者一般会假定消息顺序是“先入先出”的, Zab 就是一个例子。
失败模型
进程的失败模型是分布式系统模型的一个属性,它是对进程失效种类的假设。
分布式模型老是必须考虑进程失败的状况,在crash-stop失败模型中,一个进程假设为一直是正确,直至它崩溃,一旦它崩溃,就永远不会恢复;也有crash-recovery 模型,进程可以在失败之后恢复,在这种状况下,一些算法来保证进程恢复到其失败以前的状态,这能够经过从持久层读取状态完成,或者经过和一个集群小组中的其余进程通信方式完成。注意这里有不一样集群组算法,一个进程崩溃后,恢复其状态的进程不会再被认为是以前一样的进程,这取决于动态组仍是固定组这两种算法。
失败模型也包括:一个进程若是没法接受和发送消息,被称为遗漏omission failure mode,遗漏模型也有不一样种类,一个进程没法接受和发送消息很重要吗?想象一组进程实现一个分布式缓存,若是一个进程没法回复同一组的其余进程,即便可以接受来自它们的请求,这也意味着这个进程可以接受外部消息更新本身的状态,其实也就意味着它能回复来自客户端的读请求,也就是说,虽然它本身不能主动回复客户端的请求,可是能够接受客户端的主动读取请求。
一个复杂失败模型是拜占庭Byzantine 或称为任意失败模型,进程会发送错误信息到对方,它们会模仿发送正确数据,可是实际已经篡改了本地数据库的内容。
设计分布式系统时,咱们须要对付这些失败模型。
失败探测
有了定时模型和进程失效模式的假设,咱们就能够构建报告系统状态的抽象——失败检测器,即检测某个进程是否已经崩溃,或者怀疑这个进程已经崩溃。完美失效检测器从不虚报进程失效。
咱们但愿在进程崩溃失败时及时发现,好比crash-stop失败模型加上同步系统,咱们可以使用timeout;若是咱们按期让进程ping到一个专门的失败探测器,咱们就能精确知道那个进程是否正常,若是过了timeout时间没有Ping访问,那么咱们就能够认为那台进程服务器崩溃了。
更真实状况是,假设一个消息到达目标须要肯定的时间,肯定好一个进程执行一个步骤须要多长时间,那么就可使用timeout进行衡量计算。
失败模型探测有两个属性策略:
1. Strong Completeness强完整性:每一个失败的进程会永久被其余正确进程怀疑。
2. Eventual Strong Accuracy最终强精确度,没有一个进程被任何正确的进程怀疑。
失败检测器是异步模型中解决共识问题的关键。在 FLP 论文中,提出了不少著名的不可能性结果。这篇论文指出,在异步的分布式系统中,若是进程有可能失效,那么就不可能达成共识。要达成共识,就必须为系统引入一个可以规避上述问题的失效检测器。
当一个进程被其余进程怀疑时,这些进程就不可能达成共识consensus ,而在分布式系统中使用异步模型是必需要达成共识,也就是每一个进程内部状态经过异步消息传递后,最终其余进程的状态会和最初发送消息的那个进程内部状态一致,这称为达成共识,可是由于有进程存在失败崩溃的可能,因此,在这个达成共识的消息传递过程当中,如何确保进程之间的信任,不怀疑对方,从而确保消息传递成功,那么引入失败探测器是能够规避这个问题的。
领导人选举LEADER ELECTION
与失败检测相反的一个问题是,如何断定一个进程没有崩溃,它所以可以正确地工做。网络中其余进程会信赖这个进程,把它看成可以协调分布式行动的领导人。像 Raft 或者 Zab 这样的协议就依赖领导人进程来协调行动。
这种机制会致使瓶颈集中在领导人那里,并且以前还须要领导人选举,这些多余过程多是咱们不须要的。
一致共识CONSENSUS
共识(consensus 或 agreement)问题是由 Pease , Shostak 和 Lamport 在论文“在存在失效的状况下达成一致”首先提出来的。他们是这么描述的:
“容错系统一般要求提供一种手段,使得独立的处理器或者进程可以达成某种精确的相互一致。例如,一个冗余系统的多个处理器可能须要按期同步它们的内部时钟。或者每一个处理从某个时变的输入传感器读取的数值都有稍微不一样,它们须要肯定一个统一的值。”
共识是在独立进程之间达成一致的统一意见,这些进程会就某个问题建议一个数值,基于这个推荐的值会赞成采起一致行动。
一个进程实现共识是经过暴露带有推荐和决定功能的API实现的,一个进程会推荐数值,由此开始共识,而后它得基于一个数值决定,这个数值是在整个系统中被推荐了的,这些算法包括:Termination, Validity, Integrity 和Agreement.
1. Termination: 每一个正确的进程最终会决定某个数值。
2. Validity: 若是一个进程决定了v,那么v会被其余进程推荐。
3. Integrity: 没有进程可以决定两次
4. Agreement: 没有两个正确进程有不一样的决定。
法定人数QUORUMS
Quorums 是一个设计失败容错分布式系统的工具,当系统存在crash-failure模型时,老是有一个法定人数表明大多数意见从而进行决策的,由于崩溃失败的老是少数。
好比有N个进程服务器,假设崩溃的进程是少数,好比N/2-1个进程崩溃,也就是49%的进程崩溃,咱们仍是有51%的会投同意票。Raft协议使用的是这种大多数策略,根据提交到系统的日志来判断,
分布式系统的时间
理解时间和其致使的因果是分布式系统的大问题,咱们一般用事件这个概念表明生活中发生的那些事实,使用happened before顺序约束定义这些事件,可是咱们有不少进程交换信息,共同访问共享资源等等,咱们如何告诉某个进程事件的happened before策略呢?也就是谁在前谁在后的顺序呢?为了回答这个问题,进程须要共享一个同步的时钟,精确知道它在网络间移动花费多长时间?包括CPU调度任务的时间等等,显然这在真实世界是不可能实现的。
Time, Clocks, and the Ordering of Events in a Distributed System这篇论文引入了逻辑时钟概念,逻辑时钟是一个分配一个数字给事件的方式,也就是说,这些数字不是和实际时间有关,可是和一个节点的进程事件有关。
有各类逻辑时钟,好比 Vector Clocks向量时钟或 Interval Tree Clocks.
理解分布式时间问题,必须理解一个重要概念:同时性这个想法有时咱们必须放弃(The idea of simultaneity is something we have to let go.),这是有关“绝对知识”等旧哲学信条的问题,他们认为绝对知识是能够到达的,其实人的认识是相对,永远不可能到达真正事物本质,你觉得的同时性并非真正同时性,光线也是有速度的,即便最快的光线也是须要时间才从一个地方到达另一个地方。可见Inventing the Enemy发明敌人 一书中的“绝对与相对”。
文章发布只为分享区块链技术内容,版权归原做者全部,观点仅表明做者本人,毫不表明区块链兄弟赞同其观点或证明其描述