Fibre Channnel
我们之前引入了SAN的概念,SAN首先是个网络,而不是存储设备。这个网络是专门来给主机连接存储设备用的。
我们知道按照SCSI总线16个节点的限制,不可能接入很多的磁盘,要扩大SAN的规模,只使用SCSI总线是不行的,所以必须找到一种可寻址容量大、稳定性强、速度块、传输距离远的网络结构。FC网络就应运而生。
FC网络
Fibre Channnel也就是网状通道,FC协议从1988年出现,最开始作为高速骨干网技术。
任何互联系统都逃不过OSI模型,所以我们可以用OSI来将FC协议进行断层分析。
物理层
首先有较高的速度:1Gb/s,2Gb/s,4Gb/s,8Gb/s到16Gbps
为了实现远距离传输,传输介质起码是光纤
链路层
字符编码及FC帧结构
FC协议的帧头有24字节,比以太网帧头(14字节)还要长。
比如下图为以太网的报文格式。
为什么FC协议需要这么长的帧头呢?因为24字节的帧头不但包含了寻址功能,还包含了传输功能保障。也就是说网络层和传输层的逻辑都用这24字节来传输。
这点就与TCP/IP+以太网不同,以太网基本上没有传输功能保证功能,主要需要靠TCP来进行端到端的传输保障。
我们可以对比一下TCP/IP和FC协议的开销:
基于以太网的TCP/IP网络,开销为:
14字节(以太网帧头) + 20字节(IP头) + 20字节(TCP头) =54字节,或者把TCP帧头变为UDP(8字节)一共是42字节
而FC协议就24字节,所以开销比TCP/IP的要小。
网络层
FC网络中的节点要通信,无非也就是连、找、发三大要素。
-
连:通过FC交换机打通通路,主要的拓扑结构有FC-AL和Fabric两种。
-
找:FC协议有一套于以太网不相同的编址方式,可以尽可能减少人为的干预。
-
发:指的是与目标进行通信
从这个方面基本上就可以了解FC各节点交互的流程了。
连:拓扑
与以太网类似,FC也有两种拓扑:FC-AL和Fabric
- FC-AL:类似以太网共享总线拓扑,但是连接方式不是总线,而是仲裁环(Arbitral loop)。每个FC -AL 设备首尾接成了一个环路。最多能接入128个节点,实际上只用了8位的寻址容量。被广播地址、专用地址占用之后,只剩下127个实际可用的地址。
仲裁环是应该 由所有设备串联而成的闭合环路,每个接口上都有一套旁路电路(Bypass Circuit),一旦检测到本地设备故障,就会自动将这个接口短路。
一跳一跳的传输,而且任何时候只能按照一个方向向下游传输。
- Fabric:与以太网交换拓扑类似。Fabric的意思是“网状构造”,表明其实是一种网状的交换矩阵
相对于仲裁环路来说转发效率提升了很多,联入矩阵所有节点可以同时进行点对点通信,加上包交换所带来的并发和资源充分利用,可使得交换架构获得的总带宽为所有端口带宽之和。
而AL架构下,不管接入的节点有多少,带宽为恒定,即共享环路带宽。
下图为交换矩阵的示意图。
FC终端设备接入矩阵端点,一个设备发给另一个设备数据帧被交换矩阵收到后,矩阵会拨动交叉处的开关,连通电路,传输数据。所以可以把交换矩阵是一个大的电路开关矩阵,根据通信的源和目的决定波动哪些开关。
FC交换拓扑寻址容量是2的24次方个地址,比以太网理论值(2的48次方)少,但是对于专用的存储网足够。
找:编址
任何网络都需要寻址机制,所以需要对FC网络的每个设备定义一个唯一的标识。
- WWNN(World Wide Node Name):每个设备自身有一个WWNN
- WWPN(World Wide Port Name):FC设备的每个端口都一个WWPN,是世界上唯一的。
以太网交换设备的端口不需要有MAC地址,而FC交换机却需要每个端口都有自己的WWPN。这是因为FC要做的工作比以太网交换机多,许多FC的逻辑都集成在了FC交换机。 需要处理到FC协议的最上层。而以太网相对简单,因为上层逻辑都被交给TCP/IP这样的上层协议来实现了。
WWPN:长度是64位,比MAC地址多16位。长度太长,速度低,所以在WWPN上映射一层寻址机制,分配一个Fabric ID,嵌入链路帧里面来做路由
这样WWPN被映射到了Fabric ID,一个24位的Fabric ID又被分为Domain ID、Area ID、Port ID三个亚寻址单元
-
高8位定义为Domain区分符,用来区分网络中的FC交换机本身。Domain ID是自主交换机分配的。那主交换机怎么来的?它是根据WWNN号来进行选举,WWNN最小者获胜,成为主交换机,它就有资格向其他交换机分配Domain ID
-
中8位定义为Area区分符,区分同一台交换机的不同端口组。如果一块芯片可以管理1、2、3、4号FC端口,那么芯片可以属于一个Area
-
低8位定义为Port区分符,区分不同的Port
发:地址映射过程
如下的讲解主要是针对Fabric 交换架构网络。
既然要把WWPN映射到Fabric ID上,就一定要有映射机制,那么每个端口如何获得Fabric ID的呢?过程比较类似于RARP协议。
当一个端口接到FC网络的时候,会向注册服务器发送一个注册申请,然后这个注册服务器会返回给它动态分配一个Fabric ID。当然此时注册服务器会记录这个映射关系。
此后这个接口的帧不会携带WWPN,而是携带其被分配的ID作为源地址。这点就与以太网不同,我们知道 以太网既携带MAC又携带IP,所以在效率上打了折扣。
发:同步其他节点信息
不过还有一个问题,一个端口要与另一个端口通信,那么怎么知道要通信目标的Fabric ID是多少呢?
每个节点获得自己的Fabric ID之后,还会进行名称注册。同样也是向名称服务器发送注册帧,主动告知自己的Fabric ID等信息。然后名称服务器其他节点的信息返回给它。这样就知道了其他节点地址呢。
如果FC网络比较大,则可能不只一台FC交换机。也就是说有若干FC交换机互联。与IP网络不同的是,FC网络不需要太多的人工介入,它们会自动协商自己的Domain ID(可以回过去看看Fabric ID的结构),选举出主交换机,由主交换机来为其他的交换机分配Domain ID。交换机之间会运行OSPF等路由协议,这样可以交互节点信息,寻址各个节点。
现在我们可以与IP网络对比一下,IP网络需要很强的人为介入性,需要人来配置节点的IP地址、路由信息等,而FC网络则可以自动分配和管理地址。最根本原因是因为FC协议一开始设计就是为了高速、高效的网络,而不是给Internet使用的。所以自动分配地址当然适合。
发:与目标通信
此时每个节点已经获得了Fabric ID了,同时还从名称服务器得知网络上其他节点的ID,万事俱备,完全可以与其他节点进行通信了。
-
首先需要直接向目的端口发起一个N_PORT Login过程,目的协商一系列的参数
-
然后进行Process Login过程(类似TCP向端口发送握手包),即进行应用程序间的通信。比如FC可以承载SCSI协议,那么此时Initiator端就需要向Target端发起请求了。
-
这些Login过程其实就是上三层的内容,属于会话层。但是Login帧也必须通过下4层来封装并传输到目的地,就像TCP握手一样。
FC网络中还有一中FC Control Service,如果节点向这个服务进行注册了以后,一旦网络状态有变动,将会把最新的信息同步到这些节点。
最后一点
上面提到的名称服务器、注册服务器其实一般都是运行在交换机内部的,而不是物理上的服务器。
传输层
FC协议的传输层的作用与TCP相似,也也进行Segment以及通过端口号区分上层应用。
-
对上层数据流进行Segment。
每个Exchange(上层程序)发来的数据包,被FC传输层分割为Information Unit,类似于TCP的Segment。
然后下层协议为每个Segment分配一个Sequence ID,再分割为FC所适应的帧 -
区分上层程序。TCP是通过端口号,而FC协议是通过Exchange ID来区分。
FC适配器
要构建一个完整的FC网络,除了需要FC交换机,还需要FC适配器(FC HBA,Host Bus Adapter)
HBA可以指代任何一种设备,只要这个设备的作用是将一个外部功能接入主机总线,所以PCIE网卡、声卡和显卡都可以叫HBA。
下图是用来接入FC网络的各种线缆,有SC光纤,DB9铜线和RJ45/47线缆。可以看出FC不一定是光纤
FC适配器有自己的CPU、RAM、ROM。是一个嵌入式设备。与RAID卡类似,只是不像RAID卡需要那么多的RAM来做数据缓存。
SCSI迁移到FC
如何迁移
在上面一章我们把FC协议进行了简单的介绍,现在是时候把SCSI迁移到FC上了。
回顾一下,为什么要这么做,因为SCSI总线只能接16个节点,不利于扩展,同时传输的距离有限,而且不够高效等。所以我们可以在主机与后端存储之间使用FC协议,把基于并行SCSI总线的存储网络架构迁移到FC的网络架构。
迁移的过程中存在一个问题,我们知道FC协议并没有定义SCSI指令集这样面向磁盘存储数据的通用语言。那怎么解决这个问题呢?
在【大话存储】学习笔记(13章),协议融合中提到了协议融合,此时FC协议与SCSI协议有重叠,但是FC协议在某些方面可以做得更好,所以可以将SCSI语言承载于FC协议进行传送。
将连接主机和磁盘阵列的通路从并行的SCSI总线替换为串行传输的FC通路。但是盘阵后端连接磁盘的接口还是SAS接口。
这样单台盘阵所能接入的磁盘容量没有提升,但是前端的性能提升了,因为使用FC协议,可以更为的高速。
好处
引入FC之后,带来的好处为
- 如果一个盘阵只有一个FC接口,那么我们完全可以使用FC交换机来扩充端口。而且采用了这样的包交换架构,可以实现多个节点向一个节点收发数据,传输效率大大提升。
这样就实现了多台主机共享一个盘阵,提升了盘阵的利用率。
-
而且因为可以使用光纤,所以传输距离加长了。
-
FC协议功能更为丰富,可以为每台主机划分不同的LUN,保证了安全性。
既然所有的主机都挂在了盘阵上,怎么保证每台主机能独享一块LUN呢?可以从FC交换机,磁盘阵列控制器入手。- 在磁盘控制器上做手脚:
在SCSI协议中有这样一个过程,此时Initiator想要与Target要进行通信,Initiator需要发一条Report LUN指令给Target,Target端在收到这条指令以后,需要返回自己的LUN信息。那么磁盘控制器可以 LUN的时候,根据发起端的身份,提供相应的LUN给它。如果强行访问其他的LUN,就会拒绝。这种方法就叫LUN masking
总的来说,可以把LUN当做蛋糕,磁盘控制器就是主人,他可以调查每个主机的身份,根据不同的身份来分配蛋糕。
注意,这是SCSI指令集的功能,只要承载了SCSI指令集的协议就可以实现这个功能。
- 在FC交换机上做手脚:
我们知道以太网交换机可以划分VLAN,也就是可以把某几个端口划分到一个逻辑上的LAN中。同样FC交换机也可以实现类似的功能,不过名字叫ZONE
。
ZONE有软ZONE和硬ZONE之分。-
软ZONE:在名称服务器上做手脚,欺骗进行名称注册的节点,向他们通告其他节点信息。
-
硬ZONE:把交换机某端口归为一个ZONE,底层完全隔离。如下
-
多路径访问目标
如果盘阵有两个控制器,每个主机上都有两块FC适配卡,它们都连接到了FC交换机。
这样会存在一个问题,因为主机有两块HBA卡,而每块HBA可以识别两块LUN,所以整个主机会识别出4块磁盘,这就有问题了,因为这样磁盘就有重复了,造成了混乱。
那么你可能会说,为啥要两块FC HBA卡呢?因为一块HBA有单点故障,如果使用两块HBA卡,一旦一块HBA卡出现了故障,另一块卡依然可以维持主机到盘阵的通路。
那多路径的问题怎么解决:可以在操作系统中安装多路径软件,它可以识别FC提交上来的LUN,向操作系统提交单份LUN。这个软件还有个作用,如果某个控制器发生故障,通过这个软件立即重定向到另一个控制器。