身为二十一世纪的一名程序员,没据说过度布式系统就显得本身好像没有女票同样尴尬。不管是出去面试跟面试官吹水,仍是在工做中和同事吹水,分布式系统永远是你显得高人一等的筹码。分布式系统已经诞生了好几十年,提及来比咱们八零后程序员好要老成,随着现代互联网的崛起,对于系统在性能,可靠性上的要求大大提升。程序员
分布式系统的定义其实很简单,也很抽象:任何由处于不一样物理位置的多个进程提供相同服务的系统均可以称之为分布式系统,退一万步讲,同一台服务器上的不一样进程也能够组成分布式系统面试
分布式系统的首要目标是提升系统的总体性能,但不只限于吞吐量,可靠性,响应时间,数据一致性等,其中提升性能指标是最重要的。若是最终设计出来的分布式系统占用了更多的资源却还比不上单机的性能,那这个分布式系统是失败的,理论上没有存在的价值算法
一个分布式系统的总体性能提升并非单单依靠扩展来实现,提升单机的处理性能仍然很重要,一个把单机性能发挥到极致的分布式系统,在同等性能的需求下,采用的资源要远远小于其余系统。数据库
一个好的分布式系统在性能方面要远超单机系统,可是在数据行为方面要表现的和单机系统同样优秀,其中包括数据的一致性,硬件的故障发生率,网络的不稳定性等。安全
不管是单机系统仍是分布式系统都存在没法回避而且没法完全去除的风险,好比:硬盘发生故障,网络发生瘫痪,光纤被挖.....分布式系统随着节点的增长,把这些故障的发生率也随之增大,因此分布式系统其中一个目标是要尽可能下降这些风险,也就是所谓的容错性。服务器
既要快还要不出错,这在“伦理”上是冲突的。就像咱们平时说的分布式锁,若是要保证对一个资源的修改不会发生线程安全问题,就要付出下降性能的代价。至于性能和容错性怎样选择,还须要具体到每一个业务场景中,好比支付场景中,数据的正确性可能要比性能指标更重要,而那些日志型数据,好比用户的登陆日志,这些数据的最大特色就是容许小部分丢失,在这样的日志系统设计中,可能性能指标要大于容错性。网络
目前烂大街的CAP原则的讲解,是针对分布式系统的一个抽象理论,包括以后BASE理论,也是针对分布式系统的一种指导方案。架构
分布式系统的特性就决定了它自出生之日起,就有多个节点如何协同工做的难题。就像一个团队,若是让这个团队有条不紊的工做原本就是个难题。一堆节点为了完成一样的任务,注定须要一个规范方圆的规则。就目前已知的方案中,主要有中心化和去中心化两种解决方案分布式
中心化的分布式设计理念是目前主流的方案,在中心化的设计方案中,节点是有角色区分的:Leader节点和Work节点,即:领导和干活的。就和现实中相似,leader只负责分发任务和监督,Work节点只负责领取任务干活,多说一句,这里Work节点领取任务,固然从通讯的角度来讲,又能够分为push和pull(推和拉)方式。推方式是指,leader节点主动将任务分发给Work节点,拉方式是指:Work节点主动去申请任务。至于push和pull的优缺点,不做为今天的主题展开讨论。性能
在任何系统中,都无可避免的须要考虑节点down掉的问题,分布式系统也同样。在中心化分布式设计中,leader和Work也同样都存在down掉的可能性。若是leader掉的话,整个系统都陷入瘫痪,按照最简单的设计思路,leader节点须要一个从节点或者备用节点,在主节点down掉以后,从主节点或者备用主节点能够手动或者自动实现leader节点服务。至于一个Work节点down掉,通常不会使整个系统陷入瘫痪,除非所有Work节点同时down掉。一个Work节点down掉,可是会影响这个节点当前正在执行的任务,因此在必要的条件下能够设计成任务须要Ack才好,即:一个任务的完成须要确认,若是长时间没有确认,leader会发起从新分配任务的操做。
说到leader的问题,如今目前大多数分布式系统都具有了自动选举leader的功能,这还要感谢paxos,raft等选举算法。在leader不可用的时候,这些系统会自动根据节点状况选举出新的leader节点来继续提供服务,这大大提升了系统可用性。
在全部的中心化设计中,数据的写操做都发生在leader节点,这在某种程度上相似于单机系统,因此这种中心化设计并不适合那些大量写的操做。
在去中心化分布式系统设计中,节点类型并不区分Leader和Work,全部节点都是相等的。因此任何一个节点down掉都不会致使整个系统瘫痪,这是它的优点。可是获取系统中每一个节点的信息却比中心化设计要难不少,在中心化设计中,leader节点存储着系统中全部的节点信息,并能够实时把这些信息同步到其余节点,同时能够利用相应算法来达到一致性的要求。去中心化的设计中,每一个节点只能依靠和其余节点不断通讯来获取整个系统的节点信息,这在技术难度上要比中心化高出不少。
在网络中,网络是不可靠的。偏偏是这个缘由,又加大了每一个节点互相通讯的难度。在极限状况下,去中心化的设计方案会出现多个小范围的“团伙”,这就是所说的脑裂。好比:如今一个由10个节点组成的分布式系统,有可能因为网络缘由会划分为两个5节点互相通讯的两个“团伙”
若是出现脑裂的状况,目前主流的解决方案和数据库死锁的处理状况相似,自爆一个对系统影响比较小的。
彻底中心化和去中心化的系统并不常见,反而如今慢慢出现的是两者的搭配者,表面看似去中心化,设计理念倒是中心化的思路,在这种架构下,leader是程序根据某种算法选举出来的,并且在系统leader发生故障的时候,系统会自动从新选举leader节点。
对于每一个系统来讲,可靠性是它要实现的主要目标之一,尤为是分布式系统。在网络通讯,硬件设备等条件都非100%可靠的状况下,如何提升分布式系统的可用性是一个很深的话题。就算是国内顶尖的BAT等大厂,也没有一个系统能达到100%的可用性,4个9的可用性已是很巅峰了。
分布式系统本质上是多个节点经过网络IO组成的,其中夹杂着一些不可抗拒的元素,因此请记住一句话:
分布式系统是不可靠的,咱们只能尽可能减少故障发生率,却根除不了,若是你的老板要你设计一套100%可用性的系统,要么他是二货,要么他是二B