---
title: '学架构笔记5：高可用复杂'
pubDate: 1995-07-31
tags:
  - '笔记'
description: '学架构笔记5：高可用复杂'
---

维基百科：

> 系统无中断地执行其功能的能力，代表系统的可用性程度，是进行系统设计时的准则之一。

关键点：无中断

软件和硬件本质上都无法做到无中断。现在的方法本质上都是通过冗余实现高可用。

尽管都是加机器，高性能复杂和高可用复杂依然有区别：高性能增加机器目的在于**扩展**处理性能，高可用增加机器目的在于**冗余**处理单元。

为了高可用引入了冗余，同时也给程序带来了复杂。

## 计算高可用

计算指业务的逻辑处理，特点是在不同的机器上输入相同的数据、相同的逻辑处理，产出结果肯定是一样的。

计算高可用的复杂在于：

1. 引入任务分配器，需要维护
2. 任务分配器和业务服务器间连接的管理
3. 分配算法（不存在某一算法一定优于另外的算法）

## 存储高可用

存储与计算相比区别是：将数据从一台机器搬到另一台机器，需要经过线路进行传输，而传输时间不稳定。

延迟意味着整个系统在某个时间点上数据可能不一致，这个时候就算是相同的业务逻辑，也无法得出相同的产出结果。

除了延迟了，网络传输线路也存在可用性问题，如错包、丢包甚至断线。如果线路断线，意味着一段时间内存储数据无法同步。

高存储可用的难点不在于备份数据，而在于如何减少或规避数据不一致对业务造成的影响。

## 高可用状态决策

计算高可用和存储高可用的基础都是状态决策，即系统能够判断当前的状态是正常还是异常的，为了保证高可用需要立刻处理异常状态。

而决策却总是有多种的，可能对一个异常多种的决策都适用，也有可能只有一种较优决策。

### 独裁式

存在一个独立的决策主体，负责收集所有的信息，然后进行整体操作的把控。

独裁者的问题在于决策者只有一个，在决策者出故障后整个系统会进入严重的瘫痪。

### 协商式

两个独立的个体沟通最后进行决策，如最常见的主备决策。

举个例子，主备决策：

1. 启动时两台都是备机
2. 两台服务器建立连接
3. 两台服务器交换状态信息
4. 其中一台做出决策，成为主机，另一台成为备机。

当主备连接中断时，无论是备机升级为主机还是备机不升级（无法得知主机是否真的宕机），都是不适当的。因此可以增加更多的链接降低网络带来的影响。

### 民主式

多个独立的个体通过投票的方式进行状态决策，如Zookeeper选主。

民主式与协商式很类似，但是是按照多数取胜的方式来的。

民主式存在的问题是脑裂，即一个集群里面出现了两个主机，解决方案可以采用“投票节点数必须超过系统总结点数的一半”。

## 总结

学习了软件中高可用带来的复杂度以及几种决策方式。

_先这样吧_

若有错误之处请指出，更多地关注[煎鱼](http://www.jianyujianyu.com)。
