当前位置: 首页 > 后端技术 > Node.js

分布式系统设计概念这么难学吗?

时间:2023-04-03 20:16:50 Node.js

分布式系统作为21世纪的程序员,如果你没有听说过分布式系统,你会像没有女票一样尴尬。无论是出去面试跟面试官吹水,还是上班跟同事吹水,分布式系统永远是你高人一等的筹码。分布式系统已经诞生几十年了,比我们80年代出生的程序员还要成熟。随着现代互联网的兴起,对系统性能和可靠性的要求大大提高。分布式系统的定义其实非常简单和抽象:任何由位于不同物理位置的多个进程提供相同服务的系统都可以称为分布式系统。退一步讲,同一台服务器上的不同进程,也是可以组成分布式系统的。分布式系统的首要目标是提高系统的整体性能,而不局限于吞吐量、可靠性、响应时间、数据一致性等,其中,提高性能指标最为重要。如果最终设计出来的分布式系统占用资源多,但性能不如单机,那么这个分布式系统就是失败的,理论上没有任何价值。分布式系统的整体性能提升并不仅仅依赖于提高单机的处理性能还是很重要的。最大化单机性能的分布式系统在相同性能要求下使用的资源远少于其他系统。分布式系统痛点一个好的分布式系统在性能上远超单机系统,但在数据行为方面,包括数据一致性、硬件故障率、网络不稳定性等方面,应该表现得和单机系统一样好。性等。无论是单机系统还是分布式系统,都存在无法避免也无法完全杜绝的风险,例如:硬盘故障、网络故障、光纤被挖...随着分布式系统中的节点,这些故障的发生率也随之增加,所以分布式系统的目标之一就是将这些风险降到最低,这叫做容错。快速且不犯错误是一种“道德”冲突。就像我们平时说的分布式锁,如果要保证对资源的修改不会引起线程安全问题,就必须付出降低性能的代价。至于性能和容错怎么选择,需要具体到各个业务场景。比如在支付场景中,数据的正确性可能比性能指标更重要,而那些日志类的数据,比如用户登录日志,这些数据的准确性最大的特点就是允许有一小部分丢失.在这样的日志系统设计中,性能指标可能大于容错性。RottenStreet目前对CAP原理的解释是分布式系统的抽象理论,包括后来的BASE理论,也是分布式系统的指导方案。设计分布式系统分布式系统的特性决定了它从诞生之日起就存在多个节点如何协同工作的问题。就像一个团队,要让这个团队有条不紊地工作,就已经是个问题了。为了完成同样的任务,一堆节点注定需要一个规则来规范半径。在目前已知的解决方案中,主要有两种方案:中心化和去中心化。集中式和集中式分布式设计理念是目前主流的解决方案。在集中式设计方案中,节点按角色区分:Leadernode和Worknode,即:leader和work。与现实类似,leader只负责分发任务和监督,Work节点只负责接收任务和做工作。我在这里补充一点,工作节点接收任务。当然,从通信的角度来看,它们又可以分为推拉(pushandpull)方式。push方式是leader节点主动向Work节点分发任务,pull方式是Work节点主动申请任务。至于push和pull的优缺点,就不作为今天的话题来讨论了。在任何系统中,都免不了要考虑节点宕机的问题,分布式系统也是如此。在集中式分布式设计中,leader和Work也都有宕机的可能。如果领导者失败,整个系统将瘫痪。按照最简单的设计思路,leader节点需要一个slave节点或者backup节点。主节点宕机后,从主节点或备份主节点可以手动或自动执行领导节点服务。至于一个Work节点宕机,一般不会导致整个系统瘫痪,除非所有Work节点同时宕机。一个Work节点宕机了,但是会影响到这个节点当前正在执行的任务,所以可以设计任务在必要的条件下需要Ack,即需要确认一个任务的完成。如果长时间没有确认,leader会发起Action重新分配任务。说到leader问题,现在大部分分布式系统都有自动选举leader的功能,这得益于Paxos、Raft等选举算法。当leader不可用时,这些系统会根据节点情况自动选举出新的leader节点继续提供服务,大大提高了系统的可用性。在所有集中式设计中,数据写操作都发生在leader节点上,有点类似于单机系统,所以这种集中式设计不适合那些大规模的写操作。去中心化在去中心化分布式系统的设计中,节点类型不区分Leader和Work,所有节点都是平等的。因此,任何一个节点的宕机都不会导致整个系统的瘫痪,这是它的优势所在。然而,获取系统中每个节点的信息比集中式设计要困难得多。在集中式设计中,领导节点存储了系统中所有节点的信息,并可以将这些信息实时同步到其他节点。同时可以使用相应的算法来达到一致性要求。在去中心化设计中,每个节点只能依靠与其他节点的持续通信来获取整个系统的节点信息,这在技术上要比中心化困难得多。在网络中,网络是不可靠的。也正是因为这个原因,各个节点之间的通信变得更加困难。在极端情况下,去中心化设计会出现多个小规模的“帮派”,也就是所谓的脑裂。例如:现在一个由10个节点组成的分布式系统,由于网络的原因,可能会分成两个“组”,5个节点相互通信。如果出现脑裂情况,目前主流的解决方案和数据库死锁的处理情况类似,自毁对系统的影响比较小。完全中心化和去中心化的系统并不常见,但现在慢慢出现的是两者的结合,表面上看似去中心化,但设计理念是中心化的思想。在这种架构下,leader是程序按照一定的算法选举出来的,当系统leader失效时,系统会自动重新选举leader节点。写在最后对于每一个系统来说,可靠性都是它想要达到的主要目标之一,尤其是分布式系统。在网络通信、硬件设备等条件还不是100%可靠的情况下,如何提高分布式系统的可用性是一个很深的话题。即便是国内顶级的BAT等大厂,也没有一个系统能够做到100%的可用性,4个9的可用性已经达到顶峰。分布式系统本质上是由多个节点通过网络IO组成的,其中包含一些不可抗拒的元素,所以请记住一句话:分布式系统是不可靠的,我们只能将故障率降到最低,但无法根除,如果你的老板让你设计一个可用性100%的系统,他要么是二手的,要么是二手的-B系列