实现分布式文件系统(一)
初识文件系统
什么是文件系统?
在我们实现一个分布式文件系统之前,我们首先要回答一个问题,什么是文件系统?文件系统是一套实现了数据的存储,分级组织,访问和获取等操作的抽象数据类型。通俗一点讲,文件系统是在存储设备上进行数据的组织和管理的一套机制。数据又包含原始数据和元数据。
从上面的解释中,我们能提炼出几个关键词,存储设备,元数据
- 存储设备:比如SATA磁盘 SAS磁盘
- 元数据:直接解释为描述数据的数据,即对某项数据的具体描述信息。在文件系统中,则是对某个文件的描述信息,比如文件存储路径,大小,文件名,文件类型等等。
我们熟悉的文件系统类型:
- ext:ext2,ext3,ext4,GNU/Linux文件系统。
- HFS:mac os使用的文件系统。
- NTFS:windows使用的文件系统。
文件系统的基本原理
上述文件系统和操作系统,磁盘相关。接下来我们以linux中使用的文件系统ext为例,讲解一下文件系统的运作过程。
首先我们来认识一下磁盘的物理组成(鸟哥的linux私房菜有介绍):
- 圆形的盘片(主要记录数据部分)
- 机械手臂,机械手臂上的磁头(可读写盘片上的数据)
- 主轴马达,可以转动盘片,让机械手臂的磁头在盘片上读写数据。
数据存储和读写的重点在于盘片,盘片的物理组成为:
- 磁道:磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。
- 扇区:每个磁道被等分为若干个弧段,这些弧段便是扇区,扇区为最小的物理存储单位,根据磁盘设计不同,目前主要有512个字节和4K两种格式。
- 柱面:扇区组成一个圆就是柱面,柱面数和磁道数相同。
硬盘的容量=柱面数x磁头数x扇区数x512B/4K
再来了解三个概念:
- inode: 记录文件的属性,一个文件占用一个inode,相当于文件的索引(记录文件数据的block编号,权限信息等等的)
- block: 实际记录文件的内容,一个block大小一般为1K,2K,4K,8K,我们在上面知道物理结构中存储的最小单位是扇区,读取磁盘如果按照扇区来读,效率太差,一般是按照block来读,如果block大小为4K,则代表一个block是8个扇区(扇区按512字节算)。
- super block: 超级块,它记录的是整个文件系统的信息,文件系统的类型,inode数量,block数量,文件系统各种事件等。
一个block只能存储一个文件的数据,如果文件大于block的大小,则使用多个block存储,如果文件小于block的大小,此block不可在存储别的文件数据,即block的剩余容量不可用,磁盘空间会被浪费。所以需要合理选用block的大小。在格式化时block的大小就固定了。
如果文件系统中的文件很大,比如都高达数百GB,那么inode的数量和block的数量过于庞大,为了便于管理EXT文件系统将block分为多个block group,每个区块群组中都有独立的inode/block/superblock系统。
文件系统最前方有一个开机扇区(Boot Sector),可实现多操作系统的重要设计。
- 文件系统描述:描述每个block group 的开始与结束的block号码。
- 块对应表(block bitmap):用bit位记录了每一个block目前的状态,如果有数据就置为1,没有数据置为0。如果需要分配block,那么就找目前状态为0的。
- inode 对应表(inode bitmap):和块对应表相似,记录的是inode的分配和未分配的号码。
- inode table:详细记录了每一个inode的信息。inode中记录的信息有:文件的访问模式,文件权限,文件的ID,文件的时间,文件内容的block号码,12个直接指向,1个间接指向,1个双间接指向,1个三间接指向。如果正在被使用,则将相应的位置为1,要是删除了文件,那就将相应位置置为0。
至此,我们基本了解了计算机是如何存储文件的,也大致明白了磁盘文件系统的基本原理,可以基于这些做个总结:
- 根据存储文件的大小,合理设置block的大小,有助于磁盘的最大化利用
- 文件越大,使用的block越多,读写的时间也会相应变长
- inode和block都是有编号的,找到inode就找到了inode所对应的block上的数据
- inode的数量等于文件系统可存储文件的数量
- 为了兼容存储的文件数量,读写性能,减少管理data block的开销,文件大小应在一个合理的范围
- 如果block为4K,则存储文件大小最好是4K的倍数
为什么很多分布式文件系统都有block的概念,我们心里大概也就清楚了。
为什么需要文件系统?
- 屏蔽了对底层磁盘的操作,不需要关系底层细节
- 更友好,更便捷,更有效的管理数据
接下来我们将介绍分布式有关的内容
Hi ~ I'm a robot of Januschoi.I just upvoted your post!
Please also help upvote my post here: https://steemit.com/cn/@januschoi/6jlsyu
Thanks so much~!!