介绍

独立磁盘冗余阵列(Redundant Arrays of Independent Disks, RAID)是存储业界为保证数据可用性、可靠性和完整性所采用的重要技术,即使在分布式多副本如此流行和普遍的今天,许多分布式单节点依然会采用 RAID 技术来提升系统可靠性。

本文将关注在单个节点内,或者集中式存储设备中,采用双盘冗余 RAID 技术的系统可靠性模型。

背景

所谓双盘冗余,存在 2 种方式: RIAD1 3-way mirror 和 RAID6,即 3 副本存储和双校验盘(P+Q)存储,此两种技术都能够保证,在 2 块盘或者同一数据条带中 2 个硬盘位置出错,数据无法读出或者校验出错的情况下,系统能够保证读写依然正常进行和操作结果的正确性。

那么,在实际应用中,如果确定使用双盘冗余,如何选择 RAID1 或者 RAID6 呢?如果采用 RAID1 3-way mirror 类型(3 副本)来存储数据,数据的性能和单磁盘读写性能相当(单节点,无网络延迟和开销,副本映射开销忽略不计),但是,系统的空间利用率只有原来的 1/3,这对于大多数拥有海量数据的客户来讲,成本是不可承受之重。而采用 RAID6 类型来存储数据,在达到和 3 副本相同的数据安全性的前提下,空间利用率能够达到 2/3,4/5 甚至更高(这依赖于系统使用 RAID6 所采用的的宽度,如 4 data + P + Q 利用率为 2/3,8 data + P + Q 利用率为 4/5)。当然,RAID6 提升空间利用率付出的代价就是性能相比 3 副本有所下降,下降的原因是每个数据条带中冗余盘的数据需要通过特定算法计算得出(如 LDPC, Reed-Solomon ),然后再进行存储。在Intel 开源库 ISA-L 中,RIAD6 P 盘是同条带的所有数据盘执行 XOR 运算,Q 盘则是采用 Reed-Solomon 算法。如果不使用硬件加速器进行计算卸载,相对 3 副本存储来讲,RAID6 存储就要占用 CPU 计算资源执行算法计算,这或多或少会影响系统的性能。

RAID1 3-way mirror 和 RAID6 各有利弊,适用于不同的应用场景和数据类型。在实际的商用存储设备中,同一存储系统中大体可以分为 2 种数据类型:元数据和用户数据。元数据主要是为了保证用户数据的快速索引和安全性而存储的额外数据,存在数据量小、性能要求高、要求出错率极低等特点。因此,RAID1 3-way mirror 和 RAID6 混合使用同一物理空间分别存储元数据和用户数据,是包括 Dell EMC,NetApp 等一线存储厂商产品中采用的通用方案。

在商用的存储系统中,除了存在冗余盘来保证数据安全性和提升系统可靠性外,还有热备技术保证系统的自恢复能力,即在无人为干预的情况下,如果有硬盘损坏或下线,能够自动重建数据,让系统尽快恢复到正常状态,提升后续抗风险能力。当然,热备技术需要预留额外空间,以便恢复丢失的数据。这里就存在一个问题:如何平衡数据重建和正常读写的工作负载呢?系统工作负载不重的情况下,数据重建能够很快做完;但是在工作负载很重的情况下,务必基于系统允诺的可靠性前提下,在有限时间内,保证数据重建完成。

基于以上应用场景和系统可靠性要求(如 99.999%,99.9999%),建立双盘冗余的 RAID6 可靠性模型如下。

建模

业界通常使用指数分布来建立硬盘的失败概率模型,其概率密度函数和累积分布函数如下:

\[f(t) = \lambda e^{-\lambda t}, t > 0
\\
F(t)= 1 - e{-\lambda t}, t > 0
\]

其中,$ \lambda $ 是 $ MTTF $ 的函数, $ \lambda = \frac{1}{MTTF} $.

一般的企业级 SSD 给出的 $ MTTF $ 都是 $ 2,000,000 $ 小时,因此,$ \lambda = 5 \times 10^{-7} $。

集中式存储系统或者单节点内,硬盘数量是有限的,单个或两块硬盘故障不会扩展到其他节点,该相对独立的环境称为错误域(fault domain)。在本模型中,基于当前市场上常见的存储设备,做如下设定:错误域内硬盘数量 $ N $ 最多 32 块,每块硬盘最大容量 $ Cap $ 为 32 TiB,每块硬盘的利用率 $ ratio $ 达到 80%。假定,硬盘之间相互独立,失败互不影响。

一年内 ($ T=24 \times 365 \ hours $),硬盘失败的概率 $ AFR = F(T) = 4.37 \times 10^{-3} $。因此,错误域内,一年内单块硬盘失败的概率为

\[P_1=P(1\ disk\ failure\ in\ a\ year)
= {N \choose 1} \times AFR^{1} \times (1-AFR)^{N - 1} = 0.1221
\]

当存在硬盘下线,数据丢失,系统启动数据热备和重建过程,重建过程中如果继续有硬盘故障,那么就存在数据丢失可能。对于本文基于 RAID1 3-way mirror 和 RAID6 建立的可靠性模型来讲,系统允许在重建过程中再有一块硬盘故障,总数超过 2 块,则数据丢失无法恢复。因此,数据恢复的时间,决定了数据的恢复速度和系统的可靠性。一般来讲,企业要求 24 小时必须完成系统恢复,假定 $ T_R=4\ hours $。

在 $ T_R $ 时间内,硬盘失败的概率

\[P_R=P(1\ disk\ failure\ in\ recovery\ time)
=F(T_R)=F(4)=2 \times 10^{-6}
\]

那么,在数据重建期间第 2 块盘失败的概率为

\[P_2=P(2nd\ disk\ failure\ in\ recovery\ time)={N-1 \choose 1} \times P_R \times (1-P_R)^{N-2}=6.1996 \times 10^{-5}
\]

数据重建期间第 3 块盘失败的概率为

\[P_3=P{3rd\ disk\ failure\ in\ recovery\ time}={N-2 \choose 1} \times P_R \times (1-P_R)^{N-3}=5.9996 \times 10^{-5}
\]

因此,数据丢失的概率为 $ P=P_1 \times P_2 \times P_3=4.54 \times 10^{-10} $,即如果能够在 $ T_R $ 小时内恢复丢失的最多 32TiB 数据,系统就能保证 9 个 9 的可靠性。

根据以上模型,下表给出在不同的重建时间下的系统可靠性数据:

Probability $ T_R=4\ hours $ $ T_R=8\ hours $ $ T_R=12\ hours $ $ T_R=24\ hours $
$ P_1 $ 1.2210E-01 1.2210E-01 1.2210E-01 1.2210E-01
$ P_2 $ 6.1996E-05 1.2398E-04 1.8597E-04 3.7186E-04
$ P_3 $ 5.9996E-05 1.1999E-04 1.7997E-04 3.5987E-04
$ P $ 4.5415E-10 1.8164E-09 4.0863E-09 1.6339E-08

总结

本文只关注硬盘失败导致系统数据丢失的概率模型,并且是基于一些理想化的假设,如一块硬盘损坏不会对其他硬盘有任何影响。在实际的系统中,系统可靠性的影响因素非常多,单单就是硬盘生命周期,就不能使用简单的指数分布来表示。但是,数据的重建和恢复,如果建立在极其复杂的模型之上,对于系统开发者是一个不小的挑战,可能给调优和运维也带来一些挑战,而且带来的受益可能也并不大,因为系统中其他问题带来的不稳定性可能远远超过硬盘问题。因此,本模型虽然简单,在实际开发中,还是具备参考意义的。

单节点 RAID6 可靠性模型的更多相关文章

  1. Vertica集群单节点宕机恢复方法

    Vertica集群单节点宕机恢复方法 第一种方法: 直接通过admintools -> 5 Restart Vertica on Host 第二种方法: 若第一种方法无法恢复,则清空宕机节点的c ...

  2. Hbase入门教程--单节点伪分布式模式的安装与使用

    Hbase入门简介 HBase是一个分布式的.面向列的开源数据库,该技术来源于 FayChang 所撰写的Google论文"Bigtable:一个结构化数据的分布式存储系统".就像 ...

  3. 基于英特尔® 至强 E5 系列处理器的单节点 Caffe 评分和训练

    原文链接 在互联网搜索引擎和医疗成像等诸多领域,深度神经网络 (DNN) 应用的重要性正在不断提升. Pradeep Dubey 在其博文中概述了英特尔® 架构机器学习愿景. 英特尔正在实现 Prad ...

  4. 单节点部署Hadoop教程

    搭建HDFS 增加主机名 我这里仅仅增加了master主机名 [root@10 /xinghl/hadoop/bin]$ cat /etc/hosts 127.0.0.1 localhost 10.0 ...

  5. js 节点 document html css 表单节点操作

    js 节点 document html css 表单节点操作 节点操作:访问.属性.创建 (1)节点的访问:firstChild.lastChild.childNodes.parentChild(父子 ...

  6. Hadoop 2.6.4单节点集群配置

    1.安装配置步骤 # wget http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm # rpm -i ...

  7. 单节点nginx为两台apache服务器提供负载均衡

    需求:本实验为单节点nginx为两台apache服务器提供负载均衡,所有配置为最简单 1.初始化3台测试server,该关的关了 [root@host101 ~]# vim /etc/hosts 19 ...

  8. Hadoop介绍及最新稳定版Hadoop 2.4.1下载地址及单节点安装

     Hadoop介绍 Hadoop是一个能对大量数据进行分布式处理的软件框架.其基本的组成包括hdfs分布式文件系统和可以运行在hdfs文件系统上的MapReduce编程模型,以及基于hdfs和MapR ...

  9. Openstack Grizzily 单节点测试机安装( All In One CentOS/RHEL)

    Openstack Grizzily版本已经相当完善,根据官方文档安装基本不存在什么问题,但是想快速测试了解Openstack功能的用户非常多,devstack的安 装需要check最新的代码,时常碰 ...

  10. 恒天云单节点部署指南--OpenStack H版本虚拟机单节点部署解决方案

    本帖是openstack单节点在虚拟机上部署的实践.想要玩玩和学习openstack的小伙伴都看过来,尤其是那些部署openstack失败的小伙伴.本帖可以让你先领略一下openstack的魅力.本I ...

随机推荐

  1. 工欲善其事必先利其器--CMake牛刀小试

    这里假设用户已经安装好MinGW编译套件!并配置好环境变量!具体怎么下载和配置网上教程非常多,这里贴上一个链接:不仅教你安装MinGW还教你安装VScode配置 1.学习c plus plus编码为什 ...

  2. AcWing 1209. 带分数

    题目描述: 分析: 题意就是说给定一个整数N,求给定a,b,c,求a+b/c==N且a,b,c恰好包括0-9的答案的个数,需要注意的是,b/c可能得到的是小数,所以要尽量避免除法,将等式转换为乘法格式 ...

  3. django 如何提升性能(高并发)

    django 如何提升性能(高并发) 对一个后端开发程序员来说,提升性能指标主要有两个一个是并发数,另一个是响应时间网站性能的优化一般包括 web 前端性能优化,应用服务器性能优化,存储服务器优化. ...

  4. Pandas 加载数据的方法和技巧

    哈喽大家好,我是咸鱼 相信小伙伴们在学习 python 数据分析的过程中或多或少都会听说或者使用过 pandas pandas 是 python 的一个拓展库,常用于数据分析 今天咸鱼将介绍几个关于 ...

  5. 解读与用户一起“跳动”的开源实时监控工具 HertzBeat

    摘要:开源项目遇上华为云,会擦出怎样的火花? 在本期<开源实时监控工具HertzBeat如何与用户一起"跳动?>的主题直播中,HertzBeat & TanCloud 创 ...

  6. Application of Permutation and Combination

    Reference https://www.shuxuele.com/combinatorics/combinations-permutations.html Online Tool https:// ...

  7. 一分钟学一个 Linux 命令 - cat 和 tail

    前言 大家好,我是 god23bin.今天我给大家带来的是 Linux 命令系列,每天只需一分钟,记住一个 Linux 命令不成问题.今天,需要你花费两分钟时间,因为我们要介绍的是两个常用的查看文件内 ...

  8. 【python基础】类-继承

    编写类时,并非总是要从空白开始.如果要编写的类时另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法 原有的类称为父类,而新类被称为子类.子类继承了其父类的所 ...

  9. 3. Servlet原理

    Servlet 是 Java Web 应用程序中的重要组件之一,它是一个 Java 类,用于处理客户端 HTTP 请求和生成 HTTP 响应.Servlet 的原理如下: 服务器启动时,Servlet ...

  10. IcedID恶意文档钓鱼手法剖析

    析 利用oletools静态分析,提取宏代码,如图: Function contents() With ActiveDocument.Content.Find loveDoor = .Execute( ...