专注于操作系统、网络、存储、安全、大数据与云计算、集群、基础组件等

理想很美好,现实很残酷,坚持在路上,只因初心仍存

一些存储的基本概念

《一些存储的基本概念》

存储技术

网络存储设备根据存储技术的不同,主要分为三类:DAS(Direct Attached Storage)、NAS(Network Attached Storage)和SAN(Storage Area Network)。

  1. 直接连接存储DAS是对SCSI总线的进一步发展。它对外利用SCSI总线通道和多个主机连接,解决了SCSI卡只能连接到一个主机上的缺陷。

  2. NAS(附网存储系统)系统是用一个装有优化的文件系统和瘦操作系统的专用数据存储服务器,提供跨平台的文件共享功能。

  3. SAN(存储区域网)是通过专用高速网将一个或多个网络存储设备(如磁盘阵列RAID)和服务器连接起来的专用存储系统。连接DAS存储一般应用在中小企业,与计算机采用直连方式,NAS存储则通过以太网添加到计算机上,SAN存储则使用FC接口,提供性能更加的存储。

NAS与NAS的主要区别体现在操作系统在什么位置。如下图所示:

《一些存储的基本概念》

NAS和SAN的区别:

  1. NAS和SAN最本质的不同就是文件管理系统在哪里。SAN结构中,文件管理系统(FS)还是分别在每一个应用服务器上;而NAS则是每个应用服务器通过网络共享协议(如:NFS、CIFS)使用同一个文件管理系统。

  2. SAN提供的存储单位是LUN,属于block级别的。经过NAS创建成文件系统后,就变成文件级别的了。

  3. SAN 更好的支持RAID,因为它拥有更多硬盘和更强的控制器。当有一大块数据写到RAID Group上,它可以被分成数小块,同时写到几个磁盘上。

  4. SAN有更大的cache,Cache对性能的提高也有明显的作用。
    更稳定:多机头,热备盘,多路径等机制杜绝了单点故障。
    更安全:统一的容灾,备份和远程复制保证了数据的安全性。

三种技术比较:

《一些存储的基本概念》

存储方式

  1. 对象存储基于文件系统,通过文件系统来存储访问数据。

  2. 块存储是以块为基本单元的存储方式,其传输不存在数据打包/解包的过程,可提供更高的传输性能

  3. 文件存储设备通过以太网与服务器连接。服务器通过NFS、CIFS、HTTP、FTP等协议进行数据访问。数据通过以太网传输,有打包/解包的过程
    总结:

《一些存储的基本概念》

iSCSI协议

ISCSI与FC并列为两大标准的块级传输协议。成本昂贵,是部署光纤存储区域网络(FC SAN )的最大缺点。

iSCSI 协议定义了在TCP/IP网络发送、接收块级存储数据的规则与方法。发送端将SCSI指令与数据本体封装到TCP/IP封包中,然后通过以太网络发送。接 收端收到TCP/IP封包后,将它们还原为SCSI指令与数据,并依指令执行。完成指令后,再将响应的SCSI指令与数据封装到TCP/IP封包,发回发 送端。通过这种方式,存取远程存储设备时,就如同在本地端存取本机的SCSI硬盘一样。

iSCSI和FC比较:
光纤通道 (FC)与iSCSI各有自己的优缺点。

  1. FC作为SAN的基础架构,它专门 为满足大容量存储需求和实现业务连续性而设计,利用光信号完成传送的过程,具备非常高的性能。

  2. 而iSCSI基于许多用户都已经熟悉的IP协议,传送的距离 更远,而且企业用户已经广泛应用的百兆或千兆局域网为iSCSI的广泛铺开打好了基础。

  3. 利用iSCSI,可以把FC的基础设施扩展到更远距离和更多 服务器,实现业务连续性和更出色的掉电保护,更加灵活。利用IP技术的低成本优势,可以把SAN扩展到更多服务器。

scale up 和 scale out

什么是scale up 和 scale out?

常见的系统扩展方式有scale up和scale out两种:

Scale Up(纵向扩展) 主要是利用现有的存储系统,通过不断增加存储容量来满足数据增长的需求。 但是这种方式只增加了容量,而带宽和计算能力并没有相应的增加。

Scale-out(横向扩展)架构的升级通常是以节点为单位,每个节点往往将包含容量、处理能力和I / O带宽。一个节点被添加到存储系统,系统中的三种资源将同时升级。

一个比较形象的鱼缸比喻:

当你只有六七条鱼的时候, 一个小型鱼缸就够了;可是过一段时间新生了三十多条小鱼,这个小缸显然不够大了。

如果用Scale up解决方案,那么你就需要去买一个大缸,把所有沙、水草、布景、加热棒、温度计都从小缸里拿出来,重新布置到大缸。这个工程可不简单哦,不是十分钟八分钟能搞得定的,尤其水草,纠在一起很难分开(不过这跟迁移数据的工程复杂度比起来实在是毛毛雨啦,不值一提)。

那么现在换个思路,用Scale out方案,就相当于是你在这个小缸旁边接了一个同样的小缸,两个缸联通。鱼可以自动分散到两个缸,你也就省掉了上面提到的那一系列挪沙、水草、布景等的折腾了。

write back和write through

这里引用smartcache的关于它两的定义:

Write-through Cache Policy: The goal of write-through caching is to accelerate the read operations. All write operations go to Primary Source (HDDs); write operations may also go to the Cache (SSDs). Thus the write operations may be slower compared to a configuration without Write-through Cache Write-back Cache Policy: The goal of write-back caching is to accelerate both read and write operations. Writes may be cached on the Cache (SSDs) and written to the Primary Storage (HDDs) at a later point of time.


翻译:
write-through(透写): 加速读操作,所有的写操作直接写往主存,同时也写在缓存cache中,因此写操作相对较慢。
write-back(回写):同时加速读写操作,写操作先缓存在cache中,稍后才会写到主存中去。

write-back的优缺点:
优点:回写操作先将数据写到cache缓冲之中便立刻返回,不等待磁盘等存储设备IO写指令执行完毕。因为免去了等待操作较慢的IO写操作的执行,这种方式具有较高的效率。
缺点:Cache中会保存上一次写之后的数据(通常叫做脏数据),而且如果写的过程中发生了掉电,则不能确保数据切实被写入到磁盘中。

RAID

RAID(Redundant Array of Inexpensive Disks)称为廉价磁盘冗余阵列。RAID 的基本原理是把多个便宜的小磁盘组合到一起,成为一个磁盘组,使性能达到或超过一个容量巨大、价格昂贵的磁盘。

RAID技术大致分为两种:基于硬件的RAID技术和基于软件的RAID技术。

在 Linux下通过自带的软件就能实现RAID功能,这样便可省去购买昂贵的硬件 RAID 控制器和附件就能极大地增强磁盘的 IO 性能和可靠性。由于是用软件去实现的RAID功能,所以它配置灵活、管理方便。同时使用软件RAID,还可以实现将几个物理磁盘合并成一个更大的虚拟设备,从而达到性能改进和数据冗余的目的。

基于硬件的RAID解决方案比基于软件RAID技术在使用性能和服务性能上稍胜一筹,具体表现在检测和修复多 位错误的能力、错误磁盘自动检测和阵列重建等方面。

RAID级别对比:

《一些存储的基本概念》

其他还有RAID 6、7、5E、5EE、DP、ADG之类的就不一一介绍了。每种RAID的详细介绍网上一搜一堆,之一。

RAID 5 和 RAID 10 对比

RAID 0、10、5、ADG对比表格:

《一些存储的基本概念》

上表在可用磁盘空间计算,假设以下条件成立:
1)阵列中所有的物理磁盘容量一致;
2)没有使用热备硬盘;
3)RAID 5中不超过14块硬盘;
4)RADI ADG中不超过56块硬盘。

一般raid5会多配一块热备盘,因为raid5本身只允许有1块磁盘损坏,而raid10,每组允许损坏1块,2组就是各1块,4组就是各4块,但是同组内不允许有2块损坏。

读方面:磁盘阵列读操作的关键更多的体现在cache的命中率上。所以,RAID5和RAID10在读数据上面,他们基本是没有差别的。

连续写:在连续写操作过程,如果有写cache存在,并且算法没有问题的话,RAID5比RAID10甚至会更好一些,差别不大,因为这个时候的RAID校验是在cache中完成,如4块盘的RAID5,可以先在内存中计算好校验,同时写入3个数据+1个校验。而RAID10只能同时写入2个数据+2个镜相。如果没有写缓存存在,RAID5写性能不如10。

随机写:假定要把一个数字2变成数字4,那么对于RAID5,实际发生了4次io:

先读出2与校验6,可能发生读命中
然后在cache中计算新的校验
写入新的数字4与新的校验8

对于RAID10,同样的单个操作,最终RAID10只需要2个io,而RAID5需要4个io。这里考虑的是没有缓存的情况。

总结:小io的数据库类型操作,建议采用RAID10,而大型文件存储,数据仓库,则从空间利用的角度,可以采用RAID5。

LUN的概念

lun的全称是logical unit number,也就是逻辑单元号。

scsi总线上可挂接的设备数量是有限的,一般为6个或者15个,我们可以用target ID(也有称为scsi id的)来描述这些设备,设备只要一加入系统,就有一个代号,我们在区别设备的时候,只要说几号几号就ok了。

实际上我们需要用来描述的对象,是远远超过该数字的,于是我们引进了lun的概念,也就是说lun id的作用就是扩充了target id。每个target下都可以有多个lun device,我们通常简称lun device为lun,这样就可以说每个设备的描述就有原来的target x变成target x lun y了,那么显而易见的,我们描述设备的能力增强了

lun id不等于某个设备,只是个号码而已,不代表任何实体属性,在我们的实际环境里,我们碰到的lun可能是磁盘空间,可能是磁带机,或者是media changer等等.

块设备

系统能够随机访问固定大小数据片(chuncks)的硬件设备称作块设备。这些固定大小的数据片称作块。它们都是以安装文件系统的方式使用的,这也是块设备一般的访问方式。

块设备中最小的可寻址单元是扇区。扇区大小一般为2的整数倍,最常见的是512字节。扇区是所有块设备的基本单元。

软件都会用到自己的最小逻辑可寻址单元“块”。块是文件系统的一种抽象,只能基于块来访问文件系统。

虽然物理磁盘寻址是按照扇区级进行的,但是内核执行的所有磁盘操作都是按照块进行的。块数是扇区大小的2的整数倍,并且小于页面大小。所以通常块大小是512字节,1KB, 4KB。

扇区:设备的最小寻址单元,亦称”硬扇区”或”设备块”
块:文件系统的最小寻址单元,亦称”文件块”或”I/O块”

buffer_head

当一个块被调入内存时,它要存储在一个缓冲区中,每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示。

内核在处理数据时需要一些相关的控制信息,每一个缓冲区都有一个对应的描述符,用buffer_head结构体表示,称作缓冲区头。在文件中定义。

缓冲区头的目的在于描述磁盘块和物理内存缓冲区之间的映射关系。这个结构体在内核中只扮演一个描述符的角色,说明从缓冲区到块的映射关系。也说明其所描述块的状态(脏,干净,过期等)。它并不与底层的块驱动程序打交道。

弊端:
一、缓冲区头是一个很大且不易控制的数据结构体,对数据的操作不方便也不清晰。
二、仅能描述单个缓冲区。

bio

目前内核中块I/O操作的基本容器由bio结构体表示,定义在中。该结构代表了正在现场(活动)的以片段(segment)链表形式组织的块I/O操作。一个片段是一小块连续的内存缓冲区。通过片段来描述缓冲区,即使一个缓冲区分散在内存的多个位置上,bio结构体也能对内核保障I/O操作的执行。像这样的向量I/O就是所谓的聚散I/O。

bio结构体中最重要的几个域是bi_io_vec、bi_vec、和bi_index,如下图所示:

《一些存储的基本概念》

每一个块I/O请求都是通过一个bio结构体表示。每个请求包含一个或多个块,这些块储存在bio_vec结构体数组中。

buffer_head是用来管理buffer,而bio是用来传输buffer的。bio为通用层的主要数据结构,既描述了磁盘的位置,又描述了内存的位置,是上层内核vfs与下层驱动的连接纽带。

sync 和 fsync

sync只是将所有修改过的块的缓存排入写队列,然后就返回,它并不等待实际I/O操作结束。相当于是异步的。

fsync只引用单个文件,它等待I/O结束,然后返回。相当于同步操作。

当将数据写到文件上时,通常该数据先由内核复制到缓存中,如果该缓存尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓存以便存放其他磁盘块数据时,再将该缓存排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称之为延迟写(delayed write)。

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注