说到数据库,就会想到经典的关系型数据库系统中的ACID
概念,ACID 分别代表了原子性,一致性,独立性和持久性。其中的持久性在数据库中具体是如何实现的呢?我想大概可以从两方面来讲:
- 其一是硬件,主要指存储介质层面。数据的持久性依赖于非易失性存储,常见的非易失性存储介质有磁盘和闪存。目前因为磁盘价格更低,同时速度尚可接受,所以在实际生产中更为常见。
- 其二是软件,主要指对非易失性介质的使用方法和组织方式。比如对数据写入,数据同步,数据恢复,数据校验等具体任务执行方法的设计。
1. 硬件部分
现代计算机的存储介质有多种组成部分,包括高速缓存,主存和硬盘。目前来看,高速缓存和主存具有相比硬盘更高的读写速度,但数据会在断电后丢失,无法满足持久性存储数据的要求。因此,目前计算设备中用于持久化存储的物理介质主要为硬盘,硬盘中又包括机械硬盘(磁盘)和固态硬盘。二者内部结构上存在较大不同。在下图中,左侧为机械硬盘的内部结构俯视图,右侧为固态硬盘的内部结构俯视图。
1.1 机械硬盘
综合考虑成本和性能,辅助存储器几乎都是在机械硬盘这一硬件基础上构建的。
1.1.1 磁盘的结构
一个磁盘驱动器主要包括两部分组件[1]:
- 磁盘组合:由一个或多个圆盘组成,它们围绕着一根中心主轴旋转。圆盘的上下表面覆盖了一层磁性材料,二进制位存储在这些磁性材料中。
- 磁头组合:每个圆盘面有一个磁头,它极贴近地悬浮在磁盘面上,但绝不接触。磁头可以读出经过它下面的盘面的磁方向(读数据),也能改变磁方向(写数据)。每个磁头被固定在一个磁头臂上,所有盘面的磁头随着磁头臂一同移动。
1.1.2 工作原理
写入内容时,记录介质在磁头下方匀速通过,根据运行情况对写入线圈输入一定方向和大小的电流,使磁头导磁体磁化,产生一定方向和强度的磁场。由于磁头与磁表面间距非常小,磁力线直接穿透磁层表面,将对应磁头下方的微小区域磁化(称为磁化单元),可以根据写入驱动电流的不同方向,使磁层表面被磁化的极性方向不同,以区别记录0或1[2]。
1.1.3 磁盘常见故障
一般情况下,磁盘发生的故障主要为以下几种:
- 最普通的故障类型——间断性故障:读/写一个扇区的某次尝试没有成功,但重试后,又能成功读写;
- 介质损坏:一个或多个二进制位永久损坏,重复读写无法解决;
- 写故障:写扇区的过程中出现异常,例如写扇区的过程中,磁盘突然断电;
- 磁盘崩溃:整个磁盘突然变为永久不可读。
1.2 固态硬盘
1.2.1 固态硬盘结构
固态硬盘主要包括三个主要部件,主控 + 闪存 + 固件(存储算法程序代码)。其中闪存负责存储,主控和固件协作完成数据的管理功能。基于闪存的固态硬盘,主要由控制芯片、缓存芯片、闪存芯片构成。FLASH 的最小存储单元是晶浮栅晶体管,根据注入电子的多少,表现为0/1两种状态;
1.2.2 工作原理
SSD 主控通过若干个通道并行操作多块FLASH颗粒,直接通过映射表(host page -> physical page)访问所需数据,没有寻道时间。
1.3 存储介质特性比较
比较维度 | 机械硬盘 | 固态硬盘 |
---|---|---|
组成 | 磁头组合、磁盘组合 | 控制单元、存储单元(闪存/DRAM) |
工作原理 | 控制磁头和盘片转动,机械式地读取盘片数据 | SSD 主控通过若干个通道并行操作多块FLASH颗粒,直接通过映射表(host page -> physical page)访问所需数据,没有机械寻道时间。 |
读写性能 | 100MB/s 以上(2019年) | 500MB/s 以上(2019年) |
可靠性 | 写入次数没有限制;震动容易造成损坏;可参考 backblaze 的平均年故障率自行评价; | 防震抗摔;擦写次数限制,大约为3000次。 |
常见故障 | 软件问题,扇区损坏、磁头损坏等等 | 单元颗粒损坏 |
作为持久性存储介质的评价 | 更能适应数据的频繁更改;数据删除后可恢复,同时容易导致意外的信息泄露。 | 更省电;数据误删除后,难以恢复;读写效率更高;数据不易丢失;适合读多写少的场景;不适合频繁更新状态的场景 |
无论是机械硬盘还是固态硬盘,都有最小的数据存储和读写单位。对于机械硬盘来说,扇区是最小单位;对于固态硬盘来说,页是最小单位。另外可参考一些云服务厂商的产品文档,对目前商用存储介质做更多了解:腾讯云-存储介质比较
1.4 数据在硬盘上的组织方法
数据库中的数据需要存储在硬盘上。通常用一个记录来表示一个数据元素,在硬盘块中连续存放。通常来讲,通过将表示数据元素的记录放在一个或多个硬盘中来表示关系数据集。
1.4.1 定长记录
定长记录由定长字段组成,元组每个属性对应一个字段。记录以记录的首部开始,存储一些必要信息:
- 指向记录模式的指针;
- 记录长度
- 时间戳,用来标识记录的创建时间。
多个记录存储在数据块中,每一个数据块可以包含一个块首部,以及若干条记录。
1.4.2 块和记录地址的表示
内存中的块地址式其第一个字节的虚拟内存地址。
在二级存储器中,块的地址描述了块在 DBMS 可访问的整个数据系统中的地址(物理地址):磁盘设备 ID,柱面号等等。同时,每一个块或记录有一个逻辑地址,存储在磁盘上某个指定位置的映射表中。映射表的存在提高了数据块和记录组织方式的灵活性。
2. 软件部分
在已有的硬件基础上,如何用软件更好地解决数据的持久存储问题呢?
2.1 硬盘故障应对方案
- 故障检查:校验和;
- 稳定存储:组织硬盘,使得介质损坏或写故障不会导致数据永久性丢失;
- RAID:从崩溃中恢复
2.2 校验和
校验和能帮忙在读数据时检测出介质故障。
在每个扇区增加若干附加位,存储校验和。如果校验和错误,该扇区存在读错误;如果校验和正确,该扇区概率上出错的可能很小。常见的校验和设计方法有“奇偶校验法”等。
2.3 稳定存储
稳定存储,帮助纠正错误。一般思想是:成对设计扇区,向两个扇区写入数据,确保扇区成对存在,扇区存在好和坏两种状态,在某块扇区存在问题时,利用镜像扇区恢复数据。但稳定存储仍无法应对成对的两个扇区同时损坏的问题。
2.4 独立磁盘冗余阵列 RAID
RAID(Redundant Array of Independent Disks) 是一项应对磁盘故障的成熟技术,通常称为磁盘阵列。基本思想是将多个磁盘进行有机组合,从而以较低的成本获得更大的容量,更高的性能、可靠性。RAID 的两个关键目标是提高数据可靠性和 I/O 性能。磁盘阵列中,数据分散在多个磁盘中,然而对于计算机系统来说,就像一个单独的磁盘。当其中一个或有限多个磁盘发生故障时,RAID会自动根据剩余磁盘中的数据和校验信息恢复丢失数据,保证数据一致性和完整性[4]。
3. 个人看法
在为数据库选择持久存储介质时,可靠性和价格都是需要重点考虑的因素,在访问远程数据库时,数据库服务器本身的硬盘吞吐可能并不是系统瓶颈,更有可能是网络I/O限制整个系统的通信效率。展望未来,非易失性随机访问存储设备(NVRAM)的发展可能对上述存储介质带来冲击,这是存储技术的发展趋势。
参考资料
[1] 数据库系统实现(第二版).Hector Garcia-Molina, Jeffrey D.Ullman, Jennifer Widom, 北京:机械工业出版社,2015.
[2] 简单介绍磁盘结构及工作原理,https://blog.csdn.net/qq_32740675/article/details/80955547,最后访问时间 2019-11-27
[3] SSD固态硬盘的结构和基本工作原理概述,https://blog.csdn.net/lyon_yong/article/details/79178794, 最后访问时间 2019-11-27
[4] RAID 技术全解, https://www.hack520.com/169.html, 最后访问时间 2019/11/19