块大小为2048的时候, 各部分和扇区对应关系如下图:
超级块详细信息
超级块总是位于文件系统的第1024~2048字节处。
超级块中包含的信息如下:
偏移(16进制)字节数含义&解释00~034文件系统中总inode节点数04~074文件系统中总块数08~0B4为文件系统预保留的块数0C~0F4空闲块数10~134空间inode节点数14~1740号块组起始块号18~1B4块大小(1024左移位数)1C~1F4片段大小, 跟块大小一模一样20~234每个块组中包含的块数量24~274每个块组中包含的片段数量, 跟包含的快数量一致28~2B4每个块组中包含的inode节点数量2C~2F4文件系统最后挂载时间30~334文件系统最后写入时间34~352当前挂载数36~372最大挂载数38~392文件系统签名标识 53EF3A~3B2文件系统状态, 正常, 错误, 恢复了孤立的inode节点3C~3D2错误处理方式, 继续, 以只读方式挂载3E~3F2辅版本号40~434最后进行一致性检查的时间44~474一致性检查的间隔时间48~4B4创建本文件系统的操作系统4C~4F4主版本号, 只有该值为1的时候, 偏移54之后的扩展超级块的一些动态属性值才是有意义的50~512默认为UID的保留块52~532默认为GID的保留块54~572第一个非保留的inode节点号, 即用户可以使用的第一个inode节点号58~592每个inode节点的大小字节数5A~5B2本超级块所在的块组号5C~5F4兼容标识特征60~634非兼容标识特征64~674只读兼容特征标识68~7716文件系统ID号78~8716卷名88~C764最后的挂载路径C8~CB4位图使用的运算法则CC~CC1文件再分配的块数CD~CD1目录再分配的块数CE~CF2未使用D0~DF16日志IDE0~E34日志inode节点E4~E74日志设备E8~EB4孤立的inode节点表EC~3FF788未使用
块组描述符详细信息
每个块组描述符占用32个字节, 其数据结构如下:
偏移(16进制)字节数含义&解释00~034块位图起始地址(块号)04~074inode节点位图起始地址(块号)08~0B4inode节点表起始地址(块号)0C~0D2块组中空闲块数0E~0F2块组中空闲inode节点数10~112块组中的目录数12~1F-未使用
inode信息
每个inode会被分配给一个目录或者一个文件, 每个inode包含了128个字节, 里面包含了这个文件的各种meta信息。
在所有inode中, 1~10号会用作保留给内核使用, 在这些保留节点中, 2号节点用于存储根目录信息, 1号表示坏块, 8号表示日志文件信息。
第一个用户可见的都是从11号inode开始, 11号节点一般用作lost found目录, 当检查程序发现一个inode节点已经被分配, 但是没有文件名指向他的时候, 就会把他添加到lost found目录中并赋予一个新的文件名。
inode通过三级指针的方式来找到文件数据最终存储的数据块, 见下图:
这种方式能保证小文件的读取效率的同时, 也支持大文件的读取。
目录项
在ext文件系统中, 每个目录也对应一个inode节点, 该inode节点对应的数据块里面会存储该目录下所有文件/目录的信息。
每个文件/目录对应的信息就叫目录项, 目录项包含的内容也很简单, 主要就是文件名和指向该文件名的inode指针, 详细信息如下:
偏移(16进制)字节数含义&解释00~034inode节点号04~052本目录项的长度字节数06~061名字长度字节数07~071文件类型08~不定长度名字的ascii码
当文件删除的时候, 不会真正删除文件, 会将该文件所属目录对应的目录项给删除, 同时将对应数据块在快位图表中标记为0。
链接
- 硬链接是指在另外一个目录对应的目录项中增加一个目录项。硬链接建立之后, 用户无法通过文件名来判断到底哪个是原文件名, 哪个是链接名;
- 软连接是一种文件类型, 该文件里面就存储源文件的完整路径, 如果源文件完整路径长度小于60个字节, 那么就将该值直接存储在inode节点表中, 避免浪费数据块;
分配策略
- 首先判断应该在哪个块组中分配
- 如果是为文件创建节点
- 默认会在其父目录所在的组中为其创建节点, 这样可以确保一个目录中所有文件都位于一个大致的区域中
- 如果父目录所在组没有空闲的节点或者空闲的块了, 就到别的块组中为该文件分配节点, 找寻别的块组的算法如下
- 每次讲当前组号加上2^N次方再求hash
- 如果上面的算法没找到, 就线性查找
- 如果是为目录创建节点
- 会将其分配到可用空间较多的块组中, 分配算法如下:
- 首先利用超级块中的剩余inode和剩余块数字算出每个块组的平均剩余数字, 然后依次找到一个大于平均值的块组
- 如果没找到, 就利用块组描述符表中的信息, 找到一个最空闲的块组
- 当一个数据块分配给某文件之后
- 该块原来的内容会被请出, inode节点对应的各种元信息会跟着做修改
- 如果是文件, 节点对应链接数会设置为1, 如果是目录, 链接数会被设置为2
实际创建/删除文件过程
我们创建一个/xuanku/file.txt, 该文件大小为10000字节, 文件块大小为4096, 那么下面来看一下过程:
- 读取文件系统的1024字节~2048字节, 即超级块信息。通过超级块得到快大小为4096, 每个块组含有8192个块以及2008个inode节点
- 读取文件系统中第1个块(即组描述符表), 得到所有块组布局信息
- 访问2号inode节点(即根节点), 通过读取根节点数据块信息, 假设读到其位于5号块
- 在第5号块所有目录项中从前往后遍历, 直到找到文件名为xuanku的目录项, 读到该inode节点为4724
- 每个块组有2008个inode, 用4724针对2008取模, 得到的结果是2号块组
- 通过组描述符表中得到第2个块组的inode节点表起始于16378号块
- 从16378号块读取inode节点表中查找4724号对应的inode节点(708号表项), 查询到该xuanku的目录内容位于17216号块
- 从17216块读取xuanku目录项内容, 将file.txt相关信息更新到该块的目录项当中
- 然后开始为文件分配inode节点, 默认会放到父目录所在块组, 即2号块组, 再次2号块组的inode节点表16378, 开始从4724往后找到第一个可用的inode节点分配给该文件, 假设找到的是4850号inode。
- 然后就给4850号的inode位图表设置为1, 组描述符的空闲inode节点数和超级块的总空闲inode节点数都减1, 将inode节点的地址写入file.txt对应的目录项当中, 然后写各种时间, 记录日志
- file.txt需要3个块的存储空间, 通过2号块组描述符找到块位图对应的块, 并从前往后找到可用的块。然后将对应的位设置为1, 并更新到inode节点当中
- 然后将文件的内容写入到对应的块中
下面再演示一下将该文件删除的过程:
读取文件系统的1024字节~2048字节, 即超级块信息。通过超级块得到快大小为4096, 每个块组含有8192个块以及2008个inode节点
读取文件系统中第1个块(即组描述符表), 得到所有块组布局信息
访问2号inode节点(即根节点), 通过读取根节点数据块信息, 假设读到其位于5号块
在第5号块所有目录项中从前往后遍历, 直到找到文件名为xuanku的目录项, 读到该inode节点为4724
每个块组有2008个inode, 用4724针对2008取模, 得到的结果是2号块组
通过组描述符表中得到第2个块组的inode节点表起始于16378号块
从16378号块读取inode节点表中查找4724号对应的inode节点(708号表项), 查询到该xuanku的目录内容位于17216号块
从17216块读取xuanku目录项内容, 读到file.txt的inode节点为4850
然后取消file.txt的目录项分配, 修改系列xuanku目录对应的目录项信息
取消inode节点信息, 修改2号块组对应的inode节点表信息, 将inode节点位设置为0, 更新块组描述符和超级块的空闲inode节点数加1
还要回收文件内容对应的6个块空间, 将块位图表中的bit设置为0, 清除inode节点的块指针, 更新块组描述符和超级块的空闲块数加1。
三、分布式存储系统
分布式系统主要分成存储模型和计算模型两类。本文主要描述的是存储模型的介绍。其中计算模型的分布式系统原理跟存储模型类似,只是会根据自身计算特点加一些特殊调度逻辑进去。
任何一个分布式系统都需要考虑如下5个问题:
1.数据如何分布就像把鸡蛋放进篮子里面。一般来说篮子大小是一样的,当然也有的系统支持不一样大小的篮子。鸡蛋大小也不一样,有很多系统就把鸡蛋给"切割"成一样大小然后再放。并且有的鸡蛋表示对篮子有要求,比如对机房/机架位的要求。
衡量一个数据分布算法好不好就看他是否分得足够均匀,使得所有机器的负载方差足够小。
2.如何容灾分布式系统一个很重要的定位就是要让程序自动来管机器,尽量减少人工参与,否则一个分布式系统的运维成本将不可接受。
容灾问题非常复杂,有很多很成熟的系统也不敢保证自己做得特别好,那么来看看一个典型的系统都有可能出哪些问题吧:
1.机器宕机
这是最常见的故障了。系统中最容易出问题的硬盘的年故障率可能能达到10%。这样算下来,一个有1000台机器的集群,每一个星期就会有2台机器宕机。所以在机器数量大了之后,这是一个很正常的事情。
一般一台机器出故障之后修复周期是24小时,这个过程是人工接入换设备或者重启机器。在机器恢复之后内存信息完全丢失,硬盘信息可能可以保存。
一个分布式系统必须保证一台机器的宕机对服务不受影响,并且在修复好了之后再重新放到集群当中之后也能正常工作。
2.网络故障
这是最常见且要命的故障。就是该问题会大大增加分布式系统设计的难度。故障一般发生在网络拥塞,路由变动,设备异常等情况。出现的问题可能是丢包,可能是延时,也可能是完全失去连接。
有鉴于此,我们一般在设计分布式系统的时候,四层协议都采用TCP,很少采用UDP/UDT协议。而且由于TCP协议并不能完全保证数据传输到对面,比如我们再发送数据,只要数据写入本地缓冲区,操作系统就会返回应用层说发送成功,但是有可能根本没送到对面。所以我们一般还需要加上应用层的ACK,来保证网络层的行为是可预期的。
但是,即使加上应用层的ACK,当发送请求之后迟迟没收到ACK。这个时候作为发送方也并不知道到底对方是直接挂了没收到请求,还是收到请求之后才挂的。这个尤其是对于一些控制命令请求的发送尤为致命。
一般系统有两种方案:
- 发送查询命令来判断到底是哪种情况
- 将协议设计成"幂等性"(即可重复发送数据并不影响最终数据), 然后不停重试
3.其他异常
比如磁盘坏块,但是机器并没有宕机;机器还活着,就是各种操作特别慢;由于网络拥塞导致一会网络断掉,不发送数据之后又好了,一旦探活之后重新使用又挂了等恶心的情况;
这些异常都需要根据实际情况来分析,在长期工程实践中去调整解决。
并且令人非常沮丧的事实是:你在设计阶段考虑的异常一定会在实际运行情况中遇到,你没考虑到的异常也会在实际运行中遇到。所以分布式系统设计的一个原则是:不放过任何一个你看得到的异常。
3.读写过程一致性如何保证一致性的概率很简单,就是我更新/删除请求返回之后,别人是否能读到我新写的这个值。对于单机系统,这个一致性要达到很简单,大不了是损失一点写的效率。但是对于分布式系统,这个就复杂了。为了容灾,一份数据肯定有多个副本,那么如何更新这多个副本以及控制读写协议就成了一个大问题。
而且有的写操作可能会跨越多个分片,这就更复杂了。再加上刚才提到的网络故障,可能在同步数据的时候还会出现各种网络故障,想想就头疼。
而且即使达到了一致性,有可能读写性能也会受到很大损失。我们设计系统的时候就像一个滑动条,左边是一致性,右边是性能,两者无法同时满足(CAP原理)。一般的系统会取折衷,设计得比较好的系统能够让用户通过配置来控制这个滑动条的位置,满足不同类型的需求。
一致性一般怎么折衷呢?我们来看看如下几种一致性的定义。注意除了强一致性以外,其他几种一致性并不冲突,一个系统可以同时满足一种或者几种一致性特点。
强一致性
不用多说,就是最严格的一致性要求。任何时候任何用户只要写了,写请求返回的一霎那,所有其他用户都能读到新的值了。
最终一致性
这个也是提得很多的一个概念,很多系统默认提供这种方式的一致性。即最终系统将将达到"强一致性"的状态,但在之前会有一段不确定的时间,系统处于不一致的状态。
会话一致性
这个也很容易理解,能满足很多场景下的需求。在同一个会话当中,用户感受到的是"强一致性"的服务。
单调一致性
这个比会话一致性还要弱一点。他之保证一个用户在读到某个数据之后,绝对不会读到比上一次读到的值更老的数据。
4.如何提高性能分布式系统设计之初就是为了通过堆积机器来增加系统整体性能,所以系统性能也非常重要。性能部分一般会受一致性/容灾等设计的影响,会有一定的折衷。
衡量一个分布式系统的性能指标往往有:
- 最大容量
- 读qps
- 写qps
横向扩展是指一个集群的服务能力是否可以通过加机器做到线性扩展。
附NAS、SAN、DAS的架构及比较
在网络存储中,有着各种网络存储解决方案,例如:SAN,NAS,DAS存储网络,它们各自有着各自的特点,其运用场景也有所不同。下面就说说各自的特点。
一、SAN
SAN(Storage Area Network)存储区域网络,是一种高速的、专门用于存储操作的网络,通常独立于计算机局域网(LAN)。SAN将主机(管理server,业务server等)和存储设备连接在一起,能够为其上的任意一台主机和任意一台存储设备提供专用的通信通道。SAN将存储设备从服务器中独立出来,实现了服务器层次上的存储资源共享。SAN将通道技术和网络技术引入存储环境中,提供了一种新型的网络存储解决方案,能够同时满足吞吐率、可用性、可靠性、可扩展性和可管理性等方面的要求。
通常SAN由磁盘阵列(RAID)连接光纤通道(Fibre Channel)组成(为了区别于IP SAN,通常SAN也称为FC-SAN)。SAN和服务器和客户机的数据通信通过SCSI命令而非TCP/IP,数据处理是“块级”(block level)。SAN也可以定义为是以数据存储为中心,它采用可伸缩的网络拓扑结构,通过具有高传输速率的光通道的直接连接方式,提供SAN内部任意节点之间的多路可选择的数据交换,并且将数据存储管理集中在相对独立的存储区域网内。SAN最终将实现在多种操作系统下,最大限度的数据共享和数据优化管理,以及系统的无缝扩充。
其中,SAN网络又被细分为FC-SAN网络和IP-SAN网络。
1、FC-SAN
FC-SAN顾名思义就是直接通过FC通道来连接磁盘阵列,数据通过发送SCSI命令来直接与硬件进行通信,从而提高了整体的速率。
FC-SAN的构成:
在FC-SAN中,有一些专用的硬件和软件。硬件包括FC卡、FC HUB、FC交换机、存储系统等,软件主要是FC控制卡针对各种操作系统的驱动程序和存储管理软件。
①FC卡:主要用于主机与FC设备之间的连接。
②FC HUB:内部运行仲裁环拓扑,连接到HUB的节点共享100MB/S带宽(或更高)。
③FC交换机:内部运行Fabric拓扑,每端口独占100MB/S带宽(或更高)。
④FC存储设备:采用FC连接方式,光纤接口可以有一到多个。FC存储设备通常采用光纤的硬盘,也有Fibre to SCSI(Fibre to ATA)的解决方案,使用SCSI(或ATA)的硬盘,在整个配置上较便宜。
⑤存储网络管理软件:存储管理软件主要的功能是自动发现网络拓扑及映射,当在存储网络中增加或减少时自动发现及组态。
⑥高性能的光纤通道交换机和光纤通道网络协议是FC-SAN的关键。把以光纤通道交换机为骨*网络拓扑结构称为“SAN Fabric”。而光纤通道协议是FC-SAN的另一个本质特征。FC-SAN正是利用光纤通道协议上加载SCSI协议来达到可靠的块级数据传输。
FC-SAN的应用场景:
由于FC-SAN是为在服务器和存储设备之间传输大块数据而进行优化的,因此对于以下应用来说是理想的选择:
①关键任务数据库应用,其中可预计的响应时间、可用性和可扩展性是基本要素。
②集中的存储备份,其中性能、数据一致性和可靠性可以确保企业关键数据的安全。
③高可用性和故障切换环境可以确保更低的成本、更高的应用水平。
④可扩展的存储虚拟化,可使存储与直接主机连接相分离,并确保动态存储分区。
⑤改进的灾难容错特性,在主机服务器及其连接设备之间提供光纤通道高性能和扩展的距离。
FC-SAN的优点:
面对迅速增长的数据存储需求,企业和服务提供商渐渐开始选择FC-SAN作为网络基础设施,因为SAN具有出色的可扩展性。事实上,SAN比传统的存储架构具有更多显著的优势。例如,传统的服务器连接存储通常难于更新或集中管理。每台服务器必须关闭才能增加和配置新的存储。相比较而言,FC-SAN不必宕机和中断与服务器的连接即可增加存储。FC-SAN还可以集中管理数据,从而降低了总体拥有成本。
利用光纤通道技术,FC-SAN可以有效地传输数据块。通过支持在存储和服务器之间传输海量数据块,SAN提供了数据备份的有效方式。因此,传统上用于数据备份的网络带宽可以节约下来用于其他应用。
开放的、业界标准的光纤通道技术还使得FC-SAN非常灵活。FC-SAN克服了传统上与SCSI相连的线缆限制,极大地拓展了服务器和存储之间的距离,从而增加了更多连接的可能性。改进的扩展性还简化了服务器的部署和升级,保护了原有硬件设备的投资。
此外,FC-SAN可以更好地控制存储网络环境,适合那些基于交易的系统在性能和可用性方面的需求。SAN利用高可靠和高性能的光纤通道协议来满足这种需要。
FC-SAN的另一个长处是传送数据块到企业级数据密集型应用的能力。在数据传送过程中,FC-SAN在通信结点(尤其是服务器)上的处理费用开销更少,因为数据在传送时被分成更小的数据块。因此,光纤通道FC-SAN在传送大数据块时非常有效,这使得光纤通道协议非常适用于存储密集型环境。
2、IP-SAN
简单来讲,IP-SAN(IP存储)的通信通道是使用IP通道,而不是光纤通道,把服务器与存储设备连接起来的技术,除了标准已获通过的iSCSI,还有FCIP、iFCP等正在制定的标准。而iSCSI发展最快,已经成了IP存储一个有力的代表。
像光纤通道一样,IP存储是可交换的,但是与光纤通道不一样的是,IP网络是成熟的,不存在互操作性问题,而光纤通道SAN最令人头痛的就是这个问题。IP已经被IT业界广泛认可,有非常多的网络管理软件和服务产品可供使用。
二、NAS
NAS(Network Attached Storage)网络附加存储。在NAS存储结构中,存储系统不再通过I/O总线附属于某个服务器或客户机,而直接通过网络接口与网络直接相连,由用户通过网络访问。
NAS实际上是一个带有瘦服务器的存储设备,其作用类似于一个专用的文件服务器。这种专用存储服务器去掉了通用服务器原有的不适用的大多数计算功能,而仅仅提供文件系统功能。与传统以服务器为中心的存储系统相比,数据不再通过服务器内存转发,直接在客户机和存储设备间传送,服务器仅起控制管理的作用。