图-1 磁盘架构
硬盘通常有三个模块组成:接口电路、Firware、盘片和机械控制电路。数据通过Cable到达接口电路,就是上面所说IDE、SATA、SCSI、FC接口,它完成对应协议相关物理电信号的转换和处理,得到相关的数据和命令。通常,硬盘采用的两种协议集:ATA和SCSI。其中IDE和SATA采用ATA协议集,而并行SCSI和串行SCSI,以及FC基本都采用SCSI协议集。为了加强接口电路的可靠性,FC硬盘中还采用了双端口技术。
当数据通过了接口电路后,就由Firmware来处理,它会根据传递来的命令进行相关的处理,如果需要写入数据,则还要操纵机械控制电路将它们写入盘片。由于Firmware功能越来越强大,为硬盘加入了很多特性,比如命令队列,磁盘缓冲,数据加密设计等。
最后数据通过机械臂写入到盘片,由于盘片可能因为某些坏块而导致数据丢失,或者数据写入错误。目前,有一种重定向技术,来解决这种问题;例如,写入到某数据块错误 (比如LBA地址 M ),Firmware可以将这个块的数据重新写入一个专用区域块;从而即使该块损坏,也可以通过Mapping,将坏块重定向到好的区域,并完成正常的读写操作。
可见,在硬盘存储设备上,每一个模块都涉及到数据安全的细节设计。
二、存储的扩展----NAS
2.1 基于Linux的NAS
在中低端NAS领域,可以采用定制的LINUX+SATA作为平台来进行设计,如图-2所示。尽管SATA采用ATA协议集,但是在LINUX下由于SCSI驱动架构比IDE架构 (专门用于IDE硬盘) 扩展能力强,所以还让SATA跑在SCSI架构下面。
图-2 采用Linux构建NAS
在Linux下SCSI驱动架构,自下而上主要分为三层,分别是SCSI Lower Level驱动、SCSI Middle Level驱动,和SCSI Upper Level驱动。最下面是SCSI Lower Level驱动,它和系统提供的Libata模块协作,让各种SATA HBA能够正常的运行,因为系统提供的Libata是按照SATA的规范来抽象出一些共有的东西,所以对于不同的SATA HBA只要去做自己相关的事情,这样就像流水线那样,分工明确,责任清晰,从而也更加易于扩展。
对于SCSI Middle Level驱动,它就像一个中央管理者,负责探寻下面各个SATA HBA上连接的硬盘,并向上层驱动汇报,同时将上层发下来的读写请求转化为对应的某个磁盘上对应的块读写操作。它就像一个调度者,负责协调上下模块之间的动作,在整个SCSI驱动架构中扮演重要的角色。而基于最上层的SCSI Upper Level驱动,就是针对各种SCSI设备而专门设计,对于磁盘就是通常的sd_mod.o模块。该模块一个最直观的功能就是向系统报告设备名,Linux系统中众所周知的/dev/sda, /dev/sdb, /dev/sdc等设备名就是由它来完成的。
当通过SCSI驱动架构的处理,RAW设备就呈现出来;但是在RAW设备基础上的直接构建卷和文件系统,其可靠性不高,扩展性不强,不能加入很多有特色的元素。因此通常可以在RAW设备上提供一个卷管理软件,如MD (软件RAID), 它除了支持常规的各种RAID外, 还加入了对RAID6的支持,并且被加入到内核中;从而,使得对于MD的部署和管理更加方便。当然,也有采用基于MD的LVM, EVMS, VxVM等,它们能提供更为强大的功能。
当构建完底层的卷之后,那么就可以设计文件系统了。文件系统,说得简单点,就是一个大管家,它把你的资料统一管理起来;例如,你不知道某张图片放在哪个磁盘的某个位置,只需要告诉大管家,要看这个文件,那么它就会把该图片取出来。当然,对于文件系统来说,最怕系统崩溃,所以在现代的文件系统设计中都加入了日志功能,对于Linux来说就是常用的Ext2, Ext3。
当这些基础设施都准备好后,再加入上层的应用模块,这样用Linux构建的本地系统已经可以正常工作了。但是,要做NAS,就要把这个本地系统和外界连接起来,这时候NFS或CIFS就担当起这个重要的职责的桥梁。通过这些网络文件系统,就可以把本地的文件系统装载到远程去,完整地实现NAS功能。
上面所涉及到的各个模块,在Linux下都有良好的支持,通过对Linux内核的定制,以及对各种应用程序的适当选择就可以完成;尽管看起来很容易,但实际上在整个通路上的安全问题,是由很多底层的设计人员解决掉封装好,所以用户了解不到。
2.2基于Windows的NAS
针对Linux在这方面的应用,Windows也设计了对应的NAS涉及解决方案,如图-3所示。和Linux构建NAS对比,可以发现在架构设计上很多是相通的,毕竟操作系统的兴旺发达还是从各个大牛们啃UNIX开始的。
图-3 基于Windows的NAS设计
从图-3中的最底层开始,其中的MiniPort Driver和Linux下的SCSI Lower Level驱动功能类似,同样Windows中也有SCSI Port Driver来完成Linux SCSI Middle Level驱动的工作,上面的Disk Class Driver基本和sd_mod.o完成的工作一样;
在它们之上和文件系统之间,windows放入了一个PSM Filter Driver,它和用户模式下的PSM组件一起完成Snapshot的功能;而这些功能,可以在Linux的卷管理模块,如LVM中完成。其上面就是Microsoft专有的NTFS,它本身也是一个日志文件系统;再加上CIFS网络文件系统,一个基于Windows的NAS就横空出世了。
三、存储的贵族----存储网络SAN中的阵列
对于存储阵列,那高贵的血统通常不是普通用户能够接触得到,即使使用也是小心翼翼,倍加呵护;所以其内部架构,也倍显神秘。图-4就是IBM DS8000的内部架构图。
图-4 DS8000架构
直观上看图-4,它是一个左右对称的图,即是说将它以中轴线平分,左右两边几乎是一样的;这就是高端设计中,一个为了提高安全能力,达到高可靠性的关键点,防止单点故障的冗余。
然后对照从上往下看,先是接入SAN Fabric的HBA (Host Adapter),然后数据就进入Processor Complex;经过Processor的处理,然后到达设备控制器 (Device Adapter);在DS8000内部,采用了Fabric Switch,从而设备控制器会把数据传送给光纤交换机,最终由它传递到磁盘上,注意这里的磁盘采用了双端口技术。
换个角度来看,如果把HBA, Processor和设备控制器结合起来,它就像是一个服务器那样;那么对于DS8000阵列,它包含服务器、光纤交换机、存储磁盘,它本身就像一个SAN环境,只不过这个SAN是一个自封闭的环境,只留下HBA接受外面的SCSI命令。
当然EMC和HDS可能采用了不同的架构和设计方法,不过最基本的原理,都是类似的,俗话说“天下武功出少林”。
四、安全与存储,IT的新热点
通过上述对存储设备组成模块,数据移动路径的分析,对于神神秘秘的存储作了初浅的“故事简介”,如果把数据在传输和存储中的安全定义为广义的安全,那么可靠性就是提高安全的关键。
而在存储领域中,可靠性是随处可见,自底而上,贯穿始终:
a) 从文件系统的日志能力和目前的热门话题CDP;
b) 到卷管理器上的快照;
c) HBA上的多路径;
d) 阵列上的RAID;
e) 采用NVRAM (on-Volatile Random Access Memory) 的缓冲;
f) 采用双端口的磁盘;
但是,在加入这些安全考虑的时候,在某些情况下会带来性能的影响,比如CDP技术,以及带校验能力的RAID5和RAID6等;要实现这些功能,不可避免的都需要占用处理时间,或者对存储空间的额外占用;从某种程度上来说,安全可能会和存储冲突,但是随着软硬件技术的不断发展和提高,这种冲突将会被逐渐的减少,或者设计专门的设备来完成,比如针对RAID5和RAID6就有专用的RAID加速器,并且并非所有的应用都是对性能有无限需求。只要能够在可以接受的程度下,保证用户的数据安全,保证用户数据的可靠性,满足用户的需求,才是真正的王道。
总之,数据天生就包含到安全和存储两个属性,在以前的应用中,对这一点客户和厂商都没有达到将他们二者统一的观念,将其分为两个不同的领域来处理和对待。但是,随着安全和存储厂商并购的滚滚大流,随着用户对数据重要性认识的越来越深入,安全和存储必将融合。