学架构笔记5:高可用复杂
维基百科:
系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。
关键点:无中断
软件和硬件本质上都无法做到无中断。现在的方法本质上都是通过冗余实现高可用。
尽管都是加机器,高性能复杂和高可用复杂依然有区别:高性能增加机器目的在于扩展处理性能,高可用增加机器目的在于冗余处理单元。
为了高可用引入了冗余,同时也给程序带来了复杂。
计算高可用
计算指业务的逻辑处理,特点是在不同的机器上输入相同的数据、相同的逻辑处理,产出结果肯定是一样的。
计算高可用的复杂在于:
- 引入任务分配器,需要维护
- 任务分配器和业务服务器间连接的管理
- 分配算法(不存在某一算法一定优于另外的算法)
存储高可用
存储与计算相比区别是:将数据从一台机器搬到另一台机器,需要经过线路进行传输,而传输时间不稳定。
延迟意味着整个系统在某个时间点上数据可能不一致,这个时候就算是相同的业务逻辑,也无法得出相同的产出结果。
除了延迟了,网络传输线路也存在可用性问题,如错包、丢包甚至断线。如果线路断线,意味着一段时间内存储数据无法同步。
高存储可用的难点不在于备份数据,而在于如何减少或规避数据不一致对业务造成的影响。
高可用状态决策
计算高可用和存储高可用的基础都是状态决策,即系统能够判断当前的状态是正常还是异常的,为了保证高可用需要立刻处理异常状态。
而决策却总是有多种的,可能对一个异常多种的决策都适用,也有可能只有一种较优决策。
独裁式
存在一个独立的决策主体,负责收集所有的信息,然后进行整体操作的把控。
独裁者的问题在于决策者只有一个,在决策者出故障后整个系统会进入严重的瘫痪。
协商式
两个独立的个体沟通最后进行决策,如最常见的主备决策。
举个例子,主备决策:
- 启动时两台都是备机
- 两台服务器建立连接
- 两台服务器交换状态信息
- 其中一台做出决策,成为主机,另一台成为备机。
当主备连接中断时,无论是备机升级为主机还是备机不升级(无法得知主机是否真的宕机),都是不适当的。因此可以增加更多的链接降低网络带来的影响。
民主式
多个独立的个体通过投票的方式进行状态决策,如Zookeeper选主。
民主式与协商式很类似,但是是按照多数取胜的方式来的。
民主式存在的问题是脑裂,即一个集群里面出现了两个主机,解决方案可以采用“投票节点数必须超过系统总结点数的一半”。
总结
学习了软件中高可用带来的复杂度以及几种决策方式。
先这样吧
若有错误之处请指出,更多地关注煎鱼。