文件系统简述:从基础存储到大数据
linux Inode文件存储
文件系统将硬盘空间以块为单位进行划分,每一个文件占据若干块。“块”大小,最常见的是4KB。为了找到文件,还需要存储文件的元信息,操作系统将这些信息存储到文件控制块FCB。通过文件控制块FCB可以找到每个文件块占据的硬盘数据。
Linux将FCB中的文件名和其他管理信息分开,其他信息组成Inode,inode中记录着文件权限、所有者、修改时间、文件大小等。
Inode是固定结构,能记录的硬盘地址索引数量固定15个。前12个索引直接指向数据块。
如果文件大小超过了12个块。后3个索引为索引表指针,分别一级间接索引表指针,二级间接索引表指针,三级间接索引表指针,索引表记录了数据块地址。
对于能存储的最大文件大小。简化起见,按每个块1KB来算。
12个指针指向数据块:12 * 1K = 12K
一级间接索引表指针,指向一个1K的数据块,该数据块中记录了数据块的索引,每个 数据块 索引占 4bytes,因此 1K 的大小能够记录 256 个记录,因此,一级间接索引表指针可以存储:256 * 1K = 256K
同理,二级间接索引表指针可以存储:2562561K=256^2K,
三级间接索引表指针可以存储:2562562561K=256^3K即,总共可以存储:12 + 256 + 256256 + 256256256 (K) = 16GB
(PS:由于大于 2K 的 block 将会受到 Ext2 文件系统本身的限制,因此,这个方法不能用在 2K 及 4K block 大小的计算中)
RAID独立硬盘冗余阵列
文件系统关心的问题有:
如何存储大文件?
文件如何不丢失?即高可用
更高速度的读写?
传统的文件系统无法满足这三个需求,因此,有了 RAID独立硬盘冗余阵列 解决方案。
RAID 0 如果有写3个数据块的操作,或写到三个不同的硬盘上,即,把数据并行的写在不同的硬盘上。解决数据的告诉读写问题。任何一块硬盘坏了,数据就损坏了。
这种方案,性能提高了,但是,可用性降低
RAID 1 在两个硬盘写同样的数据。数据的可用性提高了,但是速度变慢。
RAID 10 两两互相备份,8台服务器分成4组。硬盘的浪费比较严重。利用率低。浪费1倍。
RAID 5 所有数据进行异或运算记录,当任何块损坏,用剩下的磁盘和校验数据异或,都可以恢复。浪费一块。
需要注意,校验信息螺旋写入的。如果写到1块盘上,任何数据的修改,都会修改这块盘中的校验信息,写压力太大,这块盘也容易坏。
RAID 6 :RAID 5只可以处理一块盘坏了的情况,RAID 6扩展了RAID 5写两种校验信息,即使损坏两块盘也可以找回数据。
分布式文件系统 HDFS
随着需要存储的数据量增大,需要文件系统有更高的写入速度,和更大的管理能力,由此,产生HDFS。
NameNode负责接受客户端的读写服务,管理文件存储位置信息等。
DataNodes负责是具体的数据读取,写入,存储,冗余等。
为了保证数据的高可用,HDFS默认三备份存储数据。
第一个副本:放置在上传文件的DataNode;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的机架上,即使路由到第一个机架失败,或第一个机架故障,也可以保证数据可用。
第三个副本:放置在与第二个副本相同机架的节点上。
通过跨服务器,跨机架,HDFS保证了数据的可用性。
正常运行时,DataNode会定时发送心跳包给NameNode,当DataNode超时未发送心跳,认为该DataNode异常。NameNode会检查DataNode上有哪些数据块,并告诉其他机器机器复制这些数据块。
HDFS缺省数据块64M一个块,因此,可以很好的保存大文件。
参考:
极客时间——架构师训练营资料
https://www.cnblogs.com/caiyao/p/4606638.html
版权声明: 本文为 InfoQ 作者【破晓_dawn】的原创文章。
原文链接:【http://xie.infoq.cn/article/8c30dea575f22304b6092cefa】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论