目标:
- 理解高可用架构的复杂度本质
- 掌握高可用架构分析和设计
鸡蛋篮子法则(冗余法则):不要把所有鸡蛋都放到同一个篮子,放到多个篮子!
一、高可用复杂度模型
1.1 高可用复杂度模型
谈到高可用,首先想到计算高可用和存储高可用,计算高可用主要有两个维度,一是任务分配,一是任务分解;
数据复制,高可用存储架构需要把数据从一个服务器复制到另一台服务器,涉及到复杂的格式与方式;
状态决策,高可用架构需要判断故障的状态,然后进行一些比如说主备切换、集群选主的一些操作,可以有很多方式,独裁式、协商式、民主式;
不同的架构场景和技术,底层上用到的技术类似;
高性能架构分为单机高性能和集群高性能,为何高可用架构没有单机高可用?
- 高可用和高性能本质上是有区别的
- 高可用是通过冗余来实现的,一旦冗余至少是两台以上
- 高性能单机也可以做到很高的性能
鸡蛋篮子理论第三法则 - 冗余法则
一个篮子不保险,避免出现极端风险出现,用三个篮子装鸡蛋,就算一个篮子掉了坏了,它也只是损失一部分鸡蛋
鸡蛋是篮子理论第三法则(冗余法则):不要把所有鸡蛋装在一个篮子,放到多个篮子。
1、可扩展,拆分法则
2、高性能,叠加法则
3、高可用,冗余法则;高可用方案必然是集群方案
二、计算高可用 - 任务分配
2.1 计算高可用复杂度模型
2.2 任务分配 - 分析
任务分配,将任务分配给多个服务器执行
复杂度分析
- 增加“任务分配器”节点,可以是独立的服务器,也可以是SDK
- 任务分配器老百姓管理所有的服务器,可以通过配置文件,也可以通过配置服务器(例如ZooKeeper)
- 任务分配器需要根据不同的需求采用不同的算法分配
- 任务分配器需要监控业务服务器的状态,在故障时进行切换
高性能任务分配考虑的是正常处理,高可用任务分配考虑的是异常处理
2.3 任务分配 - 架构设计关键点
2.4 任务分配 - 案例
计算高性能架构,一定就是计算高可用架构么?
- Nginx可以算是计算高可用的架构
- DNS和Memcached不算是高可用的架构,因为它们不会去检测服务器是否正常的能力的
三、计算高可用 - 任务分解
3.1 任务分解 - 分析
任务分解,将服务器拆分为不同角色,不同服务器处理不同的业务。
复杂度分析
- 增加“任务分解器”节点,可以是独立的服务器,也可以是SDK
- 任务分解器需要管理所有的服务器,可以通过配置文件,也可以通过配置服务器(例如ZooKeeper)
- 需要设计任务拆分的方式,任务分解器需要记录“任务”和“服务器”的映射关系
- 任务分解器需要根据不同的需求采用不同的算法分配
- 任务分解器需要监控业务服务器的状态,在故障时进行切换。
任务分解避免业务互相影响,保证局部可靠性。
3.2 任务分解 - 架构设计关键点
3.3 任务分解 - 案例
架构模式
- 按照业务逻辑划分服务器集群
- 独立的接入服务器
四、存储高可用 - 数据复制
4.1 存储高可用复杂度模型
存储高可用的核心关键点就是两个,数据复制和状态决策,数据复制就是怎么把数据从A服务器复制到B服务器;状态决策就是怎么判断A服务器正常还是B服务器正常,如果不正常该怎么做
模型可以深化出多少种架构?
- 这是一个简单的算术题
- 3 * 4 * 3 = 36种
4.2 数据复制 - 格式
【复制命令】
优缺点
- 实现简单,复制数据量小
- 数据可能不一致(SQL函数)
适应场景,增量复制
【复制数据】
- 实现简单
- 保证数据一致
- 复制流量可能会很大
适应场景,增量复制
【复制文件】
- 实现复杂,复制的时候数据在变
- 保证数据一致
- 复制流量可能会很大
适应场景,全是复制
4.3 数据复制 - 方式1
【同步复制】
优缺点
- 最强一致性,故障容忍度低
- 写入性能低
适应场景
- 主备/主从架构
【异步复制】
优缺点
- 写入性能高,故障容忍度高
- 容易出现数据不一致
适应场景
- 数据存储集群
4.4 数据复制 - 方式2
【半同步复制】
半同步复制,先挑选一台服务器进行复制,只要这一台服务器复制成功就返回客户端成功,然后再通过异步方式两步给其他服务器。
优缺点
- 同步复制和异步复制的折衷方案
适应场景,数据存储集群
【多数复制】
什么叫做多数复制,为了能够保证数据一致性跟可靠性,把数据不是复制到一台服务器,而是复制到多数服务器(5个节点至少3个,7个节点至少4个)
优缺点
- 数据强一致性,最高可用性,故障容忍度高。
- 写入性能不高,实现复杂。一般需要算法来支撑,比如说像Paxos算法和Raft算法
适用场景,分布式一致性、分布式协同(OceanBase、ZooKeeper)
4.5 数据复制 - 案例
【Redis】
- 复制格式:命令(AOF)+ 文件(RDB)
- 复制方式:异步 + wait(指定半同步)
【MySQL】
- 复制格式:命令(statement)+ 数据(Row)
- 复制方式:异步 + 半同步
五、存储高可用 - 状态决策
5.1 状态决策 - 独裁式
【优缺点】
- 决策逻辑简单
- 决策者要做到高可用,整体架构复杂,常用ZooKeeper/Raft/Keepalived
- 数据一致性强度中等
【应用场景】 绝大部分业务都可以应用
5.2 状态决策 - 协商式
【优缺点】
- 架构实现简单,决策逻辑简单,一般是心跳机制
- 如果是链路问题,会导致双主,可以用双通道来缓解
- 数据一致性弱
【应用场景】 内部系统、网络设备(用串口相连)
5.3 状态决策 - 民主式/选举式
【优缺点】
- 决策过程复杂,决策逻辑复杂,一般用标准算法进行选举,例如Raft、ZAB、Paxos
- 可用性最高,数据一致性最强
- 可能出现“脑裂”问题,可采用quorum来控制
【应用场景】 对数据一致性要求很高的场景,例如余额、库存