购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第6章
阵列之行
——大话磁盘阵列

两三块磁盘做RAID 0或1,四五块磁盘做个RAID 3、4、5是小事一桩,不过太没魄力。要玩就弄个几十块盘,那才过瘾。这不,有人发明了专门装这些磁盘的大柜子,我们这就去看看这柜子是怎么回事儿吧。

退隐江湖——太累了,该歇歇了

自从张真人创立了降龙三掌之后,江湖各门各派争相修炼,商人不断推出基于降龙掌的新商品。江湖上浮躁之气再次袭来,很少有人去钻研底层功夫了,都是拿来就用,不思进取。几十年过去了,张老道已经成了头发苍白的老人。

这天晚上,人少星稀。唯独天上的北斗七星,光芒还是那么灿烂,仿佛已逝去百年的七星大侠,还在天上苦苦钻研。

张真人如今也已经是白发苍苍,可是知己已不在。一百年来,江湖上为了利益你争我抢,反目成仇,打打杀杀。呜呼哉!!!难道这个江湖真要从此衰败么?张老道失望至极。

闻道

尘世浮华迷人眼,

梦中情境亦非真。

朝若闻道夕死可,

世间何处有高人?

第二天,张真人对外宣布,他从此退隐江湖,不再参与江湖事。瞬时间,整个江湖就像地震了一样,人们没有了主心骨,都不知道该干什么好了。打打杀杀的也不打了,商人也没得吹了。很多商人纷纷上武当来游说张真人,让他出山,包荣华富贵,都被张真人一一回绝了。江湖又恢复了以往的平静,只是这平静似乎预示着一场更加猛烈的暴风雨即将来临。

前仆后继——后来者居上

话说有位少年,自幼好钻研和寻根问底,被人称作“隔一路”。此人不善于口头表达,不会忽悠,但是如果世界只剩下他一个人,那么他便会爆发出神奇的力量。由于内向的性格,他吃了不少亏,但他依然我行我素,并不在乎别人的议论和猜忌甚至是诋毁。这位少年名为无忌。他实际上也确实是无所畏忌,明知山有虎,偏向虎山行,用天真和执著去挑战世俗,跌倒了大不了重来。

既然选择了这条路,就要把它走完。孤独和压迫给了他巨大的动力,每天晚上都在刻苦学习。他学习IO大法和磁盘大挪移,学习七星北斗阵和降龙大法。虽然他并没有实践过这些知识,但是依然有一股力量促使他不断地学习钻研。

6.1 初露端倪——外置磁盘柜应用探索

无忌已经充分掌握了前人留下的心法口诀。在不知道该做点什么的时候,他突然有了一个想法。虽然按照七星大侠的RAID方式,可以将多块磁盘做成逻辑盘,但是普通的服务器或者PC机箱里面,也就安装两三块磁盘,空间就满了。如果做很多块盘的RAID,把磁盘都放到机箱里面肯定不行,得想个办法来让机器可以带多块磁盘。

“拿出来,拿出来,全部都掏出来!”他找来一台机器,装了一块Ultra 320 SCSI卡,这个卡只有一个通道,可以连接15块磁盘。但是15块盘怎么放入一个机箱呢?太困难了,所以必须把这些盘放到机箱外面。但是连线和电源问题又不好办。他索性找来一个箱子,把所有磁盘都放在这个箱子里。箱子有独立电源和散热系统,保障磁盘的稳定运行。接口方面,内部其实就是一条SCSI线缆,只不过将它做到了电路板上,然后在外面放一个接口,这个接口是用来连接主机上的SCSI卡的。如果主机上装的是不带RAID功能的SCSI卡,那么加电之后,主机会识别到磁盘箱中的所有磁盘。箱子中有多少磁盘,在OS磁盘管理器中就会显示多少块磁盘。如果主机上安装的是带RAID功能的SCSI卡,那么可以用这个RAID卡先来对认到的多块磁盘做一下RAID,划分出逻辑盘,这时OS识别到的就是逻辑磁盘,而不会认到箱子中的物理磁盘。

这种简单的磁盘箱如图6-1所示,无忌给它取了个学名,叫做“JBOD”,也就是Just a Bound Of Disks,“只是一串磁盘”,这个描述非常形象。无忌立即将这个做法公布了出去,没想到大受欢迎,一时间各个厂家争相生产这种磁盘柜,在市场上卖得很火。

图6-1 JBOD磁盘阵列示意图

6.2 精益求精——结合RAID卡实现外置磁盘阵列

思考: 能否把RAID功能做到磁盘箱中,因为如果要调整RAID的话,还需要重启主机等,会影响主机应用。如果做到了磁盘箱中,那么在主机上就不需要做什么,只要在磁盘箱中做完之后连接到主机,主机重启之后或者不用重启就能认到新逻辑盘了。

经过多次实验,终于做成了一个设备。少年把这种自带RAID控制器的磁盘箱叫做“磁盘阵列”。自此在江湖上有了一个不成文的规定,凡是JBOD都叫做磁盘柜,凡是自带RAID控制器的盘柜就叫做磁盘阵列或者盘阵。盘柜和盘阵,前者只是一串外置的磁盘,而后者自带RAID控制器。图6-2为JBOD磁盘柜实物图。

盘阵是在盘柜的基础上,将内部的磁盘经过其自带的RAID控制器的分分合合,虚拟化成逻辑磁盘,然后经过外部SCSI接口连接到主机上端的SCSI接口。此时,整个盘阵对于主机来说,就是主机SCSI总线上的一个或者多个设备,具有一个或者多个SCSI ID。所有逻辑磁盘都以LUN的形式呈现给主机。

如图6-3所示,盘阵中的SCSI控制器在逻辑上有两个部分,右边的S2控制器连接了一条SCSI总线,上面有若干磁盘。左边的S1控制器同样也连接了一条SCSI总线,但是上面只有两个设备:一个就是主机SCSI控制器,另一个就是它自己。

图6-2 JBOD磁盘柜实物图

图6-3 带RAID控制器的磁盘阵列示意图

毫无疑问,在左边的SCSI总线上,盘阵SCSI控制器是作为Target模式,被主机SCSI控制器操控,处于被动地位;在右边的SCSI总线上,盘阵的S2控制器成了Initiator模式,它在右边总线上占据主动权,拥有最高优先级,而各个磁盘均为SCSI Target,受控于Initiator。当然S1和S2不一定就是两块物理上分开的芯片,很有可能就是一块单独的芯片逻辑地分成两个部分。甚至有可能将RAID芯片和SCSI控制器芯片全部集成到一个大芯片中。

图6-4所示的是一个SATA盘阵控制器的主板示意图。

图6-4 一个可以连接16块SATA磁盘的小型RAID控制器主板

图6-5所示的是一个小型盘阵控制器的内部实物图。

图6-5 一个小型控制器实物图

图6-6所示的是一台盘阵的磁盘插槽实物图。

图6-7所示的为这台盘阵的电源模块插槽。

图6-6 磁盘插槽、背板

图6-7 电源模块插槽

6.3 独立宣言——独立的外部磁盘阵列

主机由于肚量太小容不下想法太多的磁盘!终于磁盘从主机内部跑出来了,磁盘们在外置的大箱子里,在RAID控制器的带领下,欣欣向荣,勇往直前!

磁盘和控制器发布了独立宣言,彻底摆脱了主机的束缚,成为与主机对峙的一个独立的外部设备。从此以后,存储技术才真正的成为一个独立的庞大学科,并不断发展壮大。本书后面的章节会介绍更多的存储技术,包括存储网络和网络存储。

1.前端和后端

对于盘阵来说,图6-3中RAID控制器的左边就称为“前端”,右边则称为“后端”。面向主机对外提供服务的就叫前端,面向自己管理的磁盘用于内部管理而外部不需要了解的部分就叫做后端。同样,对于主机来说,它的SCSI适配器反而成了后端,而以太网卡可能变成了前端。因为对于主机来说,直接面对外部客户机的是以太网,而管理磁盘的工作不必对客户说明,所以变成了后端。

2.内部接口和外部接口

对于盘阵来说,还有一个内部接口和外部接口的概念。内部接口是指盘阵RAID控制器连接其内部磁盘时用的接口,比如可以连接IDE磁盘、SCSI磁盘、SATA磁盘和FC磁盘等。外部接口是指盘阵控制器对于主机端,也就是前端,提供的是什么接口,比如SCSI接口、FC接口等。内部接口可以和外部接口相同,比如内部用SCSI磁盘,外部也用SCSI接口连接主机,这种情况也就是图6-3中所示的情况。

内外接口也可以不同,比如内部连接IDE磁盘,外部却用SCSI接口连接主机(仅限于盘阵,盘柜必须内外接口一致)。盘阵控制器是一个虚拟化引擎,它的前端和后端可以不一致,它可以向主机报告其有多少LUN,尽管内部的磁盘是IDE的。

3.多外部接口

同时,我们也不要被盘阵上为什么可以有多个外部SCSI接口而感到困惑。有多个接口是为了连接多台主机用的。每个由盘阵RAID控制器生成的逻辑磁盘,可以通过设置只分配(Assign/Map)到其中一个口,比如LUN1被分配到了1号口,那么连接到2号口的主机就不会看到这个LUN。也可以把一个LUN同时分配(或叫做Map,映射)到两个口,那么两台主机能同时识别出这个LUN。让两台主机同时对一个LUN写数据,底层是允许的,但是很容易造成数据的不一致,除非使用集群文件系统,或者高可用性系统软件的参与。

4.关于LUN

LUN是SCSI协议中的名词,我们前面也描述过。LUN是SCSI ID的更细一级的地址号,每个SCSI ID(Target ID)下面还可以有更多的LUN ID(视ID字段的长度而定)。对于大型磁盘阵列来说,可以生成几百甚至几千个虚拟磁盘,为每个虚拟磁盘分配一个SCSI ID是远远不够用的。因为每个SCSI总线最多允许16个设备接入(目前32位SCSI标准最大允许32个设备)。要在一条总线上放置多于16个物理设备也是不可能的,LUN就是这样一个次级寻址ID。磁盘阵列可以在一个SCSI ID下虚拟多个LUN地址,每个LUN地址对应一个虚拟磁盘,这样就可以在一条总线上生成众多虚拟磁盘,以满足需求。

后来,人们把硬件层次生成的虚拟磁盘,统一称为“LUN”,不管是不是在SCSI环境下,虽然LUN最初只是SCSI体系里面的一个概念。而由软件生成的虚拟磁盘,统一称为“卷”,比如各种卷管理软件、软RAID软件等所生成的虚拟磁盘。

有些盘阵配有液晶操控面板,如图6-8所示。而有些低端的盘阵更是在液晶面板周围加上了按钮,用来对盘阵进行简单快速的配置,比如查看磁盘状态、设置RAID、划分逻辑磁盘等。这种方式极其简化了配置操作,一般用户通过阅读说明书就可以完成配置。不过液晶屏幕比较小,能完成的功能不多,操作相比用鼠标要麻烦。所以一些盘阵提供了COM口或者以太网接口,可以用PC连接这些接口与盘阵通信,通过仿真终端或Web界面就可以对盘阵进行配置。

图6-8 一个带液晶面板的盘阵前视图

提示: 用户用PC与盘阵的COM口或专用于配置的以太网接口连接,完全是为了配置磁盘阵列的各种参数,而不是通过这些配置专用接口从磁盘阵列的磁盘上读写数据。

6.4 双龙戏珠——双控制器的高安全性磁盘阵列

如果盘阵内部只有一个控制器模块,那么会是一个SPOF(Single Point Of Failure),即单点故障点。所以一些高端的盘阵内部都有两个控制器,互为冗余。分配给其中一个控制器的LUN逻辑卷,可以在这个控制器因故障失效的时候,自动被另一个工作正常的控制器接管,继续处理针对这个LUN的读写请求。两个控制器平时都管理各自的LUN,一旦发现对方故障,那么就会自动将所有LUN都接管过来。

因为如此,两个控制器之间需要相互通信,通告对方自己的状态以及交互一些其他的信息。两个控制器之间可以用PCI总线连接,也可以用厂商自己设计的总线来连接,没有统一标准。至于交互信息的逻辑和内容,更是因品牌而不同,而没有标准来统一它们。

为了避免单点故障,给盘阵安装一个额外的控制器,这个控制器和原来的控制器在它们后端共享一条或者多条磁盘总线。两个控制器可以使用Active-Standby方式,也可以使用Dual-Active的互备方式连接。

1.Active-Standby

这种方式又称HA(High Availability方式,高可用性),即两个控制器中同一时刻只有一个在工作,另外一个处于等待、同步和监控状态。一旦主控制器发生故障,则备份控制器立即接管其工作。

对于内部为SCSI总线的双控制器盘阵,在机头内部的一条SCSI总线中,两个控制器可以分别占用一个ID,这样剩余14个ID给磁盘使用。平时只有主控制器这个ID作为Initiator向除了备份控制器ID之外总线上的其他ID(也就是所有磁盘的ID)来发送指令从而读写数据。

同时备份控制器与主控制器之间保持通信和缓存同步,一旦主控制器与备份控制器失去联系,那么备份控制器立即接管主控制器。同时为了预防脑分裂(见下文),备份控制器在接管之前需要通过某种机制将主控制器断电或者重启,释放其总线使用权,然后自己接管后端总线和前端总线。

提示: 主机端必须用两个SCSI适配器分别连接到盘阵的两个控制器上,才能达到冗余的目的,但是这样做主机端必须通过某种方式感知到这种HA策略并在故障发生时切换。目前,由于SCSI盘阵本身比较低端,可接入容量不大,所以没有双控制器的设计,以上文字只是对HA机制的一种描述。但是对于本书后面要讲述的FC盘阵来说,使用双控制器以及在主机端使用双FC适配卡是非常普遍的。

2.Dual-Active

顾名思义,这种双控制器的实现方式是两个控制器同时在工作,每个控制器都对所有后端的总线有通路,但是每个总线平时只被其中一个控制器管理,另一个控制器不去触动。可以将后端一半数量的总线交由一个控制器管理,另一半交由另外一个控制器管理。一旦其中一个控制损坏,则另外一个控制器接管所有总线。这种方式比Active-Standby方式高效很多。

3.脑分裂(Split Brain)

这个词明显有点恐怖。设想一下,如果某时刻连接两个控制器之间的通路出现了问题,而不是其中某个控制器死机,此时两个控制器其实都是工作正常的,但是两者都检测不到对方的存在,所以两者都尝试接管所有总线,这时候就是所谓的“脑分裂”,即同时有两个活动控制器来操控所有后端设备。这种情况是可怕的,类似精神分裂症。

如何预防这种情况呢?通常做法是利用一个仲裁者来选择到底使用哪一个控制器接管所有总线,比如用一两个控制器都能访问到的磁盘,控制器向其上写入自己的仲裁信息。一旦发生脑分裂,二者就参考这个磁盘,谁最后写入了信息就把控制权给谁。或者用一种电源控制器,一旦其中某个控制器要接管,那么不管对方是确实发生故障了还是正常的,这个控制器都会向电源控制器发送信号,让对方重启并进入Standby状态,这样就成功地预防了脑分裂。

接管了总线的控制器一般都会对总线上所有磁盘进行SCSI Reserve操作,即预订操作。总线上所有目标设备一旦被预订,它们便不再接受其他控制器的IO请求。SCSI 2标准中的SCSI Reserve不允许其他控制器读写被原有控制器预订的设备,但是SCSI 3中的Reserve策略有了一些灵活性,可以允许其他控制器对已经被预订的目标设备进行读IO,而写IO则被拒绝。

图6-9所示的是一双控制器盘阵机头示意图。

图6-9 双控制器磁盘阵列示意图

提示: 实际中,由于SCSI盘阵比较低端,一般没有这种设计模式的产品。

6.5 龙头凤尾——连接多个扩展柜

一条SCSI总线最多可以连接15块磁盘,为了这15块磁盘,大动干戈地赋予两个昂贵的RAID控制器,有点不值。为了把这两个控制器充分利用起来,榨取最后一滴性能,15块磁盘不够,那就再加。前面说过,一个控制器上可以有多个通道,一个通道下面就是一条SCSI总线,那么将盘阵的每个控制器上再多接一个或者两个通道,来充分发挥它的能力,这样就比较实惠了。如图6-10所示,这台盘阵机头带有一个扩展后端磁盘柜接口。

图6-10 带有一个扩展外部磁盘通道接口的控制器示意图

通道建好之后,下一步就是要扩充磁盘数量了。当然,JBOD就成了最佳选择。

图6-11所示的盘阵的每个控制器上多出一个额外的磁盘通道接口,这个接口露在机箱外面,用线缆连接了一个JBOD扩展柜。

图6-11 外接一个JBOD扩展柜的磁盘阵列

经过这样的改造,可连接的磁盘数量成倍增长。图中所示的是每个控制器增加了一个磁盘通道,还可以增加到两个或者多个通道。理论上,只要RAID控制器处理速度够强,总线带宽和面板上空间够大,多增加几个通道都没问题。

JBOD盘柜以前只有一个外部接口,为了配合双控制器,JBOD在其外部也增加了一个接口用来连接冗余的控制器。这样,扩展柜上也有两个外部接口了。

把带有控制器的磁盘柜称作“机头”,因为它就像火车头一样,是提供动力的。机头里可以有磁盘,也可以根本不含磁盘。把用于扩展容量用的JBOD叫做“扩展柜”,它就像一节节火车车厢,本身没有动力,全靠车头带,但是基本的供电和冷却系统还是要有的。图6-12所示的是IBM的DS400盘阵机头后视图,每控制器提供3个通道,机头内部的磁盘占用一个,然后另外两个提供扩展,在后面板上给出两个SCSI接口。图中Expansion ports所示的就是这两个SCSI接口。右边空白的地方是用来接入另外一个控制器的,这个控制器是可选组件。

图6-12 DS400盘阵的机头后视图

图6-13是用于连接DS400机头的扩展柜EXP400。可以看到它的左右各有一个接口模块,每个模块上有一个SCSI接口用来连接机头。

图6-13 EXP400扩展柜的后视图

6.6 锦上添花——完整功能的模块化磁盘阵列

再后来,机头做的都比较漂亮,而且感觉很厚实。但是JBOD就是一堆磁盘,显得和机头有些不搭配。所以也给扩展柜增加了所谓的模块,不仔细看的话,外观和机头没多大区别。只不过扩展柜的模块上,没有RAID控制器的功能,但是会加上一些其他功能,如探测磁盘温度等二线辅助功能。这个模块将接口、功能芯片、电路等都集成在一个板子上,所以外观和机头差不多。

图6-14所示的ESM模块,就是实现这些功能的插板。图6-15中所示的是一个磁盘扩展柜的实物后视图,可以看到上下两个模块,这两个模块不但负责链路通信,还负责收集设备各处的传感器发来的信息。

图6-14为一台盘阵的前视图。图6-15是一台FC接口的扩展柜后视图,可以看到上下两个ESH(Electrical Switch Hub)模块。这些磁盘扩展柜上的模块中主要包含单片机或者DSP芯片、FC-AL半交换逻辑处理以及其他功能的FPGA/ASIC/CPLD芯片、SFP适配器编码芯片、ROM或者Flash芯片(存放Firmware)、RAM缓存芯片(用于存放芯片执行程序时所需的数据)等,视设计不同而定。如果有新的Firmware被开发出来,可以将程序逻辑写入Flash或ROM芯片中,这个过程就是固件升级。FPGA/CPLD等芯片需要用外置的编程器写入新的电路逻辑。ASIC芯片不可升级,是固定逻辑的芯片,适用于成熟的、量产的芯片,比如SFP编码芯片等。

图6-14 一个扩展柜的前视图

图6-15 一个磁盘扩展柜的后视图

图6-16为扩展柜上的一个ESH2模块的内部实物图。

图6-16 ESH2模块实物图

6.7 一脉相承——主机和磁盘阵列本是一家

1.盘阵(磁盘阵列)控制器的主机化

随着人们需求的不断提高,一个存储系统拥有几TB甚至几十几百TB的容量已经不是什么惊人的事情了。面对如此大的容量和如此多的磁盘,小小的控制器已经不能满足要求了。因此大的主机系统替代了短小精悍的控制器。

思考: 可能有人已经不知所措了,用主机系统替代盘阵控制器,这不矛盾么?盘阵是给主机服务的,主机替代了盘阵控制器,岂不是乱了辈分了?

事实并非如此。众所周知,主机系统的经典架构就是CPU、内存、总线、各种IO设备和CPU执行的代码(软件),而观察一下盘阵控制器的基本架构,如RAID控制器芯片(CPU)、内存、总线、IO接口(SCSI接口等)和RAID芯片执行的代码(软件),就可以发现盘阵控制器就是一个简单的主机系统。

既然这样,完全可以用一台主机服务器来充当存储系统的控制器。比如,在这台主机上插入几张SCSI卡作为前端接口卡,再插入若干SCSI卡作为后端连接磁盘箱的接口卡,然后设计软件从/向后端读写数据,经过处理或者虚拟化之后,再传送给前端的主机服务器。

目前有两种趋势:一种是趋向使用现成的主机来充当控制器的载体,另一种是趋向使用高集成度的芯片作为控制器的核心。两种趋势各有利弊。

图6-17所示的是一台主机化的磁盘阵列实物图。

图6-17 主机化的盘阵控制器

2.盘阵的类型

按照前端和后端接口来分,有SCSI-FC盘阵、FC-FC盘阵、SATA-FC盘阵、SCSI-SCSI盘阵等类型。SCSI-FC类型表示后端接口为SCSI接口,前端用于连接主机的为FC接口,也就是后端为SCSI磁盘,前端为FC接口的盘阵。

我们在后面会讲到FC-FC盘阵,这也是目前最高端的盘阵所采用的架构。图6-18所示的就是一台大型FC磁盘阵列的透视图,图示中一共5个机柜,中间的机柜整柜都为控制器,上方可见一排IO插卡,插卡上方为9个风扇。其余机柜中均为磁盘扩展柜。

图6-18 EMC DMX系列盘阵透视图

6.8 天罗地网——SAN

存储区域网络

大家来看最后一张图片,如图6-19所示。我们一开始描绘的那张“网中有网”的图片,现在大家应该能更深刻地理解了。网络,不仅仅指以太网、TCP/IP网,可以是SCSI网、PCI总线网、USB网等。RAID控制器,就相当于一个路由器,也就是协议转换器。

图6-19 网中有网

将磁盘放到了主机外部,存储设备和主机之间,就形成了又一个独立的网络:存储区域网络(Storage Area Network,SAN)。

数据就是在这种网络中来回穿梭,格式不断被转换和还原。 dF5cf5buzFTjJR9Q2G9rcxwYgMOFVfBVr9K65xSYogFy1snNLnRpQilF1UW1lpQ2



第7章
熟读宝典
——系统与系统之间的语言OSI

千百年来,江湖中人一直都把祖宗流传下来的一本宝典铭记于心,这本宝典就是号称“号令武林,莫敢不从”的OSI大典!

任何系统之间,如果需要通信,就有一套自己的协议系统。这个协议系统不仅要定义双方互相通信所使用的语言,还要规定所使用的硬件,比如通信线路等。例如以太网协议,凡是接入以太网的(交换机或者HUB)节点,都必须遵循以太网所规定的通信规程。两个对讲机之间进行通话,必须预先定义好发送和接收的频率,而且还要指定通信的逻辑,比如每说一句话之后,要说一个“完毕”,表示本地已经说完,该对方说了。

7.1 人类模型与计算机模型的对比剖析

人和计算机,二者有着天然的相似性。

7.1.1 人类模型

人类自身用语言来交流信息,这本身就是系统间通信的极佳例子。每个人都是一个系统,这个系统由八大子系统组成,每个子系统行使自己的功能,各个子系统相互配合,使得人体可以做出各种各样的事情,包括制造计算机系统这个“部分仿生”产物。

1.消化系统

消耗系统负责食物的摄取和消化,使我们获得糖类、脂肪、蛋白质、维生素等营养,再经过一系列生化酶促反应,最终可以生成能量,以ATP分子的形式向各个细胞供应化学能,再经过一系列的分子机器(蛋白质或者蛋白质复合体)的处理,可以形成机械能、热、光、电等各种能量形式。

2.神经系统

神经系统负责处理外部信息和调控人类自身运动,使我们能对外界的刺激有很好的反应,包括学习等重要的活动也是在神经系统控制下完成的。比如皮肤、耳朵、眼睛等接收的各种信号,都会经过神经网络传送到大脑进行处理并做出反映。

3.呼吸系统

呼吸系统是气体交换的场所,可以使人体获得新鲜的氧气。人类制造、储存和利用能量的每个过程,都需要氧气的参与,氧气是很好的氧化剂,人类利用这种氧化剂,氧化摄取的糖、蛋白质等物质,产生能量,如果没有氧气,则人体一切的生命活动就会终止,包括心肌的收缩和扩张运动。

4.循环系统

循环系统负责氧气、营养和体液以及各种信号控制分子的运输,废物和二氧化碳的排泄,以及免疫活动。人体的这些空间中,各种器官按照规则分布着,每个器官行使其功能,必须供给它们能量、水和氧气以及各种控制因子蛋白,遍布周身的密密麻麻的动脉、静脉和毛细血管,就是运输这些物质必需的通道。这些物质溶在血液中,从动脉流入器官,完成生命逻辑后,从静脉流入肾脏,过滤废物,排泄,干净的静脉血再流回心脏,然后进入动脉,经过肺部的时候,将肺部获取的氧气吸溶入血液,成为鲜红色的动脉血,然后再流入各个器官,供给必须物质。

5.运动系统

运动系统负责身体的活动,使我们可以做出各种动作。骨骼和肌肉属于运动系统,骨骼虽然不直接运动,但是它能在肌肉的牵引下进行运动。控制肌肉运动的是神经信号,大脑发出神经控制信号(一系列的蛋白质或者离子流),肌肉组织收到之后,便会引发雪崩似的化学反应,包括肌肉细胞中的微管结构的不断重组和释放,用这种形式来改变细胞形状,从而造成肌肉收缩或者扩张。而微管的组装和释放,需要能量和酶的参与,这时候,细胞便会贪婪地利用ATP分子来获取化学能,而血液ATP损耗之后,血液便会加速流动到肌肉周围,提供更多的能量。这也是运动时心脏加速跳动的原因。而心脏跳动速度的控制因素很多,比如受到惊吓的时候,大脑便会分泌一些物质,传送到心肌,引发反应,促使跳动速度加快。

6.内分泌系统

内分泌系统调节生理活动,使各个器官组织协调运作。内分泌系统是一个中央调控系统,比如生长素就是内分泌系统分泌的一种蛋白质分子,它被骨骼吸收后,可以促进骨骼生长。内分泌系统如果发生功能故障,则人体就会表现异常,包括精神和物理上的异常。

7.生殖系统

生殖系统负责生殖活动,维持第二性征。生殖系统是人类繁衍的关键,生殖系统将人类的所有特征融入精子和卵子,受精卵在母亲子宫中逐渐发育成全功能的人体。

8.泌尿系统

泌尿系统负责血液中生化废物的排泄,产生尿液。

7.1.2 计算机模型

我们发现,计算机系统和工作模式,与生物系统有很大一部分是类似的。

1.计算机的消化系统

消化子系统是为整个系统提供基本能量和排泄消化废物的。给计算机提供能量的是电源和密布在电路板上的供电线路。为计算机排泄能量废物的,是接地低电位触点。电流流经供电线路,到接地触点终止,将能量提供给电路板上的各个部件(器官)。此外,计算机的“消化”也包含另外的意思,即吞入数据、吐出数据的过程。计算机从磁盘上读入数据,进行计算(消化)后,再输出数据。

2.计算机的循环系统

循环子系统是为整个系统提供能量和物质传输通道的。给计算机提供数据传输通道的是各种总线,数据从总线流入CPU处理单元,完成计算逻辑后,又从总线输出到内存或者外设。所以我们说,计算机的循环系统,就是总线,心脏就是电路振荡装置。

3.计算机的呼吸系统

呼吸子系统是为整个系统提供完成生命逻辑所必需的氧化剂,即氧气为计算机散热的风扇,貌似呼吸系统,但风扇的功能更类似于皮肤和毛孔的散热作用。

4.计算机的神经系统

神经子系统的作用是传输各种信号,调节各个器官的功能。对于生物体来说,神经系统是运行在脑组织中的一种逻辑,这种逻辑通过执行一系列生化物理反应来体现它的存在。通过向血液中释放各种蛋白质信号分子,从而靶向各种器官,调节它们的功能。对于计算机系统来说,神经系统就是由CPU载入执行的程序,程序生成各种信号,通过总线传输给各个外部设备,从而调节它们的工作。

计算机的神经系统,可以认为就是外部硬件设备的驱动程序。神经网络就是控制总线,循环系统是数据总线。而生物体内没有地址总线的概念,血管凌乱的分布,并没有一种显式的区分机制来区分各个器官或者组,信号分子可以遍布周游全身。

5.计算机的运动系统

计算机本身是一堆电路和芯片,不存在运动的概念。但是如果向计算机接口上接入了可以运动的部件,比如打印机、电动机、硬盘等,那么这些设备就可以在计算机控制信号(神经信号)的驱动下做运动,并且可以打印或者读写数据。

6.计算机的生殖系统

目前,计算机系统表现的生殖能力,只是在一个硬件中生成不同的软件。软件通过CPU的执行,可以任意复制自身,并可以形成新的逻辑。在这种逻辑下,程序通过无数次的复制,难免在一些细微的Bug或者电路干扰的情况下发生奇特的变化,这些变化一开始可能不太会表现出来,但是随着量变的积累,就会引发质变,发生进化。

当然,计算机系统完全可以物理复制硬件,即通过程序控制外部机器,来生产新的计算机硬件,然后将软件复制到硬件上,继续繁殖。

7.1.3 个体间交流是群体进化的动力

人也好,计算机也好,他们之间都在不停地交流着。人和人的交流,让人类得到了进化。同样,计算机之间的交流,也会让计算机得到进化。交流是进化的动力,不可能有某种事物会完全脱离外界的刺激而自身进化。

OSI便是这种交流所遵循的一张蓝图。

7.2 系统与系统之间的语言——OSI初步

OSI模型是一种被提取抽象出来的系统间通信模型。OSI中文的意思为“开放式系统互联”模型,是一个描述两个或者多个系统之间如何交流的通用模型。它不只适合于计算机系统互联,而且适合任何独立系统之间的互联。比如,人体和人体之间的通信,或者人体和计算机之间的通信,都可以用OSI模型来描述。

比如我和你之间需要交流,我们面对面坐着,此时我有一句话要和你说:“您好,您怎么称呼?”

首先,我要说出这句话,要在脑海中生成这句话,即在语言处理单元中根据要表达的意思,生成符合语法的数据。然后通过神经将数据信号发送到声带、咬肌、舌头和口形固定之后,使声带振动。声带振动导致口腔空气共振,发出声音,经过空气机械波振动,到达你的耳膜接收器,耳膜被机械波谐振于一定频率,耳膜的振动通过神经信号传导到大脑,大脑相关的处理单元进行信号的解调,最终从神经信号中提取出我说的话“您好,您怎么称呼?”,这句话在大脑中,可能是离子流产生的模拟电信号,也可能是通过其他形式表示,比如一套编码系统。这句话被传送到大脑的语言处理单元,这个单元分析这句话,“您好”是一个问候语,当你知道我在问候你的时候,你的大脑会在这个“您好”信号的刺激下,进入一种“礼貌”逻辑运算过程,运算生成的信号,通过神经传送到你的颈部肌肉,收缩,使你的头部下降,并使面部肌肉收缩,这就完成了点头致意和微笑的动作。

这个过程,与计算机网络通信的模型完全一致。两台计算机之间通过以太网交换机相连,它们之间要进行通信。比如,a计算机想向b计算机发送一个数据包,这个数据包的内容是“打开文件C:\tellme.txt”,过程如下所示。

(1)a计算机首先要在内存中通过双方定义的语言,生成这个数据包。

将这个数据包通过总线发送给TCP/IP协议处理单元,告诉TCP/IP处理单元对方的IP地址和所用的传输方式(UDP或TCP)和端口号。

TCP/IP处理模块收到这个包之后,将它包装好,通过总线发送给以太网卡。

以太网卡对数据包进行编码,然后通过电路将包装好的数据包变成一串电路的高低电平振荡,发送给交换机。

交换机将数据包交换到b计算机的接口。

(2)b计算机收到这串电位流后,将其输送到以太网卡的解码芯片,去掉以太网头,之后产生中断信号,将数据包送到内存。

由TCP/IP协议处理模块对这个数据包进行分析,提取IP头和TCP或UDP头,以便区分应输送到哪个应用程序的缓冲区内存。

最终TCP/IP协议将“打开文件C:\tellme.txt”这句话,成功输送到了b计算机应用程序的缓冲区内存中。

(3)b计算机应用程序提取这句话,分析它的语法,发现a计算机要求它打开C:\tellme.txt文件,则应用程序根据这个命令,调用操作系统打开文件的API执行这个操作。

分析一下上面的过程,我们发现如下内容。

数据总是由原始直接可读状态被转变成电路的电位振荡流,或者频率和振幅不断变化的机械波,也可能转换成一定频率的电磁波。

互相通信的两个系统之间必定要有连通的介质,空气、以太网或者其他形式,电磁波传递不需要介质。

相互通信的双方必须知道自己是在和谁通信。

以上三个要素,就是系统互联通信所具备的“连、找、发”三要素。

■ 连:就是指通信的双方必须用某种形式连通起来,否则两个没有任何形式连通的系统之间是无法通信的。即便是电磁波通信,也至少通过了电磁波连通。

■ 找:是说通信的双方或者多方,必须能够区分自己和对方以及多方(广播系统除外)。

■ 发:定义了通信的双方如何将数据通过连通介质或者电磁波发送到对方。

7.3 OSI模型的七个层次

网络通信三元素抽象模型是对OSI模型的更高层次的抽象。OSI模型将系统间通信划分成了七个层次。

OSI模型的最上面的三层,可以归属到应用层之中,因为这三层都不关心如何将数据传送到对方,只关心如何组织和表达要传送的数据。

7.3.1 应用层

应用层是OSI模型的最上层,它表示一个系统要对另一个系统所传达的最终信息。比如“您好,您怎么称呼?”这句话,就是应用层的数据。应用层只关心应用层自身的逻辑,比如这句话应该用什么语法,应该加逗号还是句号?末尾是否要加一个问号?用“你”还是“您”等这样的逻辑。对于计算机系统来说,上文所述的例子中“open file C:\tellme.txt”,这条指令,就是应用层的数据。应用层程序不必关心这条指令是如何传达到对方的。

7.3.2 表示层

表示层就是对应用层数据的一种表示。如果前面说的“您好,您怎么称呼?”这句话是有一定附加属性的,例如“您好”这两个字要显示在对方的屏幕上,用红色显示在第1行的中央,而“您怎么称呼?”这几个字用蓝色显示在第10行的中央。这些关于颜色、位置等类似的信息,就构成了表示层的内容。

发送方必须用一种双方规定好的格式来表示这些信息,比如用一个特定长度和位置的字段来编码各种颜色(一般用三原色的组合编码来表示),用一个字段来表示行列坐标位置。将这些附加表示层信息字段放置于要表达的内容的前面或后面,接受方按照规定的位置和编码来解析这些表示层信息,然后将颜色和位置信息赋予“您好,您怎么称呼?”这句话,显示于屏幕上。需要强调一点,表示层不一定非得是单独的一个结构体,它可以嵌入在实体数据中。这就是表示层,一些加密等操作就是在表示层来起作用的。

7.3.3 会话层

顾名思义,会话层的逻辑一定是建立某种会话交互机制。这种交互机制实际上是双方的应用程序之间在交互。它们通过交互一些信息,以便确定对方的应用程序处于良好的状态中。比如两个人通电话,拨通之后这个问:“能听清么?”那个说:“能听清,请讲。”这就是一个会话的过程。也就是说通信的双方在发送实际数据之前,先建立一个会话,互相打个招呼,以便确认双方的应用程序都处于正常状态。

应用层、表示层和会话层的数据内容被封装起来,然后交给了我们的货物押运员传输层。

TCP/IP协议体系模型中有4层,即应用层(应用访问层)、传输层、网络层和物理链路层(硬件访问层)。TCP/IP协议体系没有完全按照OSI匹配,它将OSI中的应用层、表示层和会话层统统合并为一层,叫做应用访问层,意思是指这个层全部是与应用程序相关的逻辑,与网络通信无关,应用程序只需调用下层的接口即可完成通信。

7.3.4 传输层

可以说OSI模型中上三层属于应用相关的,可以划入应用层范围,而下四层就属于网络通信方面的。也就是说,下四层的作用是把上三层生成的数据成功地送到目的地。典型的传输层程序如下。

TCP协议的作用就是保障上层的数据能传输到目的地。TCP就像一个货运公司的押运员,客户给你的货物,就要保证给客户送到目的地,而不管你通过什么渠道,是直达(直连路由)还是绕道(下一跳路由),是飞机还是火车、轮船(物理线路类型)。

如果运输过程中出现错误,必须重新把货物发送出去。每件货物到了目的地,必须找收件人签字(TCP中的ACK应答包),或者一批货物到达后,收件人一次签收(滑动窗口)。

最后回公司登记。

提示: TCP还处理拥塞和流量控制。比如调度(路由器)选择了走这条路,但是太拥挤了,那么我也不好说什么,因为选哪条路到达目的是由调度(路由器)说了算,我只管押运。那么我只能通知后续的货物慢一点发货,因为这条路太挤了。当道路变得畅通时,我会通知后面的货物加速发货。这就是TCP的任务。TCP是通过接收方返回的ACK应答数据包来判断链路是否拥挤,比如发了一批货,半天都没接收到对方的签字,证明链路拥塞,有货物被丢弃了,那么就减缓发送速度。当有ACK被接收到后,我会增加一次发送货物的数量,直到再次拥塞。那么调度怎么知道这些货物是送到哪里的呢?这是网络层程序的任务。

注意: 传输层的程序一定要运行在通信双方的终端设备上,而不是运行在中间的网络互联设备上。传输层是一种端到端的保障机制,所谓端到端的保障就是指数据从一端发送到另一端之后,对方必须在它的传输保障时间中成功收到并处理了数据,才能算发送成功。如果只是发送到了对方的网卡缓冲区,此时发生故障,如突然断电,这就不叫端到端的保障。因为数据在网卡缓冲区内,还没有被提交到TCP协议的处理逻辑中进行处理,所以不会返回成功信号给发送方,那么这个数据包就没有被发送成功,发送方会通过超时来感知到这个结果。

7.3.5 网络层

客户把货物交给货运公司的时候,必须填写目的地址(比如IP地址)。只要一个地址就够了,至于到这个地址应该坐几路公交车或哪趟火车等问题,客户统统不管,全部交给网络层处理。

货运公司为每件货物贴上一个地址标签(IP头)。

货运公司的调度们掌握了全球范围的地址信息(路由表),比如去某某地方应该走哪条路。

在选择了一条路之后,就让司机开车上路了。

押运员进行理货和收发货物,没事就在后车厢里睡觉。

此时最忙的是各个中转站的调度了。货物每次中转到一个地方就交给那个地方的调度,由那个调度来决定下一站应该到哪里。

接班的时候,旧调度不必告诉新调度最终目的应该怎么走,因为所有的调度都知道这个目的,一看就知道该走什么路了。

例如,有客户从新疆发货到青岛,由于新疆没有直达青岛的航班或者火车,所以只能先到达北京,然后再从北京直达青岛。

新疆的调度收到货物之后,他查找路由表,发现要到青岛,必须先到北京。新疆的调度会在货物上贴上青岛的标签而不是北京的标签,但是发货的时候,调度会选择将货物运送到新疆到北京的火车上。

货物到达北京之后,北京货运分公司的调度收到这件货物,首先查看这件货物的最终目的地址,然后北京调度也去查找路由表。他的路由表与新疆调度的路由表不同,在他的表上,北京到青岛有直达的火车,所以北京调度立即将货物原封不动的送上去青岛的火车。就这样一站一站的往前送(路由转发),货物最终从新疆到达了青岛。

思考: 那么调度是怎么知道全球地址表(路由表)的呢?这个表的生成是一个复杂的学习阶段,可以通过调度自行学习或者调度之间相互通告,也可以通过手工录入。前者称为动态路由,后者称为静态路由。

路由器充当的就是调度的角色。比如在青岛想访问一个位于北京的服务器,具体步骤如下。

首先必须知道这个服务器的IP地址,然后用这个IP地址作为最终目的地址组装成数据包,发送给位于青岛的Internet提供商机房中的路由器。

这个路由器收到这个包后,解析其目的IP地址,然后查找其路由表,发现这个目的IP地址的包应该从1号端口转发出去,所以它立即将这个包原封不动地向一号口转发。一号口通过光缆直接连接到了位于河北机房中的另一台路由器。

提示: 当然青岛到河北之间不可能只用一条连续不断的光缆连接,中途肯定经过一些光缆通信中继站。

河北的路由器收到这个IP包后,同样根据目的IP地址查找路由表,发现这个目的地址的包应该从8号端口中转发,它立即将这个包转发向8号端口。

8号端口通过光缆直接连接到了位于北京机房的一台路由器。

这台路由器同样查找路由表做转发动作。

经过一层层的寻找,最终找到了北京的这台服务器,将这个包传送到这台服务器的网卡,并提交到TCP/IP协议处理内存空间中。

经过解析和处理,服务器发现最终的数据是一个TCP握手数据包,然后TCP/IP程序立刻返回一个确认包,再次返回给服务器一个确认包。三次握手完成后,就可以向服务器发送HTTP请求来获取它的网页资源了。

7.3.6 数据链路层

数据链路层就是指连通两个设备之间的链路,数据要经过这条链路来传递给对方。数据链路层的程序将上层的数据包再次打包成对应链路的特定格式,按照对应链路的规则在链路上传输到对方。

数据链路就好比交通规则。在高速公路或者铁路上是需要遵守规则的,不能超速,不能乱停车,不能开车灯到最亮等。上路之前,先要看看公路的质量怎么样,是不是适合跑车或者先和对方商量一下传输的事宜。这就是链路层协商。

链路层的作用

首先是协商链路参数,比如双工、速率、链路质量等。

其次是将上层数据内容打包成帧,加上同步头进行传输,一次传输一句或者一个字符一个字符的传输(取决于上层的选择)。

最后,链路层程序调用物理层提供的接口,将帧提交给物理层。

相对于传输层的保障来说,OSI的数据链路层也提供一些保障机制。比如一些链路层协议会在每个帧后面加一个校验字段,如果对方收到的帧的校验值与这个校验字段不符,则证明链路受到干扰,数据产生畸变,那么就将这一帧视为无效帧直接丢弃,不会向上层报告这个错误,因为上层对链路层的错误不关心。而接收方的传输层协议会感知某个包没有到达或者不完整,接收方的传输层协议会要求发送方重新传送这个不完整或者没有接收到的包,也就是端到端的保障传输。链路层只侦错,不纠错,而传输层既侦错,又纠错。

根据OSI模型,两台路由器或者交换机之间传送数据也属于两个系统间的互联,那么它们也一定遵循OSI的模型。下面就来分析一下两台PC之间通信和两个路由器之间通信有什么区别。PC间通信我们上文已经描述过,下面来讲一下路由间的通信。

简单的路由器设备工作在OSI的第三层,即网络层。它只处理下三层的内容,只有下三层的处理逻辑,而没有上四层的处理逻辑。路由器收到包后,只检查包中的IP地址,不会改变任何IP头之上的其他内容,最简单的路由器甚至不会改变IP头。在一些带有诸如NAT功能的路由器上,可能会对IP包的源或者目的IP地址做修改。数据包流入路由器后,路由器只分析到第三层的IP头,便可以根据路由表完成转发逻辑。

如图7-1所示为通信路径上各个设备所作用的层次示意图,具体过程如下。

图7-1 通信路径上各个设备所作用的层次

左边的PC机A连接到路由器A的以太网卡1上,路由器A的以太网卡2与路由器B的以太网卡2相连,右边的PC机B连接到路由器B的以太网卡1上。此时,要用PC机A上的IE浏览器访问位于PC机B上的Web服务,在IE浏览器的地址栏中输入PC机B的IP地址并按Enter键后,IE浏览器便会调用WinSock接口来访问操作系统内核的TCP/IP协议栈。IE浏览器告诉TCP/IP协议栈它所访问的目的IP地址和目的端口,并把要发送的数据告诉TCP/IP协议栈。IE浏览器发送给PC机B的数据,当然是一个HTTP GET请求,具体内容属于上三层,在这里不关心也不做分析。

TCP/IP协议栈收到这个数据之后,发现IE浏览器与PC机B当前并不存在连接,所以它首先要向PC机B上的TCP/IP协议栈发起连接请求,也就是TCP的三次握手过程。PC机A的TCP/IP协议栈先组装第一次握手IP包,组好后发送给操作系统内核缓冲区,内核调用网卡驱动程序从缓冲区内将这个IP包编码并在线路上传递出去。握手数据包很小,只要一个以太网帧就可以容纳。

这个帧最终到达路由器A的以太网卡1缓冲区内。以太网卡1产生中断信号,然后将这个帧去掉以太网头,发送到路由器A的内存中,等待IP转发逻辑模块的处理。运行在路由器A上的IP转发逻辑模块,其实就是IP路由协议计算模块,这个模块分析此IP包的头部目的IP地址,查找路由表以确定这个包将从哪个接口发送出去。IP路由运算一定要快速高效,才不至于对网络性能造成瓶颈。

路由器A查找路由表发现这个包应当从以太网卡2转发出去,所以它立即将这个包发送到以太网卡2并通过线路传送到了路由器B的以太网卡2上。经过同样的过程,路由器B将这个包路由到PC机B的以太网卡缓冲区内,PC机B的网卡产生中断,将这个包通过总线传送到PC机B的TCP/IP协议栈缓冲区内存。

运行在PC机B上的TCP/IP协议栈程序分析这个包,发现IP是自己的,TCP端口号为80,握手标识位为二进制1,就知道这个连接是由源地址IP所在的设备向自己的80端口,也就是Web服务程序所监听的端口发起的握手连接。根据这个逻辑,TCP/IP协议栈返回握手确认IP包给PC机A,PC机A再返回一个最终确认包,这样就完成了TCP的三次握手。

握手成功后,PC机A上的TCP/IP协议栈立即在其缓冲区内将由IE浏览器发送过来的HTTP GET请求数据组装成TCP/IP数据包,发送给PC机B。PC机B得到这个数据包之后,分析其TCP端口号,并根据对应关系将数据放到监听这个端口的应用程序的缓冲区内存。

应用程序收到这个GET请求之后,便会触发Web服务逻辑流程,返回Web网页数据,同样经由PC机B的TCP/IP协议栈,发送给PC机A。

上述过程是一个正常通信的过程。

提示: 如果在PC机B向PC机A传送网页数据的时候,路由器A和路由器B之间的链路发生了几秒钟的短暂故障后又恢复连通性,这期间丢失了很多数据。虽然这样,依靠TCP协议的纠错功能,数据依然会被顺序的传送给PC机A。

我们就来分析一下TCP是如何做到的。假如,在链路中断的时候,恰好有一个帧在链路上传送。发生故障后,这个帧就永久的丢失了。即使链路恢复后,路由器也不会重新传送这个帧。但PC机B由于很长时间都没有收到PC机A的确认信息,便知道刚才发送的数据包可能已经被中途的网络设备丢弃了,所以PC机B上的TCP协议将重新发送这个数据包。

提示: 未接收到确认的包会存放在缓冲区内,不会删除,直到收到对方确认。

所以,即便中途经过的网络设备将这个包丢弃了,运行在通信路径最两端的TCP/IP协议,依然会重传这些丢弃的包,从而保障了数据传输,这也就是端到端的传输保障。只有端到端的保障,才是真正的保障,因为中途网络设备不会缓存发送的数据,更不会自动重传。

7.3.7 物理层

物理层的作用就是研究在一种介质上(或者真空)如何将数据编码发送给对方。如果选择公路来跑汽车,要根据沥青路或者土路来选用不同的轮胎;如果选择利用空气来跑飞机,则需根据不同的气流密度来调整飞行参数;如果选择了真空,则只能利用电磁波或者光来传输,可以根据障碍物等因素选择不同波长的波来承载信号;如果选择了海水,则要根据不同的浪高来调整航海参数。这些都是物理层所关心的。

物理层和链路层的区别

物理层和链路层是很容易混淆的两个层次。链路层是控制物理层的。物理层好比一个笨头笨脑的传送带,它不停地在运转,只要有东西放到传送带上就会被运输到对方。不管给它什么东西,它都一视同仁并且不会停下。

假设你我之间有一个不停运转的传送带,某时刻我有一大批货物要传送给你,是否可以一股脑的把这些货物不停地放到传送带上,一下子传送给你呢?当然可以,但是那样将没有整理货物的时间,永远处于不停地从传送带上拿下货物的状态,货物越堆越多,最终造成崩溃。如果能将货物一批一批的传送过来,不但给予了双方充足的整理货物的时间,而且使得货物传输显得井井有条。而将货物分批这件事,传送带本身是不会做的,只能靠TCP或者IP来做。链路层给每批货物附加上一些标志性的头部或者尾部,接收方看到这些标志,就知道一批货物又来了,并做接收动作。

每种链路,都有自己的一个最适分批大小,叫做最大传输单元,MTU。每次传输,链路上最大只能传输MTU大小的货物。如果要在一次传输中传送大于这个大小的货物,超过了链路接收方的处理吞吐量,则可能造成接收方缓冲区溢出或者强行截断等错误。

TCP和IP这两个协议程序都会给货物分批。第一个分批的是TCP,下到IP这一层,又会根据链路层的分批大小来将TCP已经分批的货物再次分批,如果TCP分批小于链路层分批,则IP不需要再分。如果是大于链路层的分批,则IP会将货物分批成适合链路层分批的大小。被IP层分批的货物,最终会由接收方的IP层来再组装合并,但是由TCP分批的货物,接收方的TCP层不会合并,TCP可以任意分割货物进行发送而接收的时候并不做合并的动作。对货物的处理分析全部交由上层应用程序来处理,所以利用TCP/IP通信的应用程序必须对自己所发送的数据有定界措施。

说白了,物理层就是用什么样的线缆、什么样的接口、什么样的物理层编码方式,归零还是不归零,同步方式,外同步还是内同步,高电压范围,低电压范围,电气规范等的东西。

通过物理层编码后,我们的数据最终变成了一串比特流,通过电路振荡传输给对方。对方收到比特流后,提交给链路层程序,由程序处理,剥去链路层同步头、帧头帧尾、控制字符等,然后提交给网络层处理程序(TCP/IP协议栈等)。IP头是个标签,收件人通过IP头来查看这个货物是谁发的。TCP头在完成押运使命之后,还有一个作用就是确定由哪个上层应用程序来处理收到的包(用端口号来决定)。应用程序收到TCP提交的数据后,进行解析处理。

7.4 OSI与网络

网络就是由众多节点通过某种方式互相连通之后所进行的多点通信系统。既然涉及到节点与节点间的通信,那么就会符合OSI模型。

首先我们看看计算机总线网络。CPU、内存、外设三者通过总线互相连接起来,当然总线之间还有北桥和南桥,这两个芯片犹如IP网络中的IP路由器或者网桥。CPU与内存这两个部件都连接到北桥这个路由器上,然后北桥连接到南桥,南桥下连一个HUB总线,HUB上连接了众多的外设,这些外设共享这个HUB与南桥进行通信。

提示: 说到HUB,不要认为是专指以太网中的HUB,HUB的意思就是一条总线。如果在这条总线上运行以太网协议,则就是以太网HUB;如果在这条总线上运行的是PCI协议,则就是PCI HUB(PCI总线)。

连接到以太网HUB上的各个节点,采用CSMA/CD的竞争机制来获取总线使用权,PCI总线同样采用仲裁竞争机制,只是实现方式不同。实现方式也可以称为协议,所以有以太网HUB和PCI HUB之分,也就是说HUB上运行的是不同的协议。当然以太网HUB设计要求远远比PCI HUB低,速度也低很多。

图7-2所示的模型是一个常见的小型网络,几台PC通过以太网HUB和路由器互相连接起来,然后通过运行在每台PC上的TCP/IP协议来通信。路由器的作用只是分析目的IP地址从而做转发动作。

而我们再观察一下图7-3,发现除了连接各个组件之间的线路变成了并行多线路之外,其他没有什么大的变化。但是,这两个网络的通信过程是有区别的。上面的网络利用一种高级复杂的协议——TCP/IP协议来通信,而图7-3所示的网络是通过直接总线协议进行通信。在下面的网络中,各个部件之间的连线非常短,速度很高且非常稳定,自身就可以保障数据的稳定传输,所以不需要TCP这种传输保障协议的参与。在上面的网络中,各个部件之间可能相隔很远的距离,链路速度慢,稳定性不如主板上的导线高,所以必须运行一种端到端的传输保障协议,比如TCP协议,来保障端到端的数据传输。

图7-2 一个典型的网络

图7-3 计算机总线网络

此外,上面的两个网络模型,其本质是相同的,因为它们两个都是从基本原理发展而来的。我们说,这两个网络模型都符合OSI这个抽象模型。再甚者,这两个模型都符合“连、找、发”抽象模型。

首先,所有部件之间都用了导线来连接。对于第一个模型,导线为双绞线或者其他形式的外部电缆;对于第二个模型,导线为电路板上印刷的蛇行线。这就是所谓“连”。

其次,这两个模型中都有寻址的逻辑。第一个模型利用IP地址作为寻址方法;第二个模型中利用地址总线作为寻址方法。这就是所谓“找”。

提示: 生物细胞之间的通信,同样符合OSI模型和“连找发”模型。细胞之间通过血管来传递信息,这就是“连”;通过配体-受体关系来找到目标,这就是“找”;血液流动将配体分子传递(广播)到人体的每个角落,这就是“发”。我国分子生态学创始人向近敏曾经提出分子信息网络学说,就恰恰体现了网络的思想。在分子上层,还有细胞信息网络学说和遗传信息网络学说,它们一个比一个高层,一个比一个抽象。然而分子信息网络也不一定就是最底层的网络,或许还有原子信息网络、电子信息网络等。

最后,第一个模型利用TCP协议进行有保障的数据发送动作,第二个模型中由于线路非常稳定,不需要高级协议参与,而是直接利用电路逻辑从目标部件将数据复制过来。这就是所谓“发”。

网中有网

我们在以前的章节中,多次提到过“网中有网”这个词。而我们现在再来体会一下,发现计算机系统、计算机网络、Internet,这些系统,确实可以用网中有网来描述。计算机总线这个微型网络,通过一个网卡,接入以太网交换机或者HUB,与其他计算机总线网络形成一个局域网,然后这个局域网再连接到路由器网关,从而连接到更大的网络,甚至Internet。

所有的网络,都按照OSI和“连找发”模型有条不紊地通信交互着,为我们服务。分子之间和细胞之间神奇地相互作用着,地球和月球有条不紊地旋转运行着,太阳系缓慢地自转,并围绕着更大的银河系旋转。 dF5cf5buzFTjJR9Q2G9rcxwYgMOFVfBVr9K65xSYogFy1snNLnRpQilF1UW1lpQ2



第8章
勇破难关
——Fibre Channel协议详解

本书的第6.8节,引出了SAN的概念。SAN首先是个网络,而不是指存储设备。当然,这个网络是专门用来给主机连接存储设备用的。这个网络中有着很多的元件,它们的作用都是为了让主机更好地访问存储设备。

SAN概念的出现,只是个开头而已,因为按照SCSI总线16个节点的限制,不可能接入很多的磁盘。要扩大这个SAN的规模,还有很长一段路要走。如果仅仅用并行SCSI总线,那么SAN只能像PCI总线一样作为主机的附属品,而不可能成为一个真正独立的“网络”。必须找到一种可寻址容量大、稳定性强、速度快、传输距离远的网络结构,从而连接控制器和磁盘或者连接控制器到主机。

干脆破釜沉舟,独立研发一套全新的网络传输系统,专门针对局部范围的高速高效传输。

然而,形成一套完整的网络系统并非易事,首先必须得有个蓝图。这个蓝图是否有现成可以参考的呢?当然有,OSI就是一个经典的蓝图。OSI是对任何互联系统的抽象。

8.1 FC网络——极佳的候选角色

FC协议自从1988年出现以来,已经发展成为一项非常复杂、高速的网络技术。它最初并不是研究来作为一种存储网络技术的。最早版本的FC协议是一种为了包括IP数据网在内的多种目的而推出的高速骨干网技术,它是作为惠普、Sun和IBM等公司组成的R&D实验室中的一项研究项目开始出现的。曾经有几年,FC协议的开发者认为这项技术有一天会取代100BaseT以太网和FDDI网络。在20世纪90年代中期,还可以看到研究人员关于FC技术的论文。这些论文论述了FC协议作为一种高速骨干网络技术的优点和能力,而把存储作为不重要的应用放在了第二位。

Fibre Channel也就是“网状通道”的意思,简称FC。

提示: 由于Fiber和Fibre只有一字之差,所以产生了很多流传的误解。FC只代表Fibre Channel,而不是Fiber Channel,后者被翻译为“光纤通道”,甚至接口为FC的磁盘也被称为“光纤磁盘”,其实这些都是很滑稽的误解。

不过到目前为止,似乎称FC为光纤而不是直接称其FC的文章和资料更多。这种误解使得初入存储行业的人摸不着头脑,认为FC就是使用光纤的网络,甚至将FC与使用光纤传输的以太网链路混淆起来。在本书内不会使用“光纤通道”或者“光纤磁盘”这种定义,而统统使用FC和“FC磁盘”。相信在阅读完本章之后,大家就不会再混淆这些概念了,会知道FC与光纤根本就没有必然的联系。

Fibre Channel可以称为FC协议,或FC网络、FC互联。像TCP/IP一样,FC协议集同样具备TCP/IP协议集以及以太网中的很多概念,比如FC交换、FC交换机、FC路由、FC路由器,SPF路由算法等。我们完全可以类比地看待TCP/IP协议以及FC协议,因为它们都遵循OSI的模型。任何互联系统都逃不过OSI模型,不可能存在某种不能归属于OSI中某个层次的元素。

下面我们用OSI来将FC协议进行断层分析。

8.1.1 物理层

OSI的第一层就是物理层。作为一种高速的网络传输技术,FC协议体系的物理层具有比较高的速度,从1Gb/s、2Gb/s、4Gb/s到当前的8Gb/s。作为高速网络的代表,其底层也使用了同步串行传输方式,而且为了保证传输过程中的电直流平衡、时钟恢复和纠错等特性,其传输编码方式采用NMb编码方式。

为了实现远距离传输,传输介质起码要支持光纤。铜线也可以,但是距离受限制。FC协议集中物理层的电气子层名为FC0,编码子层名为FC1。

8.1.2 链路层

1.字符编码以及FC帧结构

现代通信在链路层一般都是成帧的,也就是将上层发来的一定数量的位流打包加头尾传输。FC协议在链路层也是成帧的。既然需要成帧,那么一定要定义帧控制字符。

FC协议定义了一系列的帧控制策略及对应的字符。这些控制字符不是ASCII码字符集中定义的那些控制字符,而是单独定义了一套专门用于FC协议的字符集,称为“有序集”。其中的每个控制字符其实是由4个8位字节组成的,称为一个“字”(word),而每个控制字开头的一个字节总是经过8 10b编码之后的0011111010(左旋)或者1100000101(右旋)。

由于还没有标准名词出现,所以不得不引入“左旋”和“右旋”这两个化学名词来描述这种镜像编码方式。左旋和右旋是指1和0对调。编码电路可以根据上一个10位中所包含的1的个数来选择下一个10位中1的个数。如果上一个1的个数比0的个数少,那么下一个10位中就编码成1的个数比0的个数多,这样总体平衡了1和0的个数。

0011111010左旋或者1100000101右旋,FC协议给这个字符起了一个名字,叫做K28.5。这个字未经过8 10b编码之前的值是十六进制BC,即10111100,它的低5位为11100(十进制的28),高3位为101(十进制的5)。FC协议便对这个字表示为“K28.5”,也就是说高三位的十进制是5,低5位的十进制是28,这样便可以组合成相应的二进制位码。然后再加上一个描述符号K(控制字符)或者D(数据字符)。K28.5这个字符没有ASCII字符编码与其冲突,它的二进制流中又包含了连续的5个1,非常容易被电路识别,当然符合这些条件的字符还有好几个。

每个控制字均由K28.5字符开头,后接3个其他字符(可以是数据字符),由这4个字符组成的字来代表一种意义,比如SOF(Start Of Frame)、EOF(End Of Frame)等。

定义了相关的控制字之后,需要定义一个帧头了。FC协议定义了一个24B的帧头。以太网帧头才14B,用起来还绰绰有余,为什么FC需要定义24B呢?在这个问题上,协议的设计者独树一帜,因为这24B的帧头不但包含了寻址功能,而且包含了传输保障的功能。网络层和传输层的逻辑都用这24B的信息来传递。

我们知道,基于以太网的TCP/IP网络,它的开销一共是:14B(以太网帧头)+20B(IP头)+20B(TCP头)=54B,或者把TCP头换成8B的UDP头,一共是42B。这就注定了FC的开销比以太网加上TCP/IP的开销要小,而实现的功能都差不多。

可以看出,以太网中用于寻址的开销太大,一个以太网MAC头和一个IP头这两个就已经34B了,更别说再加上TCP头了。而FC将寻址、传输保障合并起来放到一个头中,长度才24B。图8-1所示的是一个FC帧的示意图,图8-2是一个FC帧编码之后的表示。

图8-1 一个FC帧的结构

图8-2 一个完整的FC帧的有序集表示

2.链路层流量控制

在链路层上,FC定义了两种流控策略:一种为端到端的流控,另一种为缓存到缓存的流控。端到端流控比缓存到缓存流控要上层和高级。在一条链路的两端,首先面对链路的一个部件就是缓存。接收电路将一帧成功接收后,就放入了缓存中。如果由于上位程序处理缓慢而造成缓存已经充满,FC协议还有机制来通知发送方减缓发送。如果链路的一端是FC终端设备,另一端是FC交换机,则二者之间的缓存到缓存的流量控制只能控制这个FC终端到FC交换机之间的流量。

而通信的最终目标是网络上的另一个FC终端,这之间可能经历了多个FC交换机和多条链路。而如果数据流在另外一个FC终端之上发生拥塞,则这个FC终端就必须通知发起端降低发送频率,这就是“端到端”的流量控制。图8-3示出了这两种机制的不同之处。

图8-3 B2B和E2E两种方式的流量控制示意图

3.MTU

一般情况下,以太网的MTU为1500B,而FC链路层的MTU可以到2112B。这样,FC链路层相对以太网链路层的效率又提高了。

8.1.3 网络层

1.拓扑

与以太网类似,FC也提供了两种网络拓扑模式:FC-AL和Fabric。

FC-ALFC-AL拓扑类似于以太网共享总线拓扑,但是连接方式不是总线,而是一条仲裁环路(Arbitral Loop)。每个FC AL设备首尾相接构成了一个环路。一个环路能接入的最多节点是128个,实际上是用了一个字节的寻址容量,但是只用到了这个字节经过810b编码之后奇偶平衡(0和1的个数相等)的值,也就是256个值中的134个值来寻址,这些被筛选出来的地址中又被广播地址、专用地址等占用了,最后只剩下127个实际可用的节点地址。

图8-4为4个FC-AL设备接入一个仲裁环的拓扑图。仲裁环是一个由所有设备“串联”形成的闭合环路。如果某个设备发生故障,这个串联的环路是不是就会全部瘫痪呢?在FC-AL集线设备的每个接口上都有一套“旁路电路”(Bypass Circuit),这套电路一旦检测到本地设备故障或电源断开,就会自动将这个接口短路,从而使得整个环路将这个故障的设备Bypass掉,不影响其他设备的工作。

数据帧在仲裁环内是一跳一跳被传输的,并且任何时刻数据帧只能按照一个方向向下游传输。图8-5为AL环路数据帧传输机制的示意图。

图8-4 FC仲裁环结构示意图

图8-5 AL环路数据帧传输机制示意图

在图8-5所示的仲裁环中,若a节点想与h节点通信,在a节点赢得仲裁之后,便向h节点发送数据帧。然而,由于这个环的数据是顺时针方向传递的,所以a发出的数据帧,只能先被b节点收到,由b节点接着传递到c节点,依次传递,最终传递到h节点。所以,虽然a和h节点之间只有一跳的距离,但是仍然需要绕一圈来传递数据。

Fabric另一种Fabric拓扑和以太网交换拓扑类似。Fabric的意思为“网状构造”,表明这种拓扑其实是一个网状交换矩阵。

交换矩阵的架构相对于仲裁环路来说,其转发效率大大提高了,联入这个矩阵的所有节点之间都可以同时进行点对点通信,加上包交换方式所带来的并发和资源充分利用的特性,使得交换架构获得的总带宽为所有端口带宽之和。而AL架构下,接入环路的节点不管有多少,其带宽总为恒定,即共享的环路带宽。

图8-6为一个交换矩阵的示意图。每个FC终端设备都接入了这个矩阵的端点,一个设备发给另一个设备的数据帧被交换矩阵收到后,矩阵便会“拨动”这张矩阵网交叉处的开关,以连通电路,传输数据。可以将这个矩阵想象成一个大的电路开关矩阵,矩阵根据通信的源和目的决定拨动哪些开关。这种矩阵被做成芯片集成到专门的交换机上,然后辅以实现FC逻辑的其他芯片或CPU、ROM,就形成了一台用于Fabric交换的交换机。

图8-7所示的是一台Fabric交换机。FC设备通过光纤或者铜线等各种标注的线缆连接到这台交换机上,便可以实现各个节点基于FC Fabric拓扑方式的点对点通信。

图8-6 Cross Bar交换矩阵示意图

图8-7 Brocade公司的FC交换机

FC交换拓扑寻址容量是2的24次方个地址,比以太网理论值(2 48)少。即便是这样,对于专用的存储网络来说也足够了,毕竟FC设计的初衷是用于存储网络的一种高速高效网络。

2.寻址

任何网络都需要寻址机制,FC当然也不例外了。

首先,像以太网端口MAC地址一样,FC网络中的每个设备自身都有一个WWNN(World Wide Node Name),不管这个设备上有多少个FC端口,设备始终拥有一个固定的WWNN来代表它自身。然后,FC设备的每个端口都有一个WWPN(World Wide Port Name,世界范围的名字)地址,也就是说这个地址在世界范围内是唯一的,世界上没有两个接口地址是相同的。

FC Fabric拓扑在寻址和编址方面与以太网又有所不同。具体体现在以太网交换设备上的端口不需要有MAC地址,而FC交换机上的端口都有自己的WWPN地址。这是因为FC交换机要做的工作比以太网交换机多,许多智能和FC的逻辑都被集成在FC交换机上,而以太网的逻辑相对就简单了许多,因为上层逻辑都被交给诸如TCP/IP这样的上层协议实现了。然而FC的Fabric网中,FC交换机担当了很重要的角色,它需要处理到FC协议的最上层。每个FC终端设备除了和最终通信的目标有交互之外,还需要和FC交换机打好交道。

WWNN每个FC设备都被赋予一个WWNN,这个WWNN一般被写入设备的ROM中不能改变,但是在某些条件下也可以通过运行在设备上的程序动态的改变。

WWPN和三个IDWWPN地址的长度是64位,比以太网的MAC地址还要长出16位。可见FC协议很有信心,认为FC会像以太网一样普及,全球会产生264个FC接口。然而,如果8B长度的地址用于高效路由的话,无疑是梦魇(IPv6地址长度为128b,但是鉴于Internet的庞大,也只好牺牲速度换容量了)。所以FC协议决定在WWPN之上再映射一层寻址机制,就是像MAC和IP的映射一样,给每个连接到FC网络中的接口分配一个Fabric ID,用这个ID而不是WWPN来嵌入链路帧中做路由。这个ID长24位,高8位被定义成Domain区分符,中8位被定义为Area区分符,低8位定义为PORT区分符。

这样,WWPN被映射到Fabric ID,一个Fabric ID所有24b又被分成Domain ID、Area ID、Port ID这三个亚寻址单元。

■ Domain ID:用来区分一个由众多交换机组成的大的FC网络中每个FC交换机本身。一个交换机上所有接口的Fabric ID都具有相同的高8位,即Domain ID。Domain ID同时也用来区分这个交换机本身,一个Fabric中的所有交换机拥有不同的Domain ID。一个多交换机组成的Fabric中,Domain ID是自动被主交换机分配给各个交换机的。根据WWNN号和一系列的选举帧的传送,WWNN最小者获胜成为主交换机,然后这个主交换机向所有其他交换机分配Domain ID,这个过程其实就是一系列的特殊帧的传送、解析和判断。

■ Area ID:用来区分同一台交换机上的不同端口组,比如1、2、3、4端口属于Area 1,5、6、7、8端口属于Area 2等。其实Area ID这一层亚寻址单元意义不是很大。我们知道,每个FC接口都会对应一块用来管理它的芯片,然而每个这样的芯片却可以管理多个FC端口。所以如果一片芯片可以管理1、2、3、4号FC端口,那么这个芯片就可以属于一个Area,这也是Area的物理解释。同样,在主机端的FC适配卡上,一般也都是用一块芯片来管理多个FC接口的。

■ Port ID:用来区分一个同Area中的不同Port。

经过这样的3段式寻址体系,可以区分一个大Fabric中的每个交换机、交换机中的每个端口组及每个端口组中的端口。

3.寻址过程
1)地址映射

既然定义了两套编址体系,那么一定要有映射机制,就像ARP协议一样。FC协议中地址映射步骤如下。

当一个接口连接到FC网络中时,如果是Fabric架构,那么这个接口会发起一个登录注册到Fabric网络的动作,也就是向目的Fabric ID地址FFFFFE发送一个登录帧,称为FLOGIN。

交换机收到地址为FFFFFE的帧之后,会动态地给这个接口分配一个24b的Fabric ID,并记录这个接口对应的WWPN,做好映射。

此后这个接口发出的帧中不会携带其WWPN,而是携带其被分配的ID作为源地址。

提示: 以太网是既携带MAC地址,又携带IP地址,在效率上打了折扣。

如果接口是连接到FC仲裁环网络中,那么整个环路上的节点会选出一个临时节点(根据WWPN号的数值,最小的优先级最高),然后由这个节点发送一系列的初始化帧,给每个节点分配环路ID。

提示: FC网络中的FCID都是动态的,每个设备每次登录到Fabric所获得的ID可能不一样。同样,FC交换机维护的Fabric ID与WWPN的映射也是动态的。

图8-8所示的是FC设备登录到Fabric过程示意图。

图8-8 FC设备登录Fabric网络的过程

2)寻址机制

编址之后就要寻址,寻址则牵扯到路由的概念。

一个大的FC网络中,一般有多台交换机相互连接,它们可以链式级联,也可以两两连接,甚至任意连接,就像IP网络中的路由器连接一样,但是FC网络不需要太多的人工介入。如果将几台交换机连接成一个FC网络,则它们会自动地协商自己的Domain ID,这个过程是通过选举出一个WWPN号最小的交换机来充当主交换机,由主交换机来向下给每个交换机分配Domain ID,以确保不会冲突。

对于寻址过程,这些交换机上会运行相应的路由协议。最广泛使用的路由协议就是SPF(最短路径优先)协议,是一种很健壮的路由协议。比如用于IP网络中的OSPF协议,FC网络也应用了这种协议。这样就可以寻址各个节点,进行各个节点无障碍地通信。

IP网络需要很强的人为介入性,比如给每个节点配置IP地址,给每个路由器配置路由信息及IP地址等,这样出错率会很高。FC网络中自动分配和管理各种地址,避免了人算带来的错误。FC采用自动分配地址的策略,一个最根本的原因是FC从一开始就被设计为一个专用、高效、高速的网络,而不是给Internet用的,所以自动分配地址当然适合它。如果给Internet也自动分配地址,那么后果不堪设想。

既然要与目的节点通信,怎么知道要通信的目标地址是多少呢?我们知道,FC被设计为一个专用网络,一个小范围、高效、高速、简易配置的网络。所以使用它的时候也非常简便,就像在Windows中浏览网上邻居一样。

每个节点在登录到FC网络并且被分配ID之后,会进行一个名称注册过程,也就是接口上的设备会向一个特定的目的ID发一系列的注册帧,来注册自己。这个ID实际上并没有物理设备与其对应,只是运行在交换机上的一套名称服务程序而已,而对于终端FC设备来说,会认为自己是在和一个真实的FC设备通信。对于Windows系统来说,每台机器启动之后,如果设置了WINS服务器,会向WINS服务器来注册自己的主机名和IP地址。

每台机器都这么做,所以网络中的WINS服务器就会掌握网络中的所有机器的主机和IP。同样,FC交换机上运行的这个名称服务程序,就相当于WINS服务器。但是其地址是唯一的、特定的,不像WINS服务器可以被配置为任何IP地址。也就是说在FC协议中,这个地址是大家都公认不会去改变的,每个节点都知道这个地址,所以都能找到名称服务器。其实不是物理的服务器,只是运行在FC交换机上的程序,也可以认为FC交换机本身就是这台服务器。

节点注册到名称服务之后,服务便会将网络上存在的其他节点信息告诉这个接口上所连接的设备,就像浏览网上邻居一样,所以这个接口上的设备便知道了网络上的所有节点和资源。

ZONE为了安全性考虑,可以进行人为配置,让名称服务器只告诉某个设备特定的节点。比如网络上存在a、b、c、d四个节点,可以让名称服务只向a通告b、c两个节点的存在,而隐藏d节点,这样a看不到d。但是这样做有时候会显得很不保险,因为a虽然没有通过名称服务得到d的ID,但是如果将节点d的ID直接告诉节点a的话,那么它就可以和d主动发起通信。而这一切,交换机不做干涉,因为交换机傻傻的认为只要名称服务器没有向a通告d的ID,a就不会和d发起通信。

发生这种结果的原因是在物理上节点a和节点d并没有被分开,a和d总有办法通信。就像有时网上邻居里看不到一台机器,但是它明明在线,那么如果此时知道那台机器的地址,照样可以不通过网上邻居,直接和它通信。如果两个节点被物理隔开了,那么就真的无能为力了。前者实现隔离的方法叫做软ZONE,后者的做法叫做硬ZONE。

所谓ZONE,即分区的意思,同一个分区内的节点之间可以相互通信,不同分区之间的节点无法通信。软ZONE假设大家都是守法公民,名称服务器没有通告的ID就不去连接;而硬ZONE不管是否守法都会从底层硬件上强制隔离,即使某个节点知道了另外分区中某个节点的ID,也无法和对方建立通信,因为底层已经被阻断了。图8-9是一个Fabric ZONE的示意图。

图8-9 一个具有三个ZONE的Fabric

与目标通信从名称服务器得知网络上的节点ID之后,如果想发起和一个节点的通信,那么这个设备需要直接向目的端口发起一个N_PORT Login过程来交换一系列的参数,然后再进行Process Login过程(类似于TCP向特定应用端口发送握手包一样),即进行应用程序间的通信。比如,FC可以承载SCSI协议和IP协议,那么Initiator端就需要向Target端对应的功能发起请求,比如请求FCP类型的Process Login,那么Target端就知道这个连接是用于FCP流量的。这些Login过程其实就是上三层的内容,属于会话层,和网络传输已经没什么关联了。这些Login的帧也必须经过FC下四层来封装并传输到目的地,就像TCP握手过程一样。

名称服务器只是FC提供的所有服务中的一个,其他还有时间服务、别名服务等,这些地址都是事先定死的。

Fabric网络中还有一种FC Control Service,如果节点向这个服务注册,也就是向地址FFFFFD发送一个State Change Registration(SCR)帧,那么一旦整个Fabric有什么变动,比如一个节点离线了,或者一个节点上线了、或者一个ZONE被创建了等,Fabric便会将这些事件封装到Registered State Change Notification(RSCN)帧里发送给注册了这项服务的所有节点。这个动作就像预订新闻一样,通常一旦节点被通知有这些事件发生之后,节点需要重新进行名称注册,以便从名称服务器得到网络上的最新资源情况,也就是刷新一下。

这些众所周知的服务都是运行在交换机内部的,而不是物理上的一台服务器。当然如果愿意的话,也完全可以用物理服务器来实现,不过这样做的话,在增加了扩展性的同时也增加了Fabric的操作难度。

以上描述的都是基于FC交换架构的网络,即Fabric(FC交换网络)。对于FC仲裁环架构的网络没有名称注册过程,环上的每个节点都对环上其他节点了如指掌,可以对任何节点发起通信。

提示: 有些机制可以把环路和交换结构融合起来,比如形成Private loop、Public loop等,这方面会在下文中介绍。

FC的链路层和网络层被合并成一层,统称FC2。

8.1.4 传输层

FC的传输层同样也与TCP类似,也对上层的数据流进行Segment,而且还要区分上层程序,TCP是利用端口号来区分,FC则是利用Exchange ID来区分。每个Exchange(上层程序)发过来的数据包,被FC传输层分割成Information Unit,也就相当于TCP分割成的Segment。然后FC传输层将这些Unit提交给FC的下层进行传输。下层将每个segment当作一个Sequence,并给予一个Sequence ID,然后将这个Sequence再次分割成FC所适应的帧,给每个帧赋予一个Sequence Count,这样便可以保证帧的排列顺序。接收方接收到帧之后,会组合成Sequence,然后根据Sequence ID来顺序提交给上层协议处理。图8-10显示了这种层次结构。图8-11为FC网络上的数据帧传输示意图。

图8-10 FC协议的层次结构

图8-11 Fabric网络上的帧

传输层还有一个重要角色,就是适配上层协议,比如IP可以通过FC进行传输,SCSI指令可以通过FC来传输等。FC会提供适配上层协议的接口,就是IP over FC及SCSI over FC。这里,FC只是给IP和SCSI提供了一种通路,一种传输手段,就像IP over Ethernet和IP over ATM一样。

FC也是通过发送ACK帧来向对方发送确认信息的,这个和TCP的实现思想一样。只不过一个ACK帧是24B加上CRC、SOF、EOF,一共36B,而TCP的ACK帧为14+20+20=54B。两者差别已经很明显了,两个帧看不出来,但是发送多了,差别就看出来了。要看累积效应。当然这么算是很粗略的,还需要包括进链路控制,帧间隙开销等。

在传输层上,FC定义了几种服务类型,也就是类似TCP/IP协议中规定的TCP、UDP。FC协议中的Class 1服务类型是一种面向连接的服务,即类似电路交换的模式,为通信的双方保留一条虚电路,以进行可靠的传输。Class 2类型提供的是一种带端到端确认的保障传输的服务,也就是类似TCP。Class 3类型不提供确认,类似UDP。Class 4类型是在一条连接上保留一定的带宽资源给上层应用,而不是像Class 1类型那样保留整个连接,类似RSVP服务。使用什么服务类型,会在端口之间进行PLogin的时候协商确定。

FC传输层被定义为FC4。

8.1.5 上三层

FC协议的上三层表现为各种Login过程、包括名称服务等在内的各种服务等,这些都是与网络传输无关的,但是的确属于FC协议体系之内的,所以这些内容都属于FC协议的上三层。

8.1.6 小结

综上所述,FC是一个高速高效、配置简单,不需要太多人为介入的网络。基于这个原则,为了进一步提高FC网络的速度和效率,在FC终端设备上,FC协议的大部分逻辑被直接做到一块独立的硬件卡片当中,而不是运行在操作系统中。如果将部分协议逻辑置于主机上运行,会占用主机CPU内存资源。

TCP/IP就是一种运行于主机操作系统上的网络协议,其IP和TCP或者UDP模块是运行在操作系统上的,只有以太网逻辑是运行在以太网卡芯片中的,CPU从以太网卡接收到的数据是携带有IP头部及TCP/UDP头部的,需要运行在CPU中的TCP/IP协议代码来进一步处理这些头部,才能生成最终的应用程序需要的数据。

而FC协议的物理层到传输层的逻辑,大部分运行在FC适配卡的芯片中,只有小部分关于上层API的逻辑运行于操作系统FC卡驱动程序中,这样就使FC协议的速度和效率都较TCP/IP协议高。这么做,成本无疑会增加,但是网络本来就不是为大众设计的,增加成本来提高速度和效率也是值得的。

8.2 FC协议中的七种端口类型

在FC网络中,存在七种类型的接口,其中N、L和NL端口被用于终端节点,F、FL、E和G端口在交换机中实现。

8.2.1 N端口和F端口

N端口和F端口专用于Fabric交换架构中。连入FC交换机的终端节点的端口为N端口,对应的交换机上的端口为F端口。N代表Node,F代表Fabric。用N端口模式连入F端口之后,网络中的N节点之间就可以互相进行点对点通信了。图8-12所示的是N端口和F端口的示意图。

图8-12 N端口和F端口

8.2.2 L端口

L端口指仲裁环上各个节点的端口类型(LOOP)。环路上的所有设备可以通过一个FCAL的集线器相连,以使得布线方便,故障排除容易。当然,也可以使用最原始的方法,就是首尾相接。图8-13所示的是利用集线器连接的拓扑。

图8-13 基于FCAL集线器的FCAL环路连接

1.私有环

私有环,就是说这个FC仲裁环是封闭的,只能在这个环中所包含的节点之间相互通信,而不能和环外的任何节点通信。

2.开放环

这个环是开放的,环内节点不但可以和环内的节点通信,而且也可以和环外的节点通信。也就是说可以把这个环作为一个单元连接到FC交换机上,从而使得环内的节点可以和位于FC交换机上的其他N节点通信。如果将多个开放环连接到交换机,那么这几个开放环之间也可以相互通信。

要实现开放环架构,需要特殊的端口,即下面描述的NL和FL端口。

8.2.3 NL端口和FL端口

NL端口是开放环中的一类端口,它具有N端口和L端口的双重能力。换而言之,NL端口支持交换式光纤网登录和环仲裁。而FL端口是FC交换机上用于连接开放仲裁环结构的中介端口。

开放环内可以同时存在NL节点和L节点,而只有NL节点才能和环外的、位于FC交换结构中的多个N节点或者其他类型节点通信。NL节点也可以同时和L节点通信。图8-14为NL和FL端口示意图。

图8-14 NL和FL端口示意图

开放环的融合机制

FC-SW设备的工作方式是它会登录到网络(FLOGI),并在Name Server中注册(PLOGI)。设备要传输数据时会先到Name Server查询Target设备,然后到目标设备进行注册(PRLI),最后传输数据。

FC-AL的设备工作方式与此完全不同,在环路的初始化(LIP)过程中,生成一个环路上所有设备地址的列表,被称作AL_PA,并存储在Loop中的每个设备上。当设备要与目标主机通信时,会到AL_PA中查询目标主机,然后根据地址进行通信。

要让一个私有环中的设备和Fabric中的设备达到相互通信,必须采用协议转换措施,因为FC AL和FC Fabric是两套不同的逻辑体系。

提示: 在本书第13章论述了关于“协议之间相互作用”即“协议杂交”方面的内容。如果阅读到那一章,再回头来研究,我们可以发现,NL端口和FL端口之间,完全就是一种Tunnel模式,它们利用FC AL的逻辑,承载FC Fabric的逻辑,也就是踩着AL走Fabric。比如Flogin、PLogin等这些帧,都通过AL链路来发向FL端口,而整个环中其他节点,对这个动作丝毫不知道,也不必知道。

如果采用MAP方式达到两种协议形式的最大程度的融合,也是完全可以的。下面描述的这种模式,就是采用了MAP的思想。

这种MAP的模式使环内的任何L节点可以和环外的任何N节点之间就像对方和自己是同类一样通信。也就是说环内的L节点看待环外的N节点就像是一个不折不扣的L节点。反过来,环外的N节点看待环内的L节点就像是一个N节点一样。这个功能是通过在交换机上的FL端口实现的,这个端口承接私有环和Fabric。在私有环一侧,它表现为L端口的所有逻辑行为,而对Fabric一侧,它则表现为N端口的行为,也就相当于一个N-L端口协议转换。这个接口可以把环外的N节点“带”到私有环内,同时把环内的节点“带”到环外。环内的L节点根本不会知道它们所看到的其实是环外的N节点通过这个特殊的L端口仿真而来的。

当然也要涉及到寻址的MAP,因为Fabric和AL的编址方式不同,所以需要维护一个地址映射,将环内的节点统统取一个环外的名字,也就是将L端口地址对应一个N端口地址,而这些地址都是虚拟的,不能和环外已经存在的N端口地址重合,这样才能让环外节点知道存在这么一些新加入Fabric的节点(其实是环内的L节点)。而要让环外节点知道这些新节点的存在,就要将这些新的节点注册到名称服务器上。因为Fabric架构中,每个节点都是通过查询名称服务器来获取当前Fabric中所存在的节点的。同样,要让环内的节点知道环外的N节点的存在,也必须给每个N节点取一个AL地址,让这些地址参与环的初始化,从而将这些地址加入到AL地址列表中。这样,环内的节点就能根据这个列表知道环内都有哪些节点了。

让各自都能看到对方,知道对方的存在,这只是完成了MAP的第一步。接下来,还要进行更加复杂的MAP,即协议交互逻辑的MAP。假如一个环内节点要和一个环外节点通信,这个环内节点会认为它所要通信的就是一个和它同类的L节点,所以它赢得环仲裁之后,会直接向这个虚拟AL地址发起通信。

这个虚拟AL地址对应的物理接口实际上是交换机上的仿真L端口,仿真L端口收到由环内节点发起的通信请求之后,便开始MAP动作。首先仿真L端口根据这个请求的目的地址,也就是那个虚拟地址,查找地址映射表,找到对应的N端口的Fabric地址。然后主动向这个N端口发起PLogin过程,也就是将AL的交互逻辑最终映射到了Fabric的交互逻辑。即AL向虚拟地址发起的通信请求,被仿真L端口MAP成了向真正的N端口发起PLogin请求,这就是协议交互逻辑的MAP。请求成功之后,仿真L端口便一边收集环内L节点发来的数据,一边将数据按照Fabric的逻辑转发给真正的N端口。反之亦然,N端口的逻辑,仿真L端口同样也会MAP成AL环的逻辑。这样,不管是环外的N端口还是环内的L端口,它们都认为它们正在和自己的同类通信。

图8-15所示为开放环与Fabric融合的示意图。

图8-15 开放环融合机制示意图

同样是将环接入Fabric,开放环的扩展性就比私有环接入强。因为一个NL端口可以和环外的多个N端口通信。也就是说,NL端口和FL端口可以看成是隐藏在环中的N端口和F端口。它们如果要通信,不能像直连的N和F端口那样直接进行Fabric登录,而必须先突破环的限制,即先要赢得环仲裁,再按照交换架构的逻辑进行Fabric登录,接着N端口登录,然后进程登录。而这一切,环内其他节点不会感知到。

具有NL端口的设备既能和环内的L端口设备通信,又能和环外的N端口设备通信,同时具有N和L端口的逻辑,这一切都不需要仿真MAP,只需要一个Tunnel过程即可。而环内的L节点如果想与环外的N端口通信,由于L节点自身没有N端口的逻辑,必须经过FL端口的MAP过程。所以,称具有NL端口的设备为Public设备,即开放设备。而称具有L端口的设备为Private设备,即不开放的私有设备。

8.2.4 E端口

E端口是专门用于连接交换机和交换机的端口。因为交换机之间级联,需要在级联线路上承载一些控制信息,比如选举协议、路由协议等。

8.2.5 G端口

G端口比较特殊,它是“万能”端口,它可以转变为上面讲到过的任何一种端口类型,按照所连接对方的端口类型进行自动协商变成任何一种端口。

终端节点端口编址规则

各种终端节点端口(N、NL、L)的FC ID地址都是24b(3B)长。但是N端口只使用3B中的高2B,即高16b;L端口只使用3B中的低1B,即低8b;NL端口使用全部3B。没有被使用的字节值为0。

产生这种编址机制不同的原因,是3种端口的作用方式不同。L端口只在私有环内通信,而一个环的节点容量是128个,所以只用8b就可以表示了。N端口由于处于Fabric交换架构中,节点容量很大,所以用了16b表示,最大到65536个节点。而NL端口,因为既处于环中,又要和Fabric交换架构中的节点通信,所以它既使用N端口的编址,又使用L端口的编址,所以用了全部3B。图8-16为端口编址示意图。

图8-16 三种FC节点类型的编址异同

任何设备都可以接入FC网络从而与网络上的其他FC设备通信,网络中的设备可以是服务器、PC、磁盘阵列、磁带库等。然而,就像以太网要求设备上必须有以太网接口才能连入以太网络一样,设备上必须有FC接口才可以连入FC网络。

8.3 FC适配器

想进入FC网络,没有眼睛和耳朵怎么行呢?FC网络的眼睛就是FC适配器,或者叫做FC主机总线适配器,即FC HBA(Host Bus Adapter)。值得说明的是,HBA是一个通用词,它不仅仅指代FC适配器,而可以指代任何一种设备,只要这个设备的作用是将一个外部功能接入主机总线。所以,PC上用的PCI/PCIE网卡、显卡、声卡和AGP显卡等都可以叫做HBA。

图8-17所示的就是PCI接口的FC适配器。

图8-18所示的是可以用来接入FC网络的各种线缆,可以看到SC光纤、DB9铜线和RJ-45/47线缆,它们都可以用于接入FC网络,只要对端设备也具有同样的接口。所以,千万不要认为FC就是光纤,这是非常滑稽的。

图8-17 FC适配卡

图8-18 各种接口的FC HBA

同样,也不要认为FC交换机就是插光纤的以太网交换机,这是个低级错误。称呼FC为光纤的习惯误导了不少人。FC协议是一套完全独立的网络协议,比以太网要复杂得多。FC其实是Fibre Channel的意思,由于Fibre和Fiber相似,再加上FC协议普遍都用光纤作为传输线缆而不用铜线,所以人们下意识的称FC为光纤通道协议而不是网状通道协议。但是要理解,FC其实是一套网络协议的称呼,FC协议和光纤或者铜线实际上没有必然联系。如果可能的话,也可以用无线、微波、红外线或紫外线等来实现FC协议的物理层。同样以太网协议与是否用光纤或者铜线、双绞线来传输也没有必然联系。

所以“FC交换机就是插光纤的以太网交换机”的说法是错误的。同样“以太网就是双绞线”和“以太网就是水晶头”这些说法都是滑稽的。

FC适配器本身也是一个小计算机系统,有自己的CPU和RAM以及ROM。ROM中存放Firmware,加电之后由其上的CPU载入运行。可以说它就是一个嵌入式设备,与RAID卡类似,只不过不像RAID卡一样需要那么多的RAM来作为数据缓存。

8.4 改造盘阵前端通路——SCSI迁移到FC

现在是考虑把原来基于并行SCSI总线的存储网络架构全面迁移到FC提供的这个新的网络架构的时候了!

但是FC协议只是定义了一套完整的网络传输体系,并没有定义诸如SCSI指令集这样可用于向磁盘存取数据的通用语言。而目前已经有了两种语言,一种是ATA语言(ATA指令集),另一种就是SCSI语言(SCSI指令集)。那么FC是否有必要再开发第三种语言?完全没有必要了。SCSI指令集无疑是一个高效的语言,FC只需要将SCSI语言拿来用就可以,但必须将这种语言承载于新的FC传输载体进行传送。

SCSI协议集是一套完整而不可分的协议体系,同样有OSI中的各个层次。物理层使用并行传输。SCSI协议集的应用层其实就是SCSI协议指令,这些指令带有强烈应用层语义。而我们要解决的就是如何将这些指令帧传送到对方。早期并行SCSI时代,就是用SCSI并行总线技术来传送指令,这个无疑是一个致命的限制。随着技术的发展,并行SCSI总线在速度和效率上已经远远无法满足要求。好在SCSI-3协议规范中,将SCSI指令语义部分(OSI上三层)和SCSI底层传输部分(OSI下四层)分割开了,使得SCSI指令集可以使用其他网络传输方式进行传输,而不仅仅限于并行SCSI总线了。

FC的出现就是为了取代SCSI协议集的底层传输模块,由FC协议的底层模块担当传输通道和手段,将SCSI协议集的上层内容传送到对方。可以说是SCSI协议集租用了FC协议,将自己的底层传输流程外包给了FC协议来做。

FC协议定义了在FC4层上的针对SCSI指令集的特定接口,称为FCP,也就是SCSI over FC。由于是一个全新的尝试,所以FC协议决定先将连接主机和磁盘阵列的通路,从并行SCSI总线替换为串行传输的FC通路。而盘阵后端连接磁盘的接口,还是并行SCSI接口不变。

从图8-19中可以看到,连接主机的前端接口已经替换成了FC接口,原来连接在主机上的SCSI适配器也被替换成了FC适配器。

图8-19 前端FC、后端SCSI架构的盘阵示意图

经过这样改造后的盘阵,单台盘阵所能接入磁盘的容量并没有提升,也就是说后端性能和容量并没有提升,所提升的只是前端性能。因为FC的高效、高速和传输距离,远非并行SCSI可比。

理解: 虽然链路被替换成了FC,但是链路上所承载的应用层数据并没有变化,依然是SCSI指令集,和并行SCSI链路上承载的指令集一样,只不过换成FC协议及其底层链路和接口来传输这些指令以及数据而已。

从图8-19中可以看到,不管是主机上的FC适配器还是盘阵上的控制器,都没有抛弃SCSI指令集处理模块,被抛弃的只是SCSI并行总线传输模块。也就是抛弃了原来并行SCSI协议集位于OSI的下四层(用FC的下四层代替),保留了整个SCSI协议的上三层,也就是SCSI指令部分。

将磁盘阵列前端接口用FC替代之后,极大地提高了传输性能以及传输距离,原来低效率、低速度和短距离的缺点被彻底克服了。

8.5 引入FC之后

引入FC之后有如下优势。

1.提高了扩展性

FC使存储网络的可扩展性大大提高。如图8-20所示,一台盘阵如果只提供一个FC前端接口,同样可以连接多台主机,办法是把它们都连接到一台FC交换机上。就像一台机器如果只有一块以太网卡,而没有以太交换机或HUB的话,那么只能和一台机器相连。如果有了以太网交换机或HUB,它就可以和N台机器连接。使用FC交换机的道理也一样,这就是引入包交换网络化所带来的飞跃。

图8-20 多主机共享盘阵

多台主机共享一台盘阵同时读写数据,这个功能在并行SCSI时代是想都不敢想的。虽然并行SCSI总线网络可以接入16个节点,比如15台主机和一台盘阵连入一条SCSI总线,这15台主机只能共享这条总线的带宽,假设带宽为320MB/s,如果15台主机同时读写,则理论上平均每台主机最多只能得到20MB/s的带宽。而这只是理论值,实际加上各种开销和随机IO的影响,估计每台主机能获得的吞吐量会不足10MB/s。再加上SCSI线缆最长不能超过25米,用一条宽线缆去连接十几台主机和盘阵的难度可想而知。

而引入FC包交换网络之后,首先是速度提升了一大截,其次由于其包交换的架构,可以很容易地实现多个节点向一个节点收发数据的目的。

2.增加了传输距离

FC携带有现代通信的特质,比如可以使用光纤。而这就可以使主机和与远隔几百米甚至上千米(使用单模光缆)之外的盘阵相连并读写数据。

3.解决了安全性问题

可能很多人还会有疑问,在图8-20所示的拓扑中,多个主机共用一台只有一个外部接口的盘阵不会冲突么?当然不会。第一,交换机允许多个端口访问同一个端口是一个分时复用的包交换过程,这个是毋庸置疑的。第二,盘阵上的FC前端接口允许多个其他端口进行Port Login过程。那么盘阵上的逻辑磁盘LUN可以同时被多个主机访问么?完全可以。SCSI指令集中有一个选项,即独占式访问或者共享式访问。

(1)独占式访问。

即只允许第一个访问某个目标节点的节点保持对这个目标节点的访问,第二个节点要向这个目标节点发起访问请求,则不被允许,除非上一个节点发出了释放指令。独占模式下,每台主机每次访问目标前都需要进行SCSI Reserve,使用完后再进行SCSI Release释放SCSI目标,这样其他节点才能访问那个目标。

(2)共享式访问,即允许任何人来访问,没有任何限制。

所以,盘阵上的任何LUN都可以被多台主机通过一个前端接口或者多个前端接口访问。这是一个优点,也是一个隐患。因为多个主机在没有相互协商和同步的情况下,一旦对同一个LUN都进行写操作的话,就会造成冲突。比如两台Windows主机正处于运行状态,它们都通过FC适配卡识别到了磁盘阵列上的同一个LUN。此时主机A向这个LUN上写了一个文件,假设主机B已经将文件系统的元数据读入了内存,磁盘上的数据被主机A更改这个动作主机B是感受不到的。隔一段时间之后,主机B可能将文件系统缓存Flush到磁盘,此时可能会抹掉这个文件的元数据信息。

所以,在没有协商和同步机制的两台主机之间共享一个LUN是一件可怕的事情。要解决这个问题,可以每次只开一台机器,主机B想访问就必须把主机A关机或卸载该卷,然后主机B开机或挂载该卷,这样才能保证数据的一致性。但这样有点过于复杂。第二种办法就是使两台或者多台机器同时开机或同时挂载该卷,而让机器上的文件系统之间相互协商同步,配合运作。我写入的东西会让你知道。如果我正在写入,那么你不能读取,因为你可能读到过时的信息。

在文件系统上增加这种功能,需要对文件系统进行修改,或直接安装新的文件系统模块。这种新的文件系统叫做集群文件系统,能保证多个机器共享一个卷,不会产生破坏。

有些情况确实需要让两台机器同时可以访问同一个卷(如集群环境),但是大多数情况下是不需要共享同一个卷的,每台机器拥有各自的卷,都只能访问属于自己的卷,这样不就太平了么?

是的,要做到这一点有两种方法。分析从主机到盘阵上的LUN的通路,可以发现通路上有两个部件,第一个部件是FC网络交换设备,第二个部件就是磁盘阵列控制器。可以在这两个部件上做某种“隐藏”或者“欺骗”,让主机只能对属于它自己的LUN进行访问。

(3)在磁盘阵列控制器上做“手脚”。

SCSI指令集中有一条指令叫做Report LUN,也就是在SCSI发起端和目标端通信的时候,由发起端发出这条指令,目标端在接收到这条指令之后,就要向发起端报告自己的LUN信息。可以在这上面做些手脚,骗发起端一把。当发起端要求Report LUN的时候,盘阵控制器可以根据发起端的唯一身份(比如WWPN地址),提供相应的LUN报告给它。

比如针对主机A,控制器就报告给它LUN1、LUN2、LUN3。虽然盘阵上还配置很多其他的卷,比如LUN4、LUN5、LUN6等,但是如果告诉控制器,让它根据一张表8-1所示的映射表来判断应该报告给某个主机哪个或哪些LUN的话,控制器就会乖乖地按照指示来报告相应的LUN给相应的主机。

表8-1 LUN映射表

如果某个主机强行访问不属于它的LUN,盘阵控制器便会拒绝这个请求。上面那张映射表完全需要人为配置,因为盘阵控制器不会知道我们的具体需求。所以对于一个盘阵来说,要想实现对主机的LUN掩蔽,必须配置这张表。

盘阵上的这个功能叫做LUN Masking(LUN掩蔽),也就是对特定的主机报告特定的LUN。这样可以避免“越界”行为,也是让多台主机共享一个盘阵的方法,从而让多台主机和平共享一台盘阵资源。毕竟,对于容量动辄几TB甚至几百TB的大型盘阵来说,如果不加区分的让所有连接到这台盘阵的主机都可以访问到所有的卷是没有必要的,也是不安全的。

不仅FC接口盘阵有这个功能,SCSI前端接口盘阵照样可以实现这个功能,因为这是SCSI指令集的功能,而不是传输总线的功能。不管用什么来传输SCSI指令集,只要上面能承载SCSI指令集,那么指令集中所有功能都可用。

磁盘阵列除了可以将某些LUN分配给某个主机之外,还可以配置选择性地将某个或某些LUN分配到某个前端端口上。也就是说,设置前端主机只有从某个盘阵端口进入才能访问到对应的LUN,从盘阵前端其他端口访问不到这些LUN。有些双控制器的盘阵可以定制策略将某些LUN分配到某个控制器的某些端口上。LUN Masking的策略非常灵活,只要有需求就没有开发不出来的功能。

总之,可以把LUN当作蛋糕,有很多食客(主机)想吃这些蛋糕。然而,食客要吃到蛋糕,需要首先通过迷宫(FC网络),然后到达一个城堡(磁盘阵列)。城堡有好几个门(盘阵的前端接口),如果城堡的主人很宽松,会把所有蛋糕分配到所有门中,从任何一个门进入都可以吃到所有蛋糕。如果主人决定严格一些,那么他也许会将一部分蛋糕分配到1号门,另一部分蛋糕分配到2号门。如果主人非常严格,那他会调查每个食客的身份,然后制定一个表格,根据不同身份来给食客不同的蛋糕。

(4)在FC交换设备上做“手脚”。

我们前面提到过ZONE。ZONE的功能就是在FC网络交换设备上阻断两个节点间的通路,这样某些节点就根本无法获取并访问到被阻断的其他节点,也就识别不到其上的LUN了。LUN masking只是不让看见某个节点上的某些LUN而已,而ZONE的做法更彻底,力度更大。

ZONE有软ZONE和硬ZONE之分。软ZONE就是在名称服务器上做手脚,欺骗进行名称注册的节点,根据ZONE配置的信息向登录节点通告网络上的其他节点以及资源的信息。硬ZONE就是直接把交换机上某些端口归为一个ZONE,另一些端口归为另一个ZONE,在两个ZONE之间完全底层隔离,端口之间都不能通信,如图8-21所示。

图8-21 ZONE示意图

图中有两个ZONE,FC盘阵B所连接的交换机端口既在左边的ZONE中,又在右边的ZONE中,这样是允许的。这个例子中,主机C是无法和盘阵A通信的,它只能识别到盘阵B上的LUN。

有了LUN Masking和ZONE,FC网络的安全就得到了极大的保障,各个节点之间可以按照事先配置好的规则通信。

8.6 多路径访问目标

再来看一下图8-22。这是一个具有双控制器的盘阵,两个控制器都连接到了交换机上,而且每个主机上都有两块FC适配卡,也都连接到了交换机上。前文说过,如果在盘阵上没有做LUN Masking的策略,而在FC交换机上也没有做任何ZONE的策略,则任何节点都可以获取到网络上所有其他节点的信息。

图8-22 多路径访问示意图

假设盘阵上有一个LUN1被分配给控制器A,LUN2被分配给控制器B,那么可以计算出来,每个主机将识别到4块磁盘。因为每个主机有两块FC适配卡,每个适配卡又可以识别到控制器A上的LUN1和控制器B上的LUN2。也就是说,每台主机会识别到双份冗余的磁盘,而主机操作系统对这一切一无所知,它会认为识别到的每块磁盘都是物理上独立的,这样很容易造成混乱。

既然会造成混乱,那么为何要在一台主机上安装两块FC适配卡呢?这样做就是为了冗余,以防止单点故障。一旦某块FC卡出现了故障,另一块卡依然可以维持主机到盘阵的通路,数据流可以立即转向另外一块卡。

如何解决操作系统识别出多份磁盘这个问题呢?办法就是在操作系统上安装软件,这个软件识别并分析FC卡提交上来的LUN。如果是两个物理上相同的LUN,软件就向操作系统卷管理程序提交单份LUN。如果某块FC卡故障,只要主机上还有其他的FC卡可以维持到FC网络的通路,那么这个软件依然会向操作系统提交单份LUN。一旦所有FC卡全都故障了,主机就彻底从FC网络断开了,这个软件也就无法提交LUN了,操作系统当然也识别不到盘阵上的LUN了。

此外,如果盘阵的某个控制器接口发生故障,主机同样可以通过这个软件立即重定向到另一个备份控制器,使用备份控制器继续访问盘阵。

这种软件叫做“多路径”软件,中高端产品的开发商都会提供自己适合不同操作系统的多路径软件。多路径软件除了可以做到冗余高可用性的作用之外,还可以做到负载均衡。因为主机上如果安装了多块FC适配卡,数据就可以通过其中任何一块卡到达目的,这样就分担了流量。

提示: 多个存储适配器可以以active/standby模式或者active/active模式以及dual/multi active模式工作。active/standby模式是指同一时刻只能有一个适配器在收发数据,active/active模式是指同一时刻多个适配器可以共同收发针对同一个LUN的数据。而dual/multi active则是两个或指多个适配器不能同时针对同一LUN收发数据,但是每个适配器可以针对不同的LUN收发数据。

多路径软件示例

如图8-23所示为EMC公司针对其存储产品所开发的多路径软件PowerPath的配置监控界面。可以看到这台Windows主机上安装了4块FC卡。存储系统向这台主机共映射了7个LUN,分别对应Disk 001~007。

如图8-24所示,其中一个LUN存在16条不同的路径。

图8-23 PowerPath界面

图8-24 每个LUN通过16条路径被访问

如图8-25所示,我们可以判断出整个系统的拓扑。

图8-25 系统拓扑图

如图8-26所示,一块FC卡出现故障后,系统界面会显示出来。如图8-27所示,虽然一块FC卡出现了故障,但是每个LUN也只是丢失了16条路径中的4条,存储访问依然正常。

图8-26 一块FC卡出现故障图

8-27 LUN依然可以通过剩余的12条路径被访问

多路径软件与阵列控制器配合切换过程简介

如图8-28所示为四种典型的连接拓扑下各种链路故障情况的示意图。RDAC(Redundant Disk Array Controllers)是Linux下的一个多路径软件驱动程序,我们就用它的作用行为来给大家做介绍。多路径软件一般位于适配器驱动程序之上,对适配器上报的多份重复的LUN进行虚拟,虚拟成一个单一的逻辑设备然后再次上报。在Windows下多路径软件属于一种过滤驱动程序层(Filter Driver)。

图8-28 四种典型拓扑下的多路径切换示意图

下面我们就来看看这些情况下多路径软件到底会怎么来动作。

(1)在第一个场景中,LUN1的Owner(或称Prefer)控制器为A,而LUN2的Owner控制器为B。主机从两条路径分别认到了这两个LUN,1个LUN1和1个LUN2。多路径软件会从HBA1链路来访问LUN1,从HBA2链路来访问LUN2。某时刻HBA2连接交换机的链路发生故障,那么此时对LUN1的访问路径不受影响,但是对LUN2的访问链路完全中断,此时多路径软件必须切换到HBA1的链路来同时承载LUN1与LUN2的流量。由于LUN2的Owner控制器为B,所以此时有两种办法可以继续保持对LUN2的访问:第一种办法就是主机将IO通过HBA1→交换机A传送给控制器A,然后控制器A将IO请求通过控制器间的缓存镜像链路转发到控制器B,控制器B执行完毕后将结果返回给控制器A,之后原路返回给主机;第二种做法则是多路径软件在感知到故障之后,判断出只能从HBA1的链路走到控制器A了,那么此时多路径软件可以向控制器A发送命令,让它强行接管对LUN2的控制权,接管之后,针对LUN2的IO就无需再转发给控制器B了,直接由控制器A全权处理。由于第一种方式需要耗费镜像通道的带宽,所以出于性能考虑,一般都会使用第二种方式处理,即切换Owner控制器。

(2)在第二个场景中,阵列的双控制器各通过一条链路连接到一个交换机上。此时主机端可以看到共4个LUN,从HBA1链路看到一个LUN1和一个LUN2,从HBA2链路看到一个LUN1和一个LUN2。某时刻HBA1链路故障,那么此时毫无疑问,多路径软件一定要切换到HBA2链路继续收发IO。那么阵列控制器之间是否需要切换LUN的控制权呢?不需要,因为主机此时可以从HBA2→交换机B来看到分别被控制器A与控制器B管控的LUN1与LUN2。

(3)在第三个场景中,有两台主机分别用两块HBA来连接交换机了。LUN1只映射给主机1,而LUN2只映射给主机2。某时刻,主机1的HBA1链路故障或者卡件/接口故障,同时,阵列B连接交换机B的链路也发生故障。此时,主机1一定要切换到HBA2路径,通过交换机B到控制器A从而保持对LUN1的访问。而主机2则根据之前的优选路径来判断是否切换,如果之前的优选路径是通过HBA2→交换机B→控制器B的话,那么此时就需要切换到HBA1,走交换机A再到控制器B了。

(4)在第四个场景中,LUN1与LUN2的Owner控制器均属于控制器B,LUN1只映射给主机1,而LUN2只映射给主机2。此时主机2的HBA2链路发生故障,那么此时主机1不受影响,依然走HBA2→交换机B→控制器B的路径来访问LUN1;而主机2此时必须切换到HBA1来收发IO,但是HBA1到控制器B并没有直接路径,必须通过双控制器之间的镜像路径,而这个之前也说过,不推荐使用,虽然理论上是可以做到的。那么此时主机2别无他法,只能通过HBA1向阵列的控制器A发送命令,将自己所要IO的LUN2的Owner控制器切换到控制器A上,主机2并不会要求将LUN1也切换,因为主机2只能感知到自己所访问的LUN,也只会要求切换自己要访问的LUN。

(5)如图8-29所示的第五个场景中为另外一种情况,即阵列控制器整机故障的情况。此时另外一个控制器会通过之间的镜像通道(同时也充当心跳线)感知到对方阵列已死,那么本端就会强行将对端控制器之前所管控的所有LUN无条件接管。同时,主机端多路径软件也需要根据情况改变优选路径到控制器A而不是已死的控制器B了。

图8-29 阵列控制器整机故障场景

(6)第六个场景中,阵列控制器B连接本地磁盘扩展柜的链路故障,这样就导致控制器B认不到本地下挂的所有磁盘了,但是依然可以认到控制器A处的磁盘(控制器B有链路连接到控制器A下面的磁盘柜)。此时控制器B可以有两种做法:第一种则是将原本处于其下挂磁盘上的LUN2的Owner管控权交给控制器A,并且在其前端强行unmap掉LUN2,这样主机端的多路径软件就可以感知到LUN2的消失,自动切换到另一条路径走控制器A;第二种做法就是不让主机端多路径软件感知到任何变化,主机针对LUN2的IO依然下发到控制器B,而控制器B接收到IO之后,将其通过双控之间的镜像路径转发到控制器A处理(控制器A依然可以访问到挂在控制器B后面的磁盘),然后控制器A将结果返回给控制器B,之后控制器B再返回给主机。一般情况下可以针对不同场景做出选择,多路径切换过程会影响主机侧应用程序,但是不切换的话,数据都走镜像通道,性能会有所下降。

8.7 FC交换网络节点4次Login过程简析

每个FC节点连到FC Fabric网络里需要经历4次Login过程。

第一次Login相当于TCPIP网络里的DHCP过程,FC交换机需要为每个FC节点分配一个Fabric ID,相当于IP地址,有了这个ID,数据包才能被FC交换机正确地交换,FC交换机是根据Fabric ID而不是WWPN(相当于以太网的MAC地址)作交换的。

第二次Login过程,相当于Windows里的WINS服务器注册和资源发现过程,我们熟知的网上邻居,有两种访问方式,一种是广播方式,另一种是所有Windows PC都向WINS服务器(其IP地址预先在每台PC上被配置好)注册,双击网上邻居时候每台PC都会从WINS服务器拉取目前网络上的PC信息。FC也有这个过程,FC节点在FC Fabric里的第二次Login过程,就是向Name Server注册自己,并拉取目前FC网络里的所有Target节点信息(只有FC Initiator节点才会主动拉取资源,Target节点只注册不拉取),在第二次Login的过程中,其实包含了两次“子Login”过程,每个FC节点要注册到Name Server,必须先向Name Server发起Port Login过程,Port Login其实是指FC网络底层端口级别的Login,一个Fabric ID所在的端口要与另一个Fabric ID所在的端口发起通信,必须先Port Login,成功之后,再发起Process Login,所谓“Process Login”就是进程级别的Login,就是发起端的程序要向对方表明我将与你处运行的哪个程序通信,这就相当于TCPIP的端口号,到底要连接对方的哪个端口,每个端口都有一个上层应用程序在监听,向Name Server注册,那么Name Server上一定要运行一个管理注册过程和资源列表的程序,发起端就是在声明要与这个程序连通,从而注册自己,所以要向对方的FC底层协议栈声明“请将数据包发送给注册和资源管理这个Process”,所以才叫做“Process Login”,与TCPIP向某端口的三次握手机制类似。经过这两次子Login,发起端才真正地与Name Server上的程序进行数据交互,从而完成注册和资源拉取过程。

第三次Login过程,就是FC Initiator节点向所有自己看到的Target节点发起Port Login。

成功之后,就开始第四次Login,也就是向Target节点发起Process Login,这里的“Process”一定就是对方的FCP Target程序了,这个程序被集成在了FC卡的Port Driver的下层。 dF5cf5buzFTjJR9Q2G9rcxwYgMOFVfBVr9K65xSYogFy1snNLnRpQilF1UW1lpQ2

点击中间区域
呼出菜单
上一章
目录
下一章
×