高可用性
系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。
高可用的“冗余”解决方案,单纯从形式上来看,和之前讲的高性能是一样的,都是通过增加更多机 器来达到目的,但其实本质上是有根本区别的:高性能增加机器目的在于“扩展”处理性能;高 可用增加机器目的在于“冗余”处理单元。
计算高可用
计算:指业务的逻辑处理,同样的算法和输入数据,产出的结果都是一样的。
影响因素,类似高性能中集群-任务分配,这里主要考虑异常情况,比如:
1、任务分配器与服务器之间的交互和链接。连接建立、连接中断等;
2、任务分配器需要增加分配算法。常见的双机算法有主备、主主,主备方案又可以细分 为冷备、温备、热备
存储高可用
将数据从一台机器搬到到另一台机器,需要经过线路进行 传输。
关键点:以存储高可用的难点不在于如何备份数据,而在于如何减少或 者规避数据不一致对业务造成的影响。
高可用状态决策
无论是计算高可用还是存储高可用,其基础都是“状态决策”,即系统需要能够判断当前的状态 是正常还是异常,如果出现了异常就要采取行动来保证高可用。通过冗余来实现的高可用系统,状态决策本质上就不可能做到 完全正确。
1、独裁式
独裁式的决策方式不会出现决策混乱的问题,因为只有一个决策者,但问题也正是在于只有一个 决策者。当决策者本身故障时,整个系统就无法实现准确的状态决策。
2、协商式
协商式决策指的是两个独立的个体通过交流信息,然后根据规则进行决策,最常用的协商式决策 就是主备决策。
这个架构的基本协商规则可以设计成:
2 台服务器启动时都是备机。
2 台服务器建立连接。
2 台服务器交换状态信息。
某 1 台服务器做出决策,成为主机;另一台服务器继续保持备机身份。
协商式决策的架构不复杂,规则也不复杂,其难点在于,如果两者的信息交换出现问题(比如主备连接中断,怎么判断主机是否正常),此时状态决策应该怎么做。目前是以增加连接(双连接、三连接等),来降低连接中断导致的问题。
- 民主式
民主式决策指的是多个独立的个体通过投票的方式来进行状态决策。例如,ZooKeeper 集群在 选举 leader 时就是采用这种方式。
可扩展性
可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需 要或者仅需要少量修改就可以支持,无须整个系统重构或者重建。2个指标:正确预测变化、完美封装变化。
正确预测变化:
1、不能每个设计点都考虑可扩展性。
2、不能完全不考虑可扩展性。
3、所有的预测都存在出错的可能性。
完美封装变化:
- 系统需要拆分出变化层和稳定层
- 需要设计变化层和稳定层之间的接口
设计的时候考虑可扩展性,但如果评估后发现可扩展性设计的代价太大, 那就暂时不做,等到真的有需求时再重构。 过早考虑可扩展性,很多通用性和抽象都是推测的,等到真的要落地了,很可能发现事实并 非如此,这就是预测是错误的。
低成本
低成本给架构设计带来的主要复杂度体现在,往往只有“创新”才能达到低成本目标。这里 的“创新”既包括开创一个全新的技术领域(这个要求对绝大部分公司太高),也包括引入新技 术,如果没有找到能够解决自己问题的新技术,那么就真的需要自己创造新技术了。 类似的新技术例子很:。 NoSQL(Memcache、Redis 等)的出现是为了解决关系型数据库无法应对高并发访问带来 的访问压力。
全文搜索引擎(Sphinx、Elasticsearch、Solr)的出现是为了解决关系型数据库 like 搜索的 低效的问题。
Hadoop 的出现是为了解决传统文件系统无法应对海量数据存储和计算的问题。
安全
从技术的角度来讲,安全可以分为两类:一类是功能上的安全,一类是架构上的安全。
规模
规模带来复杂度的主要原因就是“量变引起质变”,当数量超过一定的阈值后,复杂度会发生质 的变化。常见的规模带来的复杂度有:
-
功能越来越多,导致系统复杂度指数级上升
-
数据越来越多,系统复杂度发生质变