一、概述
Halo Storage Management系统为HALO数据库设计的专用存储模块,简称HSM。由易景数通完全独立自主研发。
1.1 设计目标和特点
高可靠,自动存储灾备,容错,故障恢复
自动负载均衡
文件级的冗余备份,提高了数据文件的可用性。针对数据库优化,减少 元数据量
条带化存储,提高性能
易运维,方便扩容和迁移
1.2 名词解释
本文档中使用的名词及其缩写和释义如表(一)所示。
表(一)名词及其缩写和释义
名词 | 缩写 | 释义 |
磁盘组 DiskGroup | DG | |
Partnership and Status Table | PST | 磁盘组中所有磁盘的相关信息-磁盘号,磁盘状态,partner的磁盘号,心跳信息和failgroup的信息 |
Disk | 磁盘 | |
DiskHead | 磁盘头 | |
chunk | 磁盘分块 | |
Allocation Unit | AU | 最基本空间分配单位 |
File | 文件 | |
Extent | 文件里的分段 | |
Allocation Table | AT | Chunk里的AU分配表 |
Free Space Table | FST | 空闲空间表 |
FailGroup | 故障组 |
二、总体架构
2.1 磁盘组
图(一)磁盘组架构图
磁盘组由 HSM 磁盘组成,可以包含一个或多个 HSM磁盘。
HSM磁盘一般为原始的磁盘设备,不需要挂载到系统中,不需要格式化为ext4或xfs等文件系统
AU(Allocation Unit)为磁盘的最小存储单元
一块HSM磁盘分为多个chunk,每个chunk包含AT(Allocation Table) 和多个AU
2.2 文件

图(二)文件
文件中包含元数据和多个extent, 每个extent包含1个或多个AU。
三、磁盘组
每个磁盘组都有自己的PST表(Partnership and Status Table), 保存在成员磁盘的AU0的第二个block。
PST表包含了一个磁盘组中所有磁盘的相关信息-磁盘设备名,磁盘状态,partner的磁盘号。
可以简单方便的添加或删除磁盘, 实现扩容或更换坏盘。
文件冗余保存成多份副本,分别在不同的磁盘上,若一个副本损坏可以从其他副本读取。三种冗余级别:KFDGTP_EXTERNAL 由外部存储负责冗余,ASM只保存一份;KFDGTP_NORMAL 常规冗余,2份副本;KFDGTP_HIGH 高冗余,3份副本。
文件条带化存储,利于多个磁盘的IO均衡。
每一个磁盘组都是独立的存储单元,每一个磁盘组都会有属于它自己的文件目录。
3.1 PST(Partnership and Status Table)
磁盘组由多块磁盘组成,互为伙伴,最多支持60块盘。
PST表包含了磁盘组名,AUSize, 冗余模式等,以及磁盘组中所有磁盘的相关信息:
diskid | uint32 | partner的磁盘编号 |
devname | Char(64) | 磁盘设备名 |
Status | Byte | 磁盘状态 |
3.2 PST备份
每个磁盘的AU0的block1是为PST表预留的,但是并不是每一个磁盘都有PST表的信息
在normal冗余的磁盘组中,至少有两份PST表。如果磁盘组中有三个或更多的failgroups,PST表将会有3份.在high冗余的磁盘组中,至少有三份PST表的信息。
3.3 冗余模式
External 由外部存储设备负责做冗余备份,HSM中为单副本
Normal 普通模式,2副本
High 高级别模式,3副本
四、磁盘
4.1 整体空间分配

HSM磁盘是以AU为单位进行格式化的。第一个AU位于HSM磁盘的起始位置,即AU0, 它始终用于存储HSM元数据。一个元数据块的大小为4K ,有块头信息和与块类型相匹配的一些相关数据,AU0的第一个块, 即block0,就是磁盘头。
每块磁盘里面分为多个chunk,每个chunk里有多个AU。因为磁盘大小不等,分配表AT保存在一个AU中,所以chunk里能包含多少AU由AT表能管理多少个AU决定。
4.2 磁盘头
每块磁盘的AU0的第一个块, 即block0,就是磁盘头。主要有以下信息:
属性 | 描述 |
Disked | HSM磁盘编号 |
hdrstatus | 磁盘头状态 |
diskname | 磁盘名 |
grpname | 磁盘组名 |
fgname | 失败组名 |
createtime | 磁盘添加到磁盘组的时间 |
mounttime | 最近一次被挂接的时间 |
fileDirPos | 文件目录1号文件,在AU0里的块位置,0 表示没有 |
blocksize | HSM元数据块的大小(bytes) |
ausize | AU的大小,默认为1M |
disksize | 磁盘大小,以AU为单位 |
chunksize | Chunk大小,以AU为单位 |
4.3 chunk
Allocation Table (AT分配表)
AT表记录每个AU的分配信息,开始于chunk的第一个AU的第二个块。由N个AT块组成。假设AU为1M,AT表为1024k,这意味着一个AT表可以用来描述1020*1024/8= 131072个AU。这个值保存在磁盘头中的Chunksize
AT表里的每一项有以下内容:
fileid | int32 | 文件号 |
extentid | uint32 | extent编号 |
Free Space Table (FST空闲空间表)
FST表用来加速AU的分配,避免重复读取AT块,造成分配空间效率的低下
FST表在内存中,用1个位表示1个AU是否时空闲。按AU为1M计算,一个chunk大概131072个AU, 需要16k内存保存FST位图
五、文件
5.1 文件目录
HSM的1号文件是HSM的文件目录,它记录了磁盘组中的所有文件信息,由于在HSM中,每一个磁盘组都是独立的存储单元,所以每一个磁盘组都会有属于它自己的文件目录。
文件目录的条目:
Fileid | Int32 | 文件编号 |
size | Int64 | 文件大小 |
extentSize | Int32 | 文件块大小 |
Type | Byte | 文件类型 |
backupType | byte | 文件的冗余级别 |
stripeType | Byte | 文件的条带配置,0:1AU, 1:128k |
createTime | Int32 | 文件创建时间戳 |
modifyTime | Int32 | 文件最后的修改时间戳 |
idirectEtent | 如果文件超过60个extent,那么会有Indirect extent 的指针 | |
前60个extent的位置指针 |
1号文件的位置:
HSM磁盘头的fileDirPos部分,可以获得HSM一号文件在AU0里的块位置, 如果磁盘头中的fileDirPos的值为0,代表这个磁盘并没有一号文件的拷贝 由于这属于HSM的元数据,因此被做了多副本备份。
5.2 空间分配
一个文件由多个extent组成。HSM文件的空间分配是以extent为单位,每一个extent是由一个或多个AU组成多副本。根据冗余级别在多块磁盘上均衡的分配AU。HSM空间分配的最小单位是AU,默认的AU size是1MB。
5.3 别名目录
HSM的6号文件是HSM的别名目录,它能够为一个磁盘组中的所有文件提供了一个有层级关系的命名系统。每个文件的系统文件名称是基于文件类型,数据库实例的类型以及被指定的相关特定信息例如表空间名称而定的,文件被创建后也可以通过指定全路径的方式再为文件创建一个alias。
六、检测
6.1 元数据校验
启动时需要对系统元数据做检测,主要包括以下内容:
1)检查磁盘的一致性 ,PST, 磁盘头,副本一致性
2)检查文件目录extent表和AT表之间的一致性
3)检查alias元信息目录和文件目录之间对应关系的正确性
4)检查alias目录树的正确性
5)检查HSM元信息目录是否有不可访问的块
6.2 磁盘静默错误
磁盘出现异常的情形可能包括硬件错误、固件 BUG 或者软件 BUG、供电问题、介质损坏等,常规的这些问题都能够正常被捕获抛出异常。还有些类型的存储错误在一些存储系统中完全未报告和未检测到。它们会导致向应用程序提供损坏的数据,而不会发出警告、记录、错误消息或任何类型的通知。数据处理都是正常的,写入成功,读取的时候才发现数据已经损坏,这就是静默错误,一般静默错误产生原因有这几种:
1)硬件故障或质量问题
2)传输过程信噪干扰
3)软件bug
4)固件bug
静默错误的应对方案为定期检查数据,比对,修复,即Scrub操作。但Scrub的频率不能太高,读取数据量太大会严重影响性能,降低磁盘寿命,引发更多的问题。Scrub的频率做成可配置,并且可手动关闭Scrub。
七、故障恢复
7.1 磁盘故障
一个磁盘不可用时会先被offline,此时disk repair计时器开始介入,如果计时器达到磁盘组DISK_REPAIR_TIME(默认12h) 属性值时,这个磁盘会从所属的磁盘组中drop掉。如果这个磁盘在计时器过期前恢复可用,那么它的状态会变回online,不会被drop。
当一个磁盘被drop,整个磁盘组需要为此进行rebalance,整个过程需要耗费大量的时间。在此期间,其他磁盘也可能会发生故障,使得数据丢失的风险大大增加
在磁盘处于offline的这段时间里,HSM持续跟踪需要在offline磁盘上做的修改操作。如果磁盘在计时器到达阈值前恢复可用并且恢复到online状态,那么HSM会将这些修改操作应用到磁盘上去。
磁盘损坏处理:
如果在DISK_REPAIR_TIME时间内,管理员确定磁盘损坏,并更换新盘,系统启动空间回收及重平衡,根据文件目录表,逐个文件处理。
如果超过DISK_REPAIR_TIME时间,无管理员介入,则自动到其他正常使用的磁盘上申请新的空间,补充副本。
7.2 坏块
企业级磁盘一般质保期为三年,随着使用年数增加,磁盘故障率升高。磁盘smart信息中也能发现一些磁盘损块的数据。当读写到磁盘坏块时,会报磁盘永久性错误,HSM会自动分配新的AU,复制数据到新的AU,同时将已损坏的块标记为坏块,不再使用。
若磁盘多次出现坏块的情况,就要考虑更换磁盘。HSM更换磁盘的操作比较简单,不用停系统。
八、重平衡
8.1 何时需要重平衡
1)添加、删除磁盘
2)HSM磁盘组的磁盘上空间分布不均匀
3)负载不均衡
4)移动一个文件从磁盘的hot区到cold区
8.2 重平衡步骤
重平衡是以文件为基本操作单位的,主要由以下步骤:
1.rebalance plan,HSM会计算出重平衡的计划。选出负载重和剩余空间小的磁盘上的extent, 移动到负载轻和剩余空间大的磁盘。
2.更新COD(Continuing Operations Directory), 当重平衡失败时,恢复后将根据COD启动重平衡
3.extent relocating, HSM会在磁盘组中的磁盘间移动文件,这个过程会花费大部分的时间.




