IT教程 ·

分布式体系一致性问题与Raft算法(上)

Lambda表达式

近来在做MIT6.824的几个试验,至心以为每个做散布式相干开发的程序员都应当去刷一遍(裂墙引荐),肯定能够进步本身的手艺认知程度,同时也异常感谢MIT能够把这么好的资本分享出来。

个中第二个试验,就是要基于raft算法,完成一个散布式一致性体系。但本日先不说raft算法,而是先议论下什么是散布式一致性问题,以及为何它会难!!下一章再说raft是怎样设想从而处置惩罚了散布式共鸣这一困难。

什么是散布式一致性问题

起首,什么是散布式体系一致性问题?散布式体系这个词应当不必多诠释,简朴地说就是由多个节点(一个节点即一台物理机械或一个历程),异步得经由过程网络通讯而构成的体系。

而一致性(Consistency),这个词在差别的场景下有差别的寄义,比方说人人比较熟的应当是在关联型数据库中事件的一致性。但在散布式体系中,一致性的基础寄义是对举行举行一个或多个操纵指令以后,体系内的其他成员对这些操纵指令的效果能够杀青共鸣,也就是对效果的观点是一致的。

举个例子,比方说有多个客户端,这些客户端出于某种缘由,都要对散布式体系中的变量v赋值,客户端A提议一个赋值要求修正v=a,客户端B也提议一个要求修正v=b,等等等。但终究在某一个时刻布式体系内都能够对v的值发生一个共鸣,比方终究人人都晓得v=a。而不会说体系内差别节点对这个值有差别的观点。

要做到这一点很难吗?是的,很难。

注:一致性这个词实在包括挺广的,但这里特质共鸣这个意义,所以有时刻也会用共鸣的说法,晓得是一个意义就好了。

为何散布式一致性问题很难

邃晓了什么是散布式一致性问题以后,我们再来议论为何散布式一致性会很难。

假如是在单机环境下,完成一致性是很轻易做到的,基础上我们开发的程序都能够做到。但在散布式环境下,则难度放大了无数倍。由于在散布式环境下节点间的状况是经由过程网络通讯举行传输的,而网络通讯是不牢靠的,无序的,注重这里的不牢靠不是说tcp或udp的谁人牢靠,而实没法经由过程网络通讯正确推断其他节点的状况。

比方A向B发送了一个要求,B没有回应。这个时刻你没办法推断B是忙于处置惩罚其他使命而没法向A复兴,照样由于B就真的挂掉了。

趁便说一点,散布式一致的问题每每还具有肯定的欺骗性。

它具有肯定欺骗性的缘由在于散布式一致性的问题直观感觉上每每比较简朴,比方上面的A向B发送要求的问题,我们不管挑选直接以为B挂掉,或许挑选让A不停举行重试,看上去彷佛都能处置惩罚这个问题。但随着而来的又会有新问题,比方A挑选以为B挂掉而举行失利处置惩罚,那末体系继承无碍运转。但假如B只是由于体系使命忙碌,过一会恢复功课,A就由于本身的挑选破坏了数据的一致性,由于在B断线时期体系就不一致了。这就又涌现了新的问题。

总结起来,就是看似简朴的问题,引入简朴的解,每每又会涌现新的问题。然后又继承在此基础上“打补丁”,然后又会涌现新的问题,不停循环往复,一个简朴的问题不停叠加,就变成了超等庞杂辣手的问题。就像筑堤堵水,水不停涨,堤坝不停堆砌,终究到了一个谁也没法处置惩罚的田地。

说回方才的话题,根据方才的例子,实在能够引出另一个问题,那就是活性(liveness)和平安性(satefy)的弃取。

活性(liveness)与平安性(satefy)

活性与平安性,这个要怎样明白呢?

方才说到,当A向B发送要求,B没有实时回应。但这个时刻,A是没法正确晓得B真正的状况的(忙于其他使命照样真的挂掉了),也就是说我们是没法做到完整正确的毛病检测

这类时刻根据上面的说法,有两种挑选,

  1. 使命B照旧或许,无穷重试,不停守候。
  2. 直接以为B挂掉了,举行毛病处置惩罚。

挑选1,破坏了体系的活性,由于在重试的时候内,体系是没法对外供应效劳的,也就是短暂得失活了。

选2呢又破坏了平安性,由于假如B实在没有挂掉,而这时刻重新启动一个节点担任底本B的事情,那末此时体系中就会有旧的B节点,和新的B节点。此时旧的节点就称之为僵尸节点(Zombie)。而假如在主从散布的体系,也就是一个leader多个follower的体系中,假如B刚好是leader,那末这类状况也被称之为脑裂。

能够发明,liveness和响应速度有关,而satefy又和体系的可用性相干,而且这两者是不可兼得的。

关于这个问题,上世纪Lynch宣布的一篇论文《Impossibility of Distributed Consensus with One Faulty Process》,基础上已论述了这个定理,也就是FLP impossibility。

FLP impossibility

FLP impossibility说清楚明了如许一件事,在散布式或许说异步环境下,即使只要一个历程(节点)失利,盈余的非失利的历程不可能杀青一致性。

这个是散布式领域中的定理,简称就是FLP impossibility。

固然一切的定理彷佛都不是那末好明白,FLP impossibility也是一样,光是结论听起来就异常拗口。证实起来那就越发笼统,甚至在论文中也没有经由过程例子来论证。由于假如要经由过程实例来论证,那末起首就得要先设想N多的散布式算法,然后再一一证实这些算法是FLP impossibility。

实在浅显些的明白,那就是说散布式(异步)环境下,liveness和satefy是鱼与熊掌不可兼得。不可能做到100%的liveness同时又兼顾到satefy。想要100%的satefy,那末liveness又保证不了,这内里又彷佛有CAP的影子,不得不说途径都是相通的。

话说回来,既然FLP impossibility已说死了,异步环境下,即使只要一个历程(节点)失利,盈余的非失利的历程不可能杀青一致性,那末paxos和raft这些算法又是怎样做到散布式异步环境下一致的呢?

山穷水尽

实在FLP impossibility已为我们指明方向了。既然没法完整兼得,那天然要放松某方面的限定,satefy是不能放松的,那天然只能从liveness高低手了。

详细做法上,那就是给散布式体系加上一个时候限定,实在在前面引见liveness和satefy的时刻,应当就有人能想到了。既然不能一向守候也不能直接使命远端节点挂掉,那末折中一下,在某个时候内不停重连,凌驾这个时候,则以为远端节点是挂掉就能够了。

而事实上也正是如此,假如你对zookeeper熟习,那应当晓得zookeeper在推举leader的时刻是不供应效劳的,这就是它损失部份liveness的一个表现。另一个表现是,机能,由于要经由过程一个时候段来对远端节点状况举行确认,那天然机能会有所下落,这又是不可避免的。

而详细的raft算法,那就比及下一节再说吧。

总结:

  1. 散布式一致性指的实在就是散布式异步环境下,要让多个节点对体系状况的转变能够杀青共鸣。
  2. 散布式体系一致性难,难在异步通讯不牢靠。由此衍生出了liveness和satefy弃取的问题以及僵尸节点问题,有了FLP impossibility定理。
  3. paxos/raft等算法经由过程一个平安时候段,能够在某种程度上完成散布式体系的一致性。

PS:本篇大部份参考自,只是内里有很多是讲流处置惩罚体系的。不过同样是裂墙引荐,横竖看过的都说好。

以上~

Centos7.X 搭建Prometheus+node_exporter+Grafana及时监控平台

参与评论