第二篇:故障容忍

Posted flying_1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二篇:故障容忍相关的知识,希望对你有一定的参考价值。

目录

故障容忍

故障类型

RAID 容错

RAID 0(块级条带化)

RAID 1(镜像)

RAID 2(位级条带化)

RAID 3(字节级条带化)

RAID 4(块级条带化)

具有 3 个磁盘的 RAID 5(块级条带化)

RAID 6(块级条带化)

投票容错

Failvote

Failfast (voting)

比较

磁盘容错

Failvote系统的可用性

容错与修复

另一种容错技术(Old master - new master)

软件可靠性

如何提高

1. N 版本编程(如 n-modules)

2. 作为“交易”的软件可靠性:中止和重启

3. 进程配对

通讯可靠性

总结


故障容忍

使系统能够在其某些组件发生故障时继续正常运行的属性。

从统计的角度出发

P(A) = 事件 A 在某个时期发生的概率。

那么

事件 A 的平均时间是,MT(A) = 1/P(A)

模块可用性:衡量服务完成与经过时间的比率

也就是 = 平均无故障时间/(平均无故障时间+平均无修复时间)

平均无故障时间指的是经历故障之前的时间

故障类型

环境:温度、电力、天气、数据通信线路、火灾、地震、海啸、战争、破坏等故障
操作:系统管理、系统配置和系统操作程序
维护:定期维护程序,定期更换硬件
硬件:设备、冷却
软件:程序
流程:罢工、停工管理决策、战争

RAID 容错

独立磁盘冗余阵列 – 将多个磁盘组合为一个单元以实现容错或性能改进,或两者兼有的不同方式。

RAID 0(块级条带化)

A0, A1, A2, ... 是文件的连续数据块

  • 提供磁盘驱动器的平衡 I/O – 吞吐量~双倍
  • 任何磁盘故障都将是灾难性的,MTTF 会降低 2 倍

以增加故障脆弱性为代价的更高吞吐量

A 表示块(4K 或 8K 字节的存储空间)
• MTTF = 平均无故障时间

RAID 1(镜像)

  • 提供更高的读取吞吐量但更低的写入吞吐量(总速度的一半——即单个磁盘速度)
  • 一半的存储利用率
  • MTTF 大幅增加(二次增加——即 MTTF^{2}!)

只要 1 个磁盘正常工作就继续运行

RAID 2(位级条带化)

• 条带化发生在位级
• 提供更高的传输速率(单盘的两倍)
• MTTF 与 RAID 0 一样减少了一半
• 很少用到

b 表示位(bit)

RAID 3(字节级条带化)

B0, B1, B2, B3, .. 是文件的数据字节

• 条带化发生在字节级别
• 很少用到
• 提供与 RAID 0 相同的更高传输速率

• P0 是字节 B0 和 B1 的奇偶校验

P_{i} = B_{2i}\\bigoplus B_{2i+1},\\bigoplus 是异或符号

MTTF大幅增加(RAID1的1/3 = MTTF^{2}/3),因为可以从其他2个磁盘的数据中恢复1个磁盘故障

•B 表示字节
• P 是奇偶校验
• MTTF = 平均无故障时间
• 奇偶校验(或校验位)用于错误检测

RAID 4(块级条带化)

• 条带化发生在块级别
• 用于奇偶校验块的专用磁盘
• 提供更高的吞吐量但写入速度非常慢。 Disk3 有更多的写入,因为每次写入数据都需要更新奇偶校验。
• MTTF 大幅增加(与 RAID3 相同)

P_{i} = A_{2i}\\bigoplus A_{2i+1},\\bigoplus是异或符号

•A 表示块(4K 或 8K 字节的存储空间)
•P 是奇偶校验

具有 3 个磁盘的 RAID 5(块级条带化)

• A0、A1、A2、A3、.. 是文件的连续数据块
• 条带化发生在块级别
• 奇偶校验块也是条带化的
• 提供更高的吞吐量,但写入速度较慢,但优于 RAID 4,因为奇偶校验位分布在所有磁盘中,并且所有 3 个磁盘之间的平均写入操作数相等。
• MTTF 大幅增加(与 RAID3 相同)

P_{i} = A_{2i}\\bigoplus A_{2i+1},\\bigoplus是异或符号

•A 表示块(4K 或 8K 字节的存储空间)
•P 是奇偶校验

RAID 6(块级条带化)

•A 表示块(4K 或 8K 字节的存储空间)
•P 是奇偶校验

• 除了使用两个奇偶校验块外,与 RAID 5 类似。
• 可靠性是 MTTF^{3}/10 的数量级
• P0 和P1 是块A0、A1 和A2 的奇偶校验块。 这些计算方式使得任何两个磁盘故障都可以安全地恢复数据。

投票容错

使用多个模块,投票支持更高的可靠性

Failvote

如果没有多数同意则停止(针对系统所有模块,不管故障没故障)

Failfast (voting)

类似于failvote,除了系统感知哪些模块可用并使用可用模块的多数同意。

比较

• 10 个模块的Failfast 系统将继续运行,直到9 个模块出现故障;然而当5 个模块出现故障时Failvote 停止。
• Failfast 系统比failvoting 具有更好的可用性(因为failvote 在没有多数同意时停止)。

磁盘容错

超级模块 – 自然地,具有多个硬盘驱动器的系统预计仅在一个工作磁盘上运行(当多个磁盘工作/可用时使用投票,但即使只有一个可用时仍然工作)

Failvote系统的可用性

如果有 n 个事件,到第一个事件的平均时间 = m/n

考虑一个带有模块的系统,每个模块的 MTTF 为 10 年
使用 2 个设备进行failvote:

  • MTTF = 10/2 = 5 年(系统因 1 个设备故障而出现故障)

使用 3 个设备进行故障投票:

  • MTTF = 第一次故障的 10/3 + 第二次故障的 10/2 = 8.3 年。

较低的可用性以获得更高的可靠性(多个模块同意一个值意味着该值更有可能是准确/可靠的)

容错与修复

模块修复:一旦检测到故障,故障设备的平均修复时间为 MTTR(平均修复时间)(有时 MTTR 只是需要更换的时间)

特定模块的概率不可用= MTTR/(MTTF+MTTR)
                                    ≅ MTTR/MTTF 如果 MTTF >> MTTR

带修复的超级模块的容错

(n-1) 个模块不可用的概率,P_{n-1} = (\\frac{MTTR}{MTTF})^{n-1}

特定第 i 个模块失败的概率,P_{f}=\\frac{1}{MTTF}

系统因特定第 i 个模块最后失败而失败的概率 =P_{n-1}*P_{f} = (\\frac{MTTR}{MTTF})^{n-1} * \\frac{1}{MTTF}

当其他 (n-1) 个模块不可用时,由于 n 个模块中的任何一个最后失败而导致超级模块失败的概率 =

(\\frac{MTTR}{MTTF})^{n-1} * \\frac{n}{MTTF}

另一种容错技术(Old master - new master)

• 在单独的文件(稳定存储)中记录要执行的所有更新(交易)
• 在晚上(通常)使用旧的(前一天)主文件和批量更新(事务)生成一个单独的新(第二天)主文件。

容错 - 只要我们有旧的 master 和要执行的事务,我们总是可以产生新的 master

注意:不在线处理,交易失败直到第二天才通知。

软件可靠性

软硬件可靠性的主要区别
• 硬件可靠性需要容忍组件故障。
• 软件可靠性要求容忍设计和编码错误。
• 硬件和软件之间的区别越来越小,因为大多数硬件单元都有大量的软件组件——通常称为嵌入式系统。

如何提高

1. N 版本编程(如 n-modules)

• 使用 n 个并行运行的程序,对每个答案进行多数投票
• 设计和编码的多样性可以掩盖许多失败。

2. 作为“交易”的软件可靠性:中止和重启

• 将程序编写为具有一致性检查的 ACID 状态转换。 如果未满足一致性检查(故障),则中止事务并重新启动
• 重新启动后恢复最近一致的系统状态

• Bohrbugs(在物理学家 Niels Bohr 之后)——这些是确定性错误——这些相对容易处理
• Heisenbugs(以物理学家 Werner Heisenberg 命名)——暂时性(非确定性)软件错误,偶尔出现,这些错误通常与负载条件和时间有关。

缺点:
• 在没有适当恢复(修复)的情况下重新启动应用程序会使系统变得非常不可靠。
• 即使是事务处理系统也不能容忍问题说明中的错误

3. 进程配对

主进程完成所有工作,直到它失败。 第二个进程(备份)接管主进程并继续。
主要需要定期告诉它它是活着的,并将其状态传输到辅助进程。

三种不同的接管方式

a.检查点重启:主存储模块在第二个存储模块上记录其状态。 在接管时,辅助节点开始从存储读取主节点的状态并恢复应用程序。

b.检查点消息:主节点将其状态更改作为消息发送到备份。 在接管时,备份从最近的检查点消息中获取其当前状态。

c.持久:备份在空状态下重新启动,并让事务机制清理所有未提交的事务。 这是大多数数据库系统采用的方法。

通讯可靠性

可靠消息传输

总结

提高系统的可靠性

  • 提高硬件可靠性,即 CPU、内存和存储单元。 这可以通过使用大量冗余来完成
  • 可以通过采用进程配对或基于事务的恢复来提高软件可靠性。
  • 通信系统的可靠性不仅需要硬件冗余,还需要使用稳定的存储和确认来保证消息的传输和接收

以上是关于第二篇:故障容忍的主要内容,如果未能解决你的问题,请参考以下文章

从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)

Kubernetes——污点容忍故障排除

项目案例第二篇中小型公司优化性能安全篇

第4天 二篇MHA故障切换

互联网面试必杀:如何保证消息中间件全链路数据100%不丢失:第二篇