zoukankan      html  css  js  c++  java
  • 复杂度来源高可用

    极客时间:《从 0 开始学架构》复杂度来源: 高可用

    引言

    维基百科上的定义:系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。
    “无中断”是重点也是难点,软件会出bug,硬件会逐渐老化,更别提复杂的外部环境更是难以预测和避免,使得很难做到真正意义上的“无中断”。
    因此,系统的高可用方案五花八门,但万变不离其宗,本质上都是通过“冗余”来实现高可用。高可用的“冗余”解决方案,单纯从形式上来看,和之前讲的高性能是一样的,都是通过增加更多机器来达到目的,但其实本质上是有根本区别的:高性能增加机器目的在于“扩展”处理性能;高可用增加机器目的在于“冗余”处理单元。
    通过冗余增强了可用性,但同时也带来了复杂性

    计算高可用:

    这里的“计算”指的是业务上的逻辑处理

    存储高可用:

    存储与计算相比,有一个本质上的区别:将数据从一台机器搬到到另一台机器,需要经过线路进行传输。机房的远近,导致花在线路上的传输时间也就不同,按照“数据 + 逻辑 = 业务”这个公式来套的话,数据不一致,即使逻辑一致,最后的业务表现就不一样了。
    无论是正常情况下的传输延迟,还是异常情况下的传输中断,都会导致系统的数据在某个时间点或者时间段是不一致的,而数据的不一致又会导致业务问题;但如果完全不做冗余,系统的整体高可用又无法保证,所以存储高可用的难点不在于如何备份数据,而在于如何减少或者规避数据不一致对业务造成的影响。
    分布式领域里面有一个著名的CAP 定理,从理论上论证了存储高可用的复杂度。也就是说,存储高可用不可能同时满足“一致性、可用性、分区容错性”,最多满足其中两个,这就要求我们在做架构设计时结合业务进行取舍。

    高可用状态决策:

    计算高可用、存储高可用其基础都是“状态决策”,即系统需要能够判断当前的状态是正常还是异常,如果出现了异常就要采取行动来保证高可用。具体实践过程中,恰存在一个本质的矛盾:通过冗余来实现的高可用系统,状态决策本质上就不可能做到完全正确。
    几种常见的决策方式

    • 独裁式
      独裁式决策指的是存在一个独立的决策主体,我们姑且称它为“决策者”,负责收集信息然后进行决策;所有冗余的个体,我们姑且称它为“上报者”,都将状态信息发送给决策者。
      独裁式的决策方式不会出现决策混乱的问题,因为只有一个决策者,但问题也正是在于只有一个决策者。当决策者本身故障时,整个系统就无法实现准确的状态决策。如果决策者本身又做一套状态决策,那就陷入一个递归的死循环了。

    • 协商式
      协商式决策指的是两个独立的个体通过交流信息,然后根据规则进行决策,最常用的协商式决策就是主备决策。
      协商式决策的架构不复杂,规则也不复杂,其难点在于,如果两者的信息交换出现问题(比如主备连接中断),此时状态决策应该怎么做。如果为规避连接中断对状态决策带来的影响,可增加更多的链接,(如双连接、三连接等)但也只能降低该影响并未彻底解决;但同时又引入了这几条连接之间信息取舍的问题,即如果不同连接传递的信息不同,应该以哪个连接为准?

    • 民主式:民主式决策指的是多个独立的个体通过投票的方式来进行状态决策。例如,ZooKeeper 集群在选举 leader 时就是采用这种方式。
      民主式决策和协商式决策比较类似,其基础都是独立的个体之间交换信息,每个个体做出自己的决策,然后按照“多数取胜”的规则来确定最终的状态。不同点在于民主式决策比协商式决策要复杂得多,ZooKeeper 的选举算法 ZAB,绝大部分人都看得云里雾里,更不用说用代码来实现这套算法了。
      缺点:脑裂,其根本原因是,原来统一的集群因为连接中断,造成了两个独立分隔的子集群,每个子集群单独进行选举,于是选出了 2 个主机,相当于人体有两个大脑了。
      为了解决脑裂问题,民主式决策的系统一般都采用“投票节点数必须超过系统总节点数一半”规则来处理。但同时降低了系统整体的可用性,即如果系统不是因为脑裂问题导致投票节点数过少,而真的是因为节点故障,此时系统也不会选出主节点,整个系统就相当于宕机了

  • 相关阅读:
    JS 字符串全部替换 ,replace (/ /g,'')
    C#中的延时加载Lazy(Of T)
    并发程序报错:ORA01007: variable not in select list(选择列表中没有变量) 以及相关动态指针写法
    【转】PLSQL中显式Cursor、隐式Cursor、动态Ref Cursor区别
    Shell 学习
    常用SQL和链接
    关于ra_customer_trx_lines_all 应收发票行
    translate和replace 的区别
    应收帐款汇总
    在Users里已经赋予了Responsibility,登陆以后无法看到新增加的Responsibility解决办法
  • 原文地址:https://www.cnblogs.com/whiteBear/p/15652680.html
Copyright © 2011-2022 走看看