第二篇:故障容忍
Posted flying_1314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二篇:故障容忍相关的知识,希望对你有一定的参考价值。
目录
另一种容错技术(Old master - new master)
故障容忍
使系统能够在其某些组件发生故障时继续正常运行的属性。
从统计的角度出发
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 大幅增加(二次增加——即 !)
只要 1 个磁盘正常工作就继续运行
RAID 2(位级条带化)
• 条带化发生在位级
• 提供更高的传输速率(单盘的两倍)
• MTTF 与 RAID 0 一样减少了一半
• 很少用到
b 表示位(bit)
RAID 3(字节级条带化)
B0, B1, B2, B3, .. 是文件的数据字节
• 条带化发生在字节级别
• 很少用到
• 提供与 RAID 0 相同的更高传输速率
• P0 是字节 B0 和 B1 的奇偶校验
• 是异或符号
MTTF大幅增加(RAID1的1/3 = /3),因为可以从其他2个磁盘的数据中恢复1个磁盘故障
•B 表示字节
• P 是奇偶校验
• MTTF = 平均无故障时间
• 奇偶校验(或校验位)用于错误检测
RAID 4(块级条带化)
• 条带化发生在块级别
• 用于奇偶校验块的专用磁盘
• 提供更高的吞吐量但写入速度非常慢。 Disk3 有更多的写入,因为每次写入数据都需要更新奇偶校验。
• MTTF 大幅增加(与 RAID3 相同)
•是异或符号
•A 表示块(4K 或 8K 字节的存储空间)
•P 是奇偶校验
具有 3 个磁盘的 RAID 5(块级条带化)
• A0、A1、A2、A3、.. 是文件的连续数据块
• 条带化发生在块级别
• 奇偶校验块也是条带化的
• 提供更高的吞吐量,但写入速度较慢,但优于 RAID 4,因为奇偶校验位分布在所有磁盘中,并且所有 3 个磁盘之间的平均写入操作数相等。
• MTTF 大幅增加(与 RAID3 相同)
•是异或符号
•A 表示块(4K 或 8K 字节的存储空间)
•P 是奇偶校验
RAID 6(块级条带化)
•A 表示块(4K 或 8K 字节的存储空间)
•P 是奇偶校验
• 除了使用两个奇偶校验块外,与 RAID 5 类似。
• 可靠性是 /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) 个模块不可用的概率,
特定第 i 个模块失败的概率,
系统因特定第 i 个模块最后失败而失败的概率 =
当其他 (n-1) 个模块不可用时,由于 n 个模块中的任何一个最后失败而导致超级模块失败的概率 =
另一种容错技术(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 第二篇(配置故障转移集群)