目录
1、提高磁盘I/O速度的途径
(1)磁盘高速缓存(Disk Cache)
1.1 - 数据交付(Data Delivery)方式
1.2 - 置换算法
1.3 - 周期性地写回磁盘
(2)提高磁盘I/O速度的其它方法
2.1 - 提前读
2.2 - 延迟写
2.3 - 优化物理块的分布
2.4 - 虚拟盘
(3)廉价磁盘元余阵列(RAID)
2、提高磁盘可靠性的技术
(1)第一级容错技术 SFT-I
1.1 - 双份目录和双份文件分配表
1.2 - 热修复重定向和写后读校验
(2)第二级容错技术 SFT-II
2.1 - 磁盘镜像(Disk Mirroring)
2.2 - 磁盘双工(Disk Duplexing)
(3)基于集群技术的容错功能
3.1 - 双机热备份模式
3.2 - 双机互为备份模式
3.3 - 公用磁盘模式
(4)后备系统
3、数据一致性控制
(1)事务
1.1 - 事务的定义
1.2 - 事务记录(Transaction Record)
1.3 - 恢复算法
(2)检查点
(3)并发控制
(4)重复数据的数据一致性问题
1、提高磁盘I/O速度的途径
文件系统的性能可表现在多个方面,其中至关重要的一个方面是对文件的访问速度为了提高对文件的访问速度,可从三方面着手:
- 改进文件的目录结构以及检索目录的方法来减少对目录的查找时间。
- 选取好的文件存储结构,以提高对文件的访问速度。
- 提高磁盘的 I/O 速度,能将文件中的数据快速地从磁盘传送到内存中。
目前,磁盘的 I/O 速度远低于对内存的访问速度,通常要低上 4 ~ 6 个数量级。因此磁盘的 I/O 已成为计算机系统的瓶颈。
(1)磁盘高速缓存(Disk Cache)
磁盘高速缓存,是指在内存中为磁盘盘块设置的一个缓冲区,在缓冲区中保存了某些盘块的副本。
在设计磁盘高速缓存时需要考虑的问题有:
- 如何将磁盘高速缓存中的数据传送给请求进程。//数据交付
- 采用什么样的置换策略。
- 已修的盘块数据在何时被写回磁盘。
1.1 - 数据交付(Data Delivery)方式
所谓的数据交付就是指将磁盘高速缓存中的数据传送给请求者进程。系统可以采取两种方式将数据交付给请求进程:
- 数据交付:这是直接将高速缓存中的数据传送到请求者进程的内存工作区中。//直接给数据
- 指针交付:只将指向高速缓存中某区域的指针交付给请求者进程。
指针交付方式由于所传送的数据量少,因而节省了数据从磁盘高速缓存存储空间到进程的内存工作区的时间。
1.2 - 置换算法
常用的置换算法有最近最久未使用算法 LRU、最近未使用算法 NRU 及最少使用算法 LFU 等。
系统在设计高速缓存的置换算法时,除了考虑到最近最久未使用这一原则外,还需要考虑以下几点://LRU数据链
- 访问频率。通常,联想存储器的访问频率基本上与指令执行的频率相当。而对磁盘高速缓存的访问频率,则与磁盘 I/O 的频率相当。所以,对联想存储器的访问频率远远高于对磁盘高速缓存的访问频率。
- 可预见性。哪些数据可能在较长时间内不会再被访问,有哪些数据可能很快就再被访问,会有相当一部分是可预知的。
- 数据的一致性。存放在缓存中的数据如果已被修改,但尚未拷回磁盘,当系统发生故障后,可能造成数据的不一致性。
1.3 - 周期性地写回磁盘
根据LRU算法,有些经常要被访问的盘块数据可能会一直保留在高速缓存中,长期不会被写回磁盘。因为链中任一元素在被访问之后,又会被挂到链尾而不被写回磁盘,只有一直未被访问的元素才有可能移到链首,而被写回磁盘。//置换时,写回磁盘从链首开始
为了解决这一问题,在 UNIX 系统中专门增设了一个修改(update)程序,使之在后台运行,该程序周期性地调用一个系统调用 SYNC。其主要功能是强制性地将所有在高速缓存中已修改的盘块数据写回磁盘。一般是把两次调用 SYNC 的时间间隔定为 30s。这样,因系统故障所造成的工作损失不会超过 30s 的工作量。//定期写回,但是不能确保数据不丢失
(2)提高磁盘I/O速度的其它方法
2.1 - 提前读
如果是采用顺序访问方式对文件进行访问,便可以预知下一次要读的盘块。此时可采取预先读方式,即在读当前块的同时,还要求将下一个盘块(提前读的块)中的数据也读入缓冲区,从而大大减少了读数据的时间。
2.2 - 延迟写
延迟写是指把本应立即写回磁盘的缓冲区数据,改为将它挂在空闲缓冲区队列的末尾,直到把该缓冲区作为空闲缓冲区分配出去,才进行写回。
缓冲区数据驻留内存的好处是任何访问该数据的进程,都可直接读出其中的数据而不必访问磁盘。这样,又可进一步减少磁盘的IO时间。
2.3 - 优化物理块的分布
思想:将两个数据块安排在属于同一条磁道的两个盘块上,由于消除了磁头在磁道间的移动,而大大提高对这两个盘块的访问速度。//顺序写,减少磁头的平均移动距离。
2.4 - 虚拟盘
所谓虚拟盘就是利用内存空间去仿真磁盘,又称为 RAM 盘。
虚拟盘的主要问题是:它是易失性存储器,故一旦系统或电源发生故障,或系统再启动时,原来保存在虚拟盘中的数据将会丢失。因此,虚拟盘通常用于存放临时文件,如编译程序所产生的目标程序等。
虚拟盘与磁盘高速缓存的主要区别在于:虚拟盘中的内容完全由用户控制,而磁盘高速缓存中的内容则是由 OS 控制的。例如,RAM 盘在开始时是空的,仅当用户(程序)在 RAM 盘中创建了文件后,RAM 盘中才有内容。//了解即可
(3)廉价磁盘元余阵列(RAID)
思想:如果使用一个组件对性能的改进受到了很大的限制,那么可通过使用多个相同的组件来获得性能的大幅度提高。//如单处理机系统 -> 多处理机系统,分布式系统
廉价磁盘冗余阵列(RedundantArray of Inexpensive Disk,RAID),是由多个小磁盘组成的一个大容量的磁盘存储器。
RAID 不仅是大幅度地增加了磁盘的容量,而且也极大地提高了磁盘的 I/O 速度和整个磁盘系统的可靠性。
并行交叉存取:在一个系统中,有多台磁盘驱动器,系统将每一盘块中的数据分为若干个子盘块数据,再把每一个子盘块的数据分别存储到各个不同磁盘中的相同位置上。以后当要将一个盘块的数据传送到内存时,采取并行传输方式,将各个盘块中的子盘块数据同时向内存中传输,从而使传输时间大大减少。//多个磁盘并行传输
2、提高磁盘可靠性的技术
容错技术是通过在系统中设置冗余部件的办法,来提高系统可靠性的一种技术。磁盘容错技术则是通过增加冗余的磁盘驱动器、磁盘控制器等方法来提高磁盘系统可靠性的一种技术。即当磁盘系统的某部分出现缺陷或故障时,磁盘仍能正常工作,且不致造成数据的丢失或错误。//部件冗余
磁盘容错技术往往也被人们称为系统容错技术 SFT。可把它分成三个级别:第一级是低级磁盘容错技术;第二级是中级磁盘容错技术;第三级是系统容错技术,它基于集群技术实现容错。
(1)第一级容错技术 SFT-I
第一级容错技术(SFT-I)主要用于防止因磁盘表面缺陷所造成的数据丢失,它包含双份目录、双份文件分配表及写后读校验等措施。
1.1 - 双份目录和双份文件分配表
在磁盘上存放的文件目录和文件分配表 FAT,是文件管理所用的重要数据结构。为了防止这些表格被破坏,可在不同的磁盘上或在磁盘的不同区域中分别建立(双份)目录表和 FAT。其中一份为主目录及主 FAT,另一份为备份目录及备份 FAT。//文件备份
一旦由于磁盘表面缺陷而造成主文件目录或主 FAT 的损坏时,系统便自动启用备份文件目录及备份 FAT,从而可以保证磁盘上的数据仍是可访问的。
1.2 - 热修复重定向和写后读校验
由于磁盘价格昂贵,在磁盘表面有少量缺陷的情况下,则可采取某种补救措施后继续使用。一般主要采取以下两个补救措施:
- 热修复重定向,系统将磁盘容量的很小一部分(例如2%~3%)作为热修复重定向区,用于存放当发现磁盘有缺陷时的待写数据,并对写入该区的所有数据进行登记,以便于以后对数据进行访问。//分配一块专门的区域承载缺陷数据
- 写后读校验方式,为保证所有写入磁盘的数据都能写入到完好的盘块中,应该在每次向磁盘中写入一个数据块后,又立即将它读出,并送至另一缓冲区中,再将该缓冲区内容与内存缓冲区中在写后仍保留的数据进行比较,若两者一致,便认为此次写入成功。否则,再重写。若重写后两者仍不一致,则认为该盘块有缺陷,此时,便将应写入该盘块的数据写入到热修复重定向区中。//写完后,读取出来进行对比校验
(2)第二级容错技术 SFT-II
第二级容错技术主要用于防止由磁盘驱动器和磁盘控制器故障所导致的系统不能正常工作,它具体又可分为磁盘镜像与磁盘双工。
2.1 - 磁盘镜像(Disk Mirroring)
为了避免磁盘驱动器发生故障而丢失数据,便增设了磁盘镜像功能。为实现该功能,须在同一磁盘控制器下,再增设一个完全相同的磁盘驱动器。//冗余部件,磁盘驱动器
当采用磁盘镜像方式时,在每次向主磁盘写入数据后,都需要将数据再写到备份磁盘上,使两个磁盘上具有完全相同的位像图。把备份磁盘看作是主磁盘的一面镜子。当主磁盘驱动器发生故障时,由于有备份磁盘的存在,在进行切换后,使主机仍能正常工作。
磁盘镜像虽然实现了容错功能,却使磁盘的利用率降至 50%,也未能使服务器的磁盘 I/O 速度得到提高。//慎重考虑
2.2 - 磁盘双工(Disk Duplexing)
如果控制这两台磁盘驱动器的磁盘控制器发生故障,或主机到磁盘控制器之间的通道发生故障,磁盘镜像功能便起不到数据保护的作用。因此,在第二级容错技术中,又增加了磁盘双工功能,即将两台磁盘驱动器分别接到两个磁盘控制器上,同样使这两台磁盘机镜像成对。
在磁盘双工时,文件服务器同时将数据写到两个处于不同控制器下的磁盘上,使两者有完全相同的位像图。如果某个通道或控制器发生故障时,另一通道上的磁盘仍能正常工作,不会造成数据的丢失。在磁盘双工时,由于每一个磁盘都有自己的独立通道,故可同时(并行)地将数据写入磁盘或读出数据。
(3)基于集群技术的容错功能
所谓集群,是指由一组互连的自主计算机组成统一的计算机系统,给人们的感觉是,它们是一台机器。利用集群系统不仅可提高系统的并行处理能力,还可用于提高系统的可用性,它们是当前使用最广泛的一类具有容错功能的集群系统。其主要工作模式有三种:热备份模式、互为备份模式和公用磁盘模式。
3.1 - 双机热备份模式
在这种模式的系统中,备有两台服务器,两者的处理能力通常是完全相同的,一台作为主服务器,另一台作为备份服务器。平时主服务器运行,备份服务器则时刻监视着主服务器的运行,一旦主服务器出现故障,备份服务器便立即接替主服务器的工作而成为系统中的主服务器,修复后的服务器再作为备份服务器。//主从服务器
3.2 - 双机互为备份模式
在双机互为备份模式中,平时,两台服务器均为在线服务器,它们各自完成自己的任务,例如,一台作为数据库服务器,另一台作为电子邮件服务器。
在互为备份的模式中,最好在每台服务器内都配置两台硬盘,一个用于装载系统程序和应用程序,另一个用于接收由另一台服务器发来的备份数据,作为该服务器的镜像盘。在正常运行时,镜像盘对本地用户是锁死的,这样就较易于保证在镜像盘中数据的正确性。如果仅有一个硬盘,则可用建立虚拟盘的方式或分区方式来分别存放系统程序和应用程序,以及另一台服务器的备份数据。
如果通过专线链接检查到某台服务器发生了故障,此时,再通过路由器去验证这台服务器是否真的发生了故障。如果故障被证实,则由正常服务器向故障服务器的客户机发出广播信息,表明要进行切换。在切换成功后,客户机无须重新登录便可继续使用网络提供的服务,和访问服务器上的数据。而对于连接在非故障服务器上的客户机,则只会感觉到网络服务稍有减慢而已,不会有任何影响。当故障服务器修复并重新连到网上后,已被迁移到无故障服务器上的服务功能将被返回,恢复正常工作。//故障替换以及故障修复
这种模式的优点是两台服务器都可用于处理任务,因而系统效率较高,现在已将这种模式从两台机器扩大到 4 台、8 台、16 台甚至更多。系统中所有的机器都可用于处理任务,当其中一台发生故障时,系统可指定另一台机器来接替它的工作。//现代集群采用的方式
3.3 - 公用磁盘模式
为了减少信息复制的开销,可以将多台计算机连接到一台公共的磁盘系统上去。该公共磁盘被划分为若干个卷。每台计算机使用一个卷。如果某台计算机发生故障,此时系统将重新进行配置,根据某种调度策略来选择另一台替代机器,后者对发生故障的机器的卷拥有所有权,从而可接替故障计算机所承担的任务。这种模式的优点是消除了信息的复制时间,因而减少了网络和服务器的开销。
(4)后备系统
在一个完整的系统中是必须配置后备系统的。这一方面是因为磁盘系统不够大,不可能将系统在运行过程中的所有数据都装在磁盘中,应当把暂时不需要但仍然有用的数据,存放在后备系统中保存起来。另一方面是为了防止系统发生故障或病毒的感染,把系统中的数据弄错或丢失,也需要将比较重要的数据存放在后备系统中。目前常用做后备系统的设备有磁带机、磁盘机、硬盘和光盘机。//即一些持久化设备,用来对数据进行物理存储和备份
3、数据一致性控制
在实际应用中,经常会在多个文件中都含有同一个数据。所谓数据一致性问题是指,保存在多个文件中的同一数据,在任何情况下都必需能保证相同。例如,当我们发现某种商品的进价有错时,我们必须同时修改流水账,付费账、分类账及总账等一系列文件中的该商品的价格,方能保证数据的一致性。但如果在修改进行到中途时系统突然发生故障,就会造成各个账目中该数据的不一致性,进而使多个账目不一致。为了保证数据的一致性,在现代 OS 中都配置了能保证数据一致性的软件。
(1)事务
1.1 - 事务的定义
一个事务在对一批数据执行修改操作时,要么全部完成,并用修改后的数据去代替原来的数据,要么一个也不修改。事务操作所具有的这种特性,即事务的原子性(Atomic)。
作为单个程序单元执行的一系列操作,并不是都可以成为事务,也就是说,如果定义其为事务,则必须同时满足四个属性,即事务属性 ACID。除了上述的原子性外,事务还应具备的属性是:
- 一致性(Consistent),即事务在完成时,必须使所有的数据都保持一致状态
- 隔离性(Isolated),即对一个事务对数据所作的修改,必须与任何其它与之并发事务相隔离,换言之,一个事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,而不会是任何中间状态的数据
- 持久性(Durable),即事务完成之后,它对于系统的影响是永久性的。
1.2 - 事务记录(Transaction Record)
为了实现事务的原子修改,通常须借助于称为事务记录的数据结构来实现。这些数据结构被放在一个非常可靠的存储器中,用来记录在事务运行时数据项修改的全部信息,故又称为运行记录(Log)。该记录中包括有下列字段://这是一种非常普适的指导思想,很重要
- 事务名:用于标识该事务的唯一名字。
- 数据项名:它是被修改数据项的唯一名字。
- 旧值:修改前数据项的值。
- 新值:修改后数据项将具有的值。
在事务记录表中的每一记录描述了在事务运行中的重要事务操作,如修改操作、开始事务、托付事务或失败事务等。//记录事务
1.3 - 恢复算法
由于一组被事务 T 修改的数据以及它们被修改前和修改后的值都能在事务记录表中找到,因此,利用事务记录表系统能处理任何故障而不致使故障造成非易失性存储器中信息的丢失。恢复算法可利用以下两个过程://数据库的通用方式
- undo(T)。该过程把所有被事务 T 修改过的数据恢复为修改前的值。
- redo(T)。该过程能把所有被事务 T 修过的数据设置为新值。
如果系统发生故障,系统应对以前所发生的事务进行清理。通过查找事务记录表,可以把尚未清理的事务分成两类。//undo 和 redo日志
一类是其所包含的各类操作都已完成的事务。确定为这一类事务的依据是,在事务记录表中,既包含了 T(开始) 记录,又包含了 T(托付) 记录,此时系统利用 redo(T) 过程把所有已被修改的数据设置成新值。
另一类是其所包含的各个操作并未全部完成的事务。对于事务T,如果在 Log 表中只有 T(开始) 记录而无 T(托付) 记录,则此 T 便属于这类事务。此时,系统便利用 undo(T) 过程将所有已被修改的数据恢复为修改前的值。
(2)检查点
检查点(Check Points)的作用
由于在系统中可能存在着许多并发执行的事务,因而在事务记录表中就会有许多事务执行操作的记录。随着时间的推移,记录的数据也会愈来愈多。因此,一旦系统发生故障,在事务记录表中的记录清理起来就非常费时。
引入检查点的主要目的是,使对事务记录表中事务记录的清理工作经常化,即每隔一定时间便做一次下述工作:
- 首先是将驻留在易失性存储器(内存)中的当前事务记录表中的所有记录输出到稳定存储器中
- 其次是将驻留在易失性存储器中的所有已修改数据输出到稳定存储器中
- 然后是将事务记录表中的检查点记录输出到稳定存储器中
- 最后是每当出现一个(检查点)记录时,系统便执行一次恢复操作,即利用 redo 和 undo 过程实现恢复功能。
如果一个事务 T 在检查点前就做了托付(提交),则在事务记录表中便会出现一个在检查点记录前的 T(托付) 记录。在这种情况下,所有被 T 修改过的数据或者是在检查点前已写入稳定存储器,或者是作为检查点记录自身的一部分写入稳定存储器中。因此,以后在系统出现故障时,就不必再执行 redo 操作了。//提前保存已提交事务的数据
在引入检查点后,可以大大减少恢复处理的开销。因为在发生故障后,并不需要对事务记录表中的所有事务记录进行处理,而只需对最后一个检查点之后的事务记录进行处理。
因此,恢复例程首先查找事务记录表,确定在最近检查点以前开始执行的最后的事务 T。在找到这样的事务后,再返回去搜索事务记录表,便可找到第一个检查点记录,恢复例程便从该检查点开始返回搜索各个事务的记录,并利用 redo 和 undo 过程对它们进行处理。//分段处理数据
(3)并发控制
由于事务具有原子性,这使各个事务的执行必然是按某种次序依次进行的,只有在一个事务执行完后,才允许另一事务执行,即各事务对数据项的修改是互斥的。人们把这种特性称为顺序性,而把用于实现事务顺序性的技术称为并发控制。//对同一数据的事务需要互斥
数据库中常用的并发控制技术:互斥锁和共享锁。//也就是读写锁
(4)重复数据的数据一致性问题
为了保证数据的安全性,最常用的做法是把关键文件或数据结构复制多份,分别存储在不同的地方,当主文件(数据结构)失效时,还有备份文件(数据结构)可以使用,不会造成数据丢失,也不会影响系统工作。显然,主文件(数据结构)中的数据应与各备份文件中的对应数据相一致。此外,还有些数据结构(如空闲盘块表)在系统运行过程中总是不断地对它进行修改,因此,同样应保证不同处的同一数据结构中数据的一致性。//集群中最常见的问题
//对于这个问题,分布式系统有对应的方案和算法,此处不再详细描述,如有兴趣可关注后续的文章。