2万字 | 写了八篇分布式算法,我“悟空”了

共 4876字,需浏览 10分钟

 ·

2021-03-25 13:12








这是悟空的第 86 篇原创文章


作者 | 悟空聊架构


来源 | 悟空聊架构(ID:PassJava666)



转载请联系授权(微信ID:PassJava)


本文主要内容:



最近三个月更新了 8 篇分布式理论和算法的文章,发现这些知识点虽然有一丢丢小枯燥,但是非常重要,于是每篇我都用故事的方式进行讲解,力求每篇都能让大家都能看懂,是不是很用心呢?


在写的过程中,我慢慢地悟出了分布式理论和算法的真谛,且听下文分解。


重要性


分布式理论和算法的重要性体现在哪呢?


你是不是经常听到 CA,AP 理论,CAP 三角不可能同时达成?


Zookeeper 怎么进行 Leader 选举的?


怎么进行容错?


这些问题的答案都是分布式理论和算法的精髓所在。而且说个很现实的问题,在现阶段,掌握分布式算法也是出去面试架构师、技术专家等高薪职位时,也是会被经常问到的。但是求职者中只有少部分懂这一块。


我为什么要强调分布式算法的重要性?不论是对技术深度的追求,还是长期职业发展的需要,都是可以提升你的核心竞争力的。


好学吗?


现在很多开发同学对分布式的组件怎么使用都有一定经验,也知道 CAP 理论和 BASE 理论的大致含义。但认真去看分布式算法的真的很少,原因有三:





  • 担心算法过于复杂,所以花的时间很少。



  • 网上的资料能用大白话将分布式算法讲清楚的比较少。



  • 学习分布式算法没有一条清晰的路线。


学习分布式协议和算法的路线可以是先学习四大基础理论,作为地基。然后再学习分布式协议和算法。就像是在地基上建房子,地基打好了,才能建更稳固的高楼大厦。


而分布式理论主要有四大块:


四大基础理论





  • 拜占庭将军问题



  • CAP 理论



  • ACID 理论



  • BASE 理论


分布式协议和算法主要有八种:


八大分布式协议和算法





  • Paxos 算法



  • Raft 算法



  • 一致性 Hash 算法



  • Gossip 协议算法



  • Quorum NWR 算法



  • FBFT 算法



  • POW 算法



  • ZAB 协议


如何高效地学习和掌握?


开发分布式系统最关键的就是根据场景特点,选择合适的算法,在一致性和可用性之间妥协折中,而如何做好折中方案,依赖于是否真正理解了各算法的特点。


讲真,如果认真学习这些理论和算法,并清楚了每个算法的特点,适合怎样的场景,当开发分布式系统时,做到知己知彼,才能旗开得胜,实际场景中的问题也能分析清楚并解决掉。


那么这些算法有哪些特点和适用场景,该从哪些方面考量?


分布式算法的四大维度


四大维度:拜占庭容错、一致性、性能、可用性。


这里我做了一个分布式算法四大维度的表格,大家可以对比下:


拜占庭容错


拜占庭容错就是《拜占庭将军问题》中提出的一个模型,该模型描述了一个完全不可信的场景。不可信体现在:





  • 故障行为。比如节点故障了。



  • 恶意行为。比如恶意节点冒充正常节点,发出错误指令。


拜占庭容错的另外一面就是非拜占庭容错,又叫故障容错,解决了分布式系统存在故障,但是不存在恶意节点共识的问题,譬如节点所在服务器硬件故障、节点的服务进程崩溃等。


非拜占庭容错算法


在可信的环境,只需要具有故障容错能力,譬如 2PC、TCC、Paxos算法、Raft 算法、Gossip 协议、Ouorum NWR 算法、ZAB 协议。


拜占庭容错算法


而在不可信的环境,需要具有拜占庭容错能力,报错 POW 算法、FBFT 算法。


一致性


一致性分为三种:





  • 强一致性:保证写操作完成后,任何后续访问都能读到更新后的值。



  • 弱一致性:写操作完成后,系统不能保证后续的访问都能读到更新后的值。



  • 最终一致性:保证如果对某个对象没有新的写操作,最终所有后续访问都能读到相同的最近更新的值。


在数据库操作层面,我们多使用二阶段提交协议(2PC)保证强一致性。在分布式系统中,多使用 Raft 算法来保证强一致性。如果考虑可用性,则使用 Gossip 协议实现最终一致性,配合 Quorum NWR 算法的三个参数来调节容错能力。而 zookeeper 基于读性能的考虑,通过 ZAB 协议提供最终一致性。


可用性


可用性表示能得到响应数据,但不保证数据最新,强调服务可用。前提条件:访问的是非故障节点。


可用性最强的就是 Gossip 协议了,即时只有一个节点,集群可以提供服务。然后是 Paxos/Raft/ZAB/Quorum NWR/FBFT/POW 算法,能够容忍部分节点故障。


而 2PC、TCC 要求所有节点都正常运行,系统才能正常工作,可用性最低。


性能


性能和可用性联系非常紧密,可用性越高,性能越强。


上面可用性的排序同样适用于性能维度。Gossip 协议可用于 AP 型分布式系统,水平扩展能力强,读写性能最强。


Paxos/Raft/ZAB/Quorum NWR/FBFT/POW 算法都是领导者模型,写性能依赖领导者,读性能依赖一致性的实现。性能处于中等位置。


而 2PC、TCC 实现事务时,需要预留和锁定资源,性能较差。


学习路线


第一讲:拜占庭将军问题


必须先把拜占庭将军问题弄懂,这篇我用三国杀卡牌游戏中的四种身份牌来讲解了拜占庭将军问题。


《用三国杀讲分布式算法,舒适了吧?》


第二讲:CAP、BASE、ACID 理论


是针对 CAP、BASE、ACID 三大理论的讲解,文中我用太极拳中的来比喻 ACID 和 BASE,而如何平衡刚和柔就需要 CAP 理论了。


用太极拳讲分布式理论,真舒服!》


第三讲:Paxos 算法


为了更好地理解 Paxos 算法,我用三国演义中的诸葛亮庞统两种角色充当提议者对 Paxos 算法的细节进行了分析。


《诸葛亮 VS 庞统,拿下分布式 Paxos》


第四讲:Raft 算法


Raft 算法其实比较好理解,但是直接描述出来会让人云里雾里,所以我借助了动图,用动图模拟 Raft 算法的选举过程,轻松易懂。


用动图讲解分布式 Raft》


第五讲:一致性哈希


这个也算作分布式算法中的一种,常用在负载均衡、路由寻址中。该算法理解起来不难,但比较枯燥,所以我用韩信点兵的故事来进行讲解,诙谐有趣。


韩信大招:一致性哈希》


第六讲:Gossip 协议


Gossip 的英文单词就是流言蜚语,具有传染性,所以我用一个传染性病毒的故事进行讲解,既可以学习分布式算法又可以了解病毒知识,一举两得。


《病毒入侵:全靠分布式 Gossip 协议》


第七讲:Quorum NWR


N、W、R 这三个参数,比较晦涩,为了让大家更容易理解,我用太上老君的炼丹炉比作节点,丹炉里面的药比作数据,用炼造过程来体现 NWR 这三个参数,更加形象化。


太上老君的炼丹炉之分布式 Quorum NWR》


第八讲:POW 算法


在学习 POW 算法时,牵扯到区块链的知识,于是我就去看了一本区块链的书《区块链:从数字货币到信用社会》,一本科普书,对我了解区块链、比特币帮助很大。而区块链中用到的核心知识之一就是 POW 算法,也叫做工作量证明。我用紫霞仙子和至尊宝的故事对区块链、比特币、工作量证明进行了讲解,诙谐有趣。


紫霞仙子:顶得住区块链的十二连问吗?》


对了,FBFT 和 ZAB 协议还没有给大家讲解,后续可能得过一段时间才能补上,因为有很多读者朋友在催更我的开源项目 PassJava,所以得去倒腾开源项目了。


另外我将这八篇内容整理成了一份 PDF 文档,总共 2W+ 字,在公众号后台回复:【分布式】三个字即可获取。





分布式算法 PDF 1.0





文中插图



- END -











作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,自主开发了一个 PMP 刷题小程序。













我是悟空,努力变强,变身超级赛亚人!










往期推荐








Kafka性能篇:为何Kafka这么"快"?







Redis 高可用篇:你管这叫主从架构数据同步原理?







图解 | 搞定分布式,程序员进阶之路







Redis 日志篇:无畏宕机快速恢复的杀手锏







图解 | 你管这破玩意叫线程池?







Redis 核心篇:唯快不破的秘密















浏览 75
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报