YashanDB 文件系统
本文内容来自 YashanDB 官网,原文内容请见 https://doc.yashandb.com/yashandb/23.3/zh/%E6%A6%82%E5%BF%B5%E6%89%8B%E5%86%8C/%E5%85%B1%E4%BA%AB%E9%9B%86%E7%BE%A4%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD/%E5%B4%96%E5%B1%B1%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F.html
崖山文件系统 YFS 是 YashanDB 的专用并行文件系统,提供存储设备管理、存储高可用、文件系统接口等功能。
共享集群中每一个服务器上运行的一组 YFS 相关线程称为一个 YFS 实例,YFS 实例与 YCS 实例运行在同一进程(YCS 进程)中。生产环境下,通常每台服务器只会运行一个 YFS 实例。

数据库服务端核心进程 YASDB 是 YFS 实例的客户端(Client),只与同服务器的 YFS 实例通信。YASDB 进程通过 Unix Domain Socket 向 YFS 实例发起元数据变更请求,YFS 实例更新共享内存中的元数据缓存,并将元数据变更持久化到共享存储。YASDB 进程读取共享内存中的元数据,直接对磁盘进行读写,无需通过 YFS 实例,IO 性能接近直接读写裸设备。
YFS 实例管理全局存储元数据,通过事务保证操作的原子性,各 YFS 服务之间通过网络同步元数据,通过一致性协议保证全局一致性,确保 YFS 各实例看到的文件状态没有差别。
磁盘管理
YFS 具备磁盘管理能力,将磁盘裸设备(disk)划分为磁盘组、故障组等逻辑概念,以层级结构管理。

# 磁盘组(DiskGroup)
磁盘组(DiskGroup)是 YFS 管理磁盘设备的最顶层逻辑单元,一个 DiskGroup 应该至少包含 1 个 FailureGroup。
YFS 中可能存在多个 DiskGroup,各 DiskGroup 分别管理一些 disk,各 DiskGroup 之间资源隔离、故障隔离。
不同 DiskGroup 可以执行差异化存储管理,指定不同规格,例如为不同 DiskGroup 配置不同的副本数。
每个 DiskGroup 的属性在创建时指定,一旦创建不可更改。DiskGroup 的主要属性包括冗余度(Redundancy Level,也叫冗余级别)和分配单元大小(AU size)。
# 故障组(FailureGroup)
YFS 将有可能同时故障的 disk 划分为故障组 FailureGroup,配合“多副本”实现数据(包括元数据以及文件数据)冗余,支持存储高可用。
每个 FailureGroup 包含一个或多个 disk,它们可能是:
同一磁阵中一些 LUN
同一机柜的磁盘
同一电源供电的多个存储设备
同一机房的多个存储设备
FailureGroup 没有绝对的划分标准,而是在特定的运维条件下根据各 disk 故障概率的相关性,将它们进行适当分组,确保不同的 FailureGroup(大概率)不会同时故障。
# 磁盘设备(Disk)
YFS 的所有数据都按指定策略保存在 disk 上,包括 YFS 自身的元数据、YFS 文件以及目录的元数据、用户数据等。
一个最小可用的 YFS 需要以下两个 disk:
1 个 BOOT_DISK:用于存储 YFS 自身元数据,建议容量 500MB 以上。YFS 依赖该 disk 完成启动和初始化,用户可在 YFS 配置中指定该磁盘。
1 个用户数据 disk:即 YFS 的数据盘,可以配置多个数据盘,用于保存用户数据,需在创建磁盘组时指定。
YFS 仅支持 Direct IO 模式读写,加入 YFS 的磁盘至少应支持块大小 512B - 64MB 的 DIO 模式读写。同一个磁盘不能在 YFS 中复用,可能丢失数据。
# 存储高可用
在创建 DiskGroup 时,可以通过指定冗余度配置该 DiskGroup 的副本数。数据副本会保存在不同的 FailureGroup 中,只要至少一个副本完整,数据便可用。
不同 FailureGroup 下的 disk 之间故障是独立事件,同时故障的概率极低,因此数据损坏的概率极低,保证了数据高可用。
# 多副本
副本数指数据保存的份数,例如 1 副本表示 YFS 中只存在 1 份数据,3 副本表示 YFS 中存在 3 份相同的数据。
副本数具体可分为用户数据副本数和 YFS 元数据副本数。在 FailureGroup 数大于数据副本数时,系统会自动为元数据创建更多副本,进一步加强 YFS 的可靠性。
使用多副本保护数据的前提是正确规划 FailureGroup,确保数据副本之间故障概率独立:
所有副本应分布在不同的 FailureGroup,因此需满足
FailureGroup个数 >= 用户数据副本数
。各冗余级别下 YFS 元数据副本数是推荐值,如果 FailureGroup 数量小于元数据副本数要求,元数据副本数将被调整为与 FailureGroup 数量相同的值。
YFS 会妥善安排各副本数据的保存位置,保证各副本保存在不同 FailureGroup 的不同 disk。
Note:
YFS 中数据的多副本不能跨越 DiskGroup,因为各 DiskGroup 的资源是完全隔离的。
# 冗余度(Redundancy)
YFS 支持 3 种冗余级别:
EXTERNAL:该级别表示无数据冗余,用户数据副本数为 1,YFS 元数据副本数为 1。配置本级别的情况下,数据的可靠性依赖外部能力实现,例如 RAID。
NORMAL:一般级别的数据冗余,用户数据副本数为 2,YFS 元数据副本最小为 2,最大为 3。
HIGH:高级别的数据冗余,用户数据副本数为 3,YFS 元数据副本数最小为 3,最大为 5。
# 分配单元(Allocate Unit)
YFS 将 disk 划分为等大小的分配单元(AU,Allocate Unit)进行管理,AU size 是 YFS 分配磁盘空间的最小单元。
YFS 支持的 AU size 颗粒度有:1M(默认值)、4M、8M、16M、32M,用户可以在创建 DiskGroup 时指定该 DiskGroup 的 AU size,或使用默认的 AU size。
AU size 决定了 YFS 管理磁盘空间的颗粒度,更大的 AU size 可以使 YFS 创建更大的文件、获得更好的连续 IO 性能,但也会消耗更多内存,浪费一些磁盘空间。用户应根据业务特征选择合适的 AU size,不合适的 AU size 可能影响 YFS 的运行性能。对 AU size 的配置建议如下:
系统中以小文件为主时,建议选择较小的 AU size。
系统中以大文件为主时,建议选择较大的 AU size。
当 AU size 大于等于绝大多数 IO size 时,可以获得更好的性能。
文件及目录管理
YFS 提供了一组文件操作 API,抽象底层存储管理细节,语义兼容大多数文件系统操作,具备文件、目录、路径等文件系统基本概念。
YFS 还提供专用的管理终端 yfscmd,提供与 Linux Shell 类似的文件管理界面,例如常见的 cd、ls、mv、cp 等命令。
# 目录
YFS 以目录树的形式组织、管理文件。YFS 的路径构成为+DG_NAME/DIR/PATH/file.name
。
YFS 的根是+
,一级目录是磁盘组的名称,其他次级才是一般意义上的目录和文件名。磁盘组目录是虚拟目录,无法直接增/删/改,需通过增/删磁盘组间接修改。
可以通过绝对路径中的根识别文件系统类型,以+
开头的是 YFS 路径,以/
开头的是系统本地路径。yfscmd cp 指令通过根路径字符识别文件所在文件系统,实现 YFS 和本地文件系统的交叉复制。
# 文件
YFS 文件除用户数据外,还包含一些精简的属性信息,例如创建时间、文件大小等。由于 YFS 仅支持 Direct IO 读写,YFS 文件大小都是 512 字节的整倍数。
文件实际占据的磁盘空间可能大于文件大小,约为Round(FileSize/AuSize) * Redundancy
,文件的元数据也会额外占据一些空间,但相对较少。
版权声明: 本文为 InfoQ 作者【YashanDB】的原创文章。
原文链接:【http://xie.infoq.cn/article/1cd31e2bb2c30084fd7d52d31】。文章转载请联系作者。
评论