为使作为数据载体的NAS系统在运行中的故障不影响数据的正确性,可以采取容错技术来提高NAS系统的可靠性。
NAS系统存在以下单一失效点:磁盘I/O、网络I/O和服务器主机本身。任何一处出现故障,都将导致服务的中断,甚至存储在上面的数据的丢失。要提高NAS的可靠性,就要采取措施使其不再存在单一失效点。
根据NAS的结构和特点,我们提出了一个四层次的NAS容错模型(见下图)。
NAS容错模型
存取控制层-解决磁盘失效对数据完整性和系统可靠性的影响,主要是采用软件RAID实现存储I/O容错。
文件系统层-针对系统盘是软件RAID中的单一失效点,实现了文件系统镜像放置,并采用了在线数据重构机制和磁盘热插拔技术。
网络传输层-解决网络传输的问题,针对网络传输环节中的失效点,实现网络I/O容错。
节点层-解决数据备份和单机系统失效的问题,实现实时双机热备份。
文件系统镜像分布策略
开发的NAS系统中,有4个IDE主盘分别挂在4个ATA通道上,分别是ad0、ad2、ad4和ad6 (为了便于检测磁盘状态所以全部采用主盘)。传统的文件系统分布如下图:
这种文件系统分布的最大问题是:只有用户可用卷空间是受RAID保护的,因为在mount根文件系统前无法使用RAID,因而系统只能容忍ad2-ad6磁盘的失效,无法修复ad0失效。如果ad0失效,则会导致整个系统崩溃,所有数据丢失。
鉴于传统的文件系统分布策略存在“盲区”,不能修复系统盘的失效,我们提出了一个解决方案-文件系统镜像分布策略,即启动分区复制,根文件系统采用RAID1镜像。见下图。
文件系统镜像分布策略
a是FreeBSD启动时所需的分区,每个硬盘上的a分区内容是一致的,内核位于该分区。FreeBSD自举时,从该分区加载内核程序。
Component(x)是NAS系统真正使用的根系统,是基于卷管理器实现的,采用RAID1算法,具有完全冗余、容错功能。
用户可用卷空间是给用户提供的可使用的磁盘空间,用户可在这部分空间自由进行卷操作,建卷、删卷和存储数据等。
这样,不仅用户可用卷空间受RAID保护,根系统也实现了容错,任何一个磁盘都可以启动系统。如果ad0失效,可由ad2,甚至ad4、ad6接替。
网络I/O容错技术
网络传输环节中存在两个失效点(见下图(a)):一个是网卡NIC失效;另一个是网络电缆中断。
相应地要从这两个方面来考虑提高网络的可靠性,一般采用硬件上的冗余,主要是服务器网卡的冗余和传输链路的冗余以增加容错的能力(见下图 (b))。
为了提高性能,一般情况下服务器都会配置多个网卡,对网络物理进行分段,并对可能发生的失效进行隔离。
优点:任何网卡的失效并不会影响其它网卡的连接,只有该网卡所在子网的客户机受影响。
缺点:这种配置没有容错特性,扩展也不方便。另外,网卡的吞吐能力利用也不充分,每块网卡只负责自己物理子网数据的传输。可能会出现这样的情况:网卡1达到了最大带宽,而其它网卡却处于闲置状态。
为了更有效地利用服务器上的多个网络接口,可以把多个物理网卡绑定成一个逻辑的或虚拟的网卡,这就是链路绑定(Bonding)技术。
操作系统中的软件协议栈把绑定后的虚拟网卡视为一个逻辑网卡。每一个网卡是一个物理端口,每一个物理端口都有自己的MAC地址。如果其中一个物理网卡失效,在负载均衡模式下,传输流量会自动重新均衡;在故障接管模式下,传输会从主网卡切换到从网卡。
Bonding技术在网络存储系统的应用
Bonding技术在网络存储系统的应用中包括以下几个方面:
通过实现故障接管(Failover)提高系统可用性:有一个或多个网卡作备用。通常只有一块网卡工作,当工作网卡出现故障时,备用网卡接替工作,保证网络不会中断,起到容错的作用。
通过实现链路聚集(也即负载均衡)提高网络吞吐率:可以使用2到4块网卡通过特定的网卡驱动程序进行设定。通常多块网卡并行工作,性能比网卡冗余方式要高。当某块网卡出现故障时,其余网卡继续工作,保证网络不会中断,因此使用负载均衡功能要好于网卡冗余。
Bonding技术在OSI模型的四个层次上的实现
第一层Bonding:在物理层绑定链路,要求额外的MAC层和物理层部件。将数据包分成小段传输,在另一端重新组合。传输同步要求宽松。负载均衡功能需要复杂的分段和重组,故障接管功能需要有同步协议。例如ISDN Bonding,Beowulf的Channel Bonding。
第二层Bonding:多个链路使用同一个MAC,在各个链路中 利用确定性的算法分发数据包。负载均衡功能要求交换机采用源地址分发策略,服务器采用目的地址分发策略。故障接管功能利用现有的链路监测机制。例如Sun公司的Trunking 1.0和Cisco公司的Fast EtherChannel技术。
第三层Bonding:通过特殊的负载均衡解析协议将单个网络地址映射到多个MAC地址,保持了网络地址的固定;利用不同的MAC地址实现单向负载均衡。只能实现单向负载均衡功能,要实现双向均衡功能需要修改网络协议栈。故障接管功能要求有动态MAC-网络地址映射机制配合。例如Novell的balance.nlm。
第四层Bonding:通过特殊的名字解析协议将单个网络名字映射到多个网络地址,保持了网络名字的固定。负载均衡功能需要特殊设备或者修改应用软件。故障接管功能在系统软件层实现,意味着要修改应用软件。例如NAT,LocalDirector,WEB Server Director,CORB
bonding技术实现的层次
第一层实现需要额外的MAC层和物理层部件;第三层实现对端设备和交换机来说不透明;第四层实现需要修改应用程序或插入中间件程序;第二层实现的方案易于实施而且透明。一般认为第二层实现bonding的方案是最佳的。
链路绑定技术的实现-MNCB(Multiple Network Channel Bonding)。
网卡收发模块.网卡切换器.网络故障检测器.网卡调度器四部分组成.其模块结构图为:
四个模块的功能如下:
网卡收发模块:它处于整个系统核心位置,负责拦截由上面的数据链路层传递下来的MAC帧,并采用轮转算法将数据包依次从网卡队列中发送出去。这样该网卡上的流量分摊到了各个物理网卡上,充分利用了系统硬件资源。
网卡切换器:它和网卡收发器都在内核态实现。当网络出现故障时由应用层的网络故障检测器控制进行网络通道切换,实现故障接管功能。
网络故障检测器:通过MII检测机制检测网卡的状态,执行差错检测和恢复功能。当某网卡失效后,通过调用内核模块的网卡切换器,切换器把请求再传递到收发器,将失效的网卡从网卡队列中删除,而将数据包从队列中下一块好的网卡中发送出去,保证了数据的连通性。只有当队列中所有的网卡全部失效时,服务器才会与网络断开。若失效的网卡又重新恢复正常,故障检测器会控制切换器将此网卡设备加入到网卡队列中,该网卡继续开始工作。
网卡调度器:为用户提供了一系列的命令接口,主要是添加或删除网卡队列中的设备。用户可以指定哪些网卡绑定起来一起工作,或者可以清空队列中所有网卡使服务器处于非绑定模式。在将网卡进行绑定之前调度器首先要进行一些操作,其中有检查网卡是否已处于激活状态,检查该网卡与交换机的连通性,将该网卡的配置参数设置成与队列中的主网卡一致,如IP地址、MAC地址、子网掩码、MTU值等。若队列为空,该网卡就指定为主网卡。这些操作完成后才可将该网卡插入到队列尾。
节点级容错技术
在一般的NAS设计中,当文件备份时,系统会限制对文件的访问,这种备份对系统的性能会产生很大的影响。
针对这种情况,我们设计并实现了一种基于日志的双机热备份的方案。
使用日志来记录发生在主服务器文件系统的改变,并将日志而不是整个被更新的文件传递给备份服务器。备份服务器根据日志中的内容,在适当的时候从主服务器中获取更新文件的内容。
此方案还提供了故障接管的功能。主服务器正常运行时,备份服务器仅仅完成文件备份的功能,不需要对外提供服务。一旦主服务器失效,备份服务器将自动转换为主服务器,对外提供相同的服务。
在内核中实现了可选择的日志缓冲,提高了文件操作的响应速度,从而进一步减小了热备份对存储服务性能的影响。
模型设计
系统由三大部分组成:日志文件系统、日志处理/通信模块和转换控制模块。
①用户通过网络文件系统写文件
②内核向外发送信号
③从内核中读取修改纪录
④形成日志文件
⑤传送系统设置的修改
⑥影响控制模块,使其停发心跳信号,或者启动工作模式切换
⑦转换其它模块的工作模式
⑧请求和发送日志或文件
⑨发送或监听心跳信号
日志文件系统在内核中实现,它是在本地文件系统的基础上加上一个文件操作过滤器和一个内核日志缓冲来实现的。
日志处理/通信模块是处于用户态的守护进程。日志处理/通信模块的作用有两个:记录和截断日志文件,在网络上发布或获取日志信息和文件。
转换控制模块是为fail-over而设计的,其工作流程如下图所示。
过滤器的实现
过滤器能监测到指定文件系统中的数据变化,并产生相应的记录。它是通过截获文件系统中的修改操作来实现的。
FreeBSD中,不同的文件系统安装(mount) 到统一的目录树上,为上层应用程序提供无区别的访问接口。在FreeBSD内核,每个文件系统对应于安装队列中的一个数据结构(struct mount)。这样通过在mount数据结构中增设一个标志域可以指定过滤器监视的范围。
FreeBSD内核中的VNODE层
我们采用跟踪文件系统调用的方法:对于SMB/CIFS协议,在文件系统调用接口层,将所有修改操作的函数中加入过滤器函数的调用。对于NFS协议,在NFS调用VNODE层返回之后,根据返回的结果加入过滤器的调用入口。结构见下图所示。
过滤器函数得到被修改的文件的路径及名称,快速地检查是否在被监视的范围之内,然后根据是否使用内核日志缓存,将监测形成的修改记录放入内核日志缓存,或者立即传递给用户态的日志处理/通信模块。
当采用内核日志缓存时,如果发现缓存已达容量上限,过滤器唤醒日志处理/通信模块中的读取记录进程并阻塞所有的文件修改操作,然后调用schedule() 函数放弃处理器,主动挂起。
日志处理/通信模块中的这个进程作为守护进程运行,并被设为仅次于内核进程的最高优先级。被唤醒之后,立即投入运行,从内核中取得所有可用的修改记录,然后唤醒内核态的进程,使其恢复文件系统的正常活动,并返回当前的系统调用。
内核与外部进程交换数据是通过创建一个字符型虚拟设备来实现的。
当不使用内核日志缓存时,过滤器函数直接唤醒日志处理/通信模块中的读取进程将修改记录读出到用户空间,其实现过程同上。这两种模式的选取要根据效率和安全性来权衡。
监控软件的实现
服务器的运行状态
NAS服务器有四种状态:alone、master、slave和primaryslave。
每台NAS服务器的缺省状态都是alone,即为一个独立的服务器。
心跳检测机制
服务器之间采取心跳方式来检测彼此的状态。
通常心跳检测有两种机制:一种是利用串口,基于RAW方式或PPP方式(见图 (a));另一种是使用以太网,基于TCP/IP来实现(见图 (b))。
对于串口机制来说,服务器之间通过串口来交换状态信息,实现简单,系统开销小,稳定可靠。但由于串口通信是一种点对点通信,因此多服务器之间往往组成一个环路。但从图中也可看出串口机制的弊端:每台服务器需使用两个串口,一个跟前一服务器通信,另一个与后一服务器通信。一般服务器只有两个串口(有的甚至只有一个),而UPS的状态监测也往往要占用一个串口。
以太网机制中,服务器之间通过以太网来交换状态信息。每台服务器将自己的心跳信息广播出去,这样其他的服务器均可接受到这个心跳信息。广播包一般采用IP广播包。这种机制的优点是扩展灵活,不足之处是实现比串口机制相对复杂,且以太网采用的是CSMA/CD机制,是一种尽力传输模式,时延长,易丢包,因此可靠度不如串口机制。
经过对上述两种机制的比较,加上考虑到本研究的NAS服务器只有一个串口,且这个串口还要保留给UPS使用,故我们采取以太网机制,而且针对上述以太网机制的不足做了改进。
除了服务器上的一个网卡对外提供网络服务,组成public以太网以外,我们还利用服务器上的另一块网卡作为心跳信号检测专用,组成了一个dedicated以太网。
Dedicated以太网上只传输心跳信号,流量很小,这样丢包情况大为改善,减小了传输时延,极大地提高了心跳信号传输的可靠度。
同时,心跳信号还可同时在public以太网和dedicated以太网上传输,服务器对两个网络上的心跳信号同时进行检测,从而进一步提高了故障检测的可靠度。
故障接管
实现故障接管的关键是能够实现故障检测、故障隔离和故障恢复。
在NAS服务器中,本地文件系统或者网络文件系统的故障都会影响到文件共享守护进程,因此通过监测文件共享守护进程的状态就可以监测到故障。网络通信模块的故障则可以通过心跳信号的时延来监测。
主服务器崩溃或者网络通信模块失效之后,其网络接口对外停止工作。如果是文件系统故障,NAS网络服务模块不能正常运行,这时就要停止向备份服务器发送心跳信号,主服务器的网络地址资源被出让。备份服务器在一定时间之内未收到心跳信号就会转换为主服务器。它将使用主服务器失效前的网络地址,并继续对客户提供NAS服务。这样就实现了故障接管。