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
https://www.jianshu.com/p/5f00ec80a13c
https://zhuanlan.zhihu.com/p/54961640
网友评论