李 勇
(92941部队96分队 葫芦岛 125001)
基于Linux的双机热备系统研究与设计*
李 勇
(92941部队96分队 葫芦岛 125001)
为提高Linux系统下软件的高可用性,研究了双机热备技术,分析了Linux内核机制,设计了Linux系统下的双机热备系统架构,完成了模块化设计,并提供了对外的接口。
双机热备; 高可用; Linux; 模块化
Class Number TP319
随着网络和信息技术的发展,信息系统集成度不断增大,面对的风险也越来越多,一个硬件或软件故障都可能导致网络瘫痪、系统崩溃,对企业造成损失,因此提高系统的高可用性成为最迫切解决的问题[1]。目前高可用解决方案有集群和双机热备两种。集群技术将多台服务器虚拟成一台服务器并对外提供服务,具有负载均衡能力,适合大型和超大型系统[2]。双机热备系统以其低成本、操作简洁的优势成为中小系统的首要选择。
2.1 双机热备简介
双机热备是在互为备份的两台服务器上共同执行同一服务,一台服务器处于服务的工作状态(主机),另一台服务器处于备用状态(备机)[3]。正常情况下,主机对外提供服务,备机监视主机的状态。当主机因某种故障而不能继续提供服务时,备机接管主机的工作。
是否采用双机热备,取决于服务的重要性以及中断对服务的影响。关键服务不容忍长时间的服务中断,需要通过双机热备来保证系统长期、可靠的运行[4]。
2.2 双机热备系统工作模式分析
双机热备系统一般有双工、主从和双机互备三种工作模式[5]。
在双工模式中,两台服务器同时运行同样的应用,对外提供同样的服务,彼此独立运行。当一台服务器出现故障时,对外服务也不会中断。因为两服务器都实时运行,不存在服务切换问题,但是需要增加I/O设备通信开销。由于两台服务器相互独立,难以保证逻辑控制的统一,也不符合“数出一源”的原则。
主从模式是指使用两台或两台以上的服务器,一台作为主机,对外提供服务。其他作为备机,运行与主机一样的应用,但是处于备用状态。当主机出现故障时,备机变为主机,使对外服务在短时间内恢复。
双机互备模式中,两台服务器分别运行不同的应用,彼此互为备机[6]。当一台服务器出现故障时,另一台服务器接管应用,同时运行两个应用。这是主从模式的扩展,避免了两个应用使用四台服务器。此方式存在性能瓶颈,即一台服务器同时运行两个应用,负载过大。
2.3 双机热备系统数据存储方式分析
数据是服务的基础,是服务迁移的前提。在双机热备系统中,数据存储方式有存储共享和存储隔离两种方式[7]。
在存储共享方式中,两台服务器所有数据存储在一个公共的存储空间。通过权限控制及策略,两台服务器可访问所有的数据。数据源的单一性确保了两台服务器数据的一致性。
在存储隔离方式中,两台服务器使用私有的存储空间存储各自的数据,服务器通过数据链路将新产生的数据同步到备机。
3.1 Linux系统简介
Linux系统是一个开源的、与Unix兼容的操作系统。经过多年发展,Linux已成为一个功能强大性能稳定的通用操作系统,大部分Unix上的应用程序都已经移植到Linux之上[8]。由于它的成熟和开放性,Linux在服务器市场占有较大份额。
3.2 Linux内核架构分析
Linux内核只是Linux操作系统一部分,运行在内核空间,具有最高的级别,管理系统的所有硬件设备;应用程序运行在用户态,级别最低,不能直接访问硬件资源,只能通过系统调用来间接访问硬件资源,如图1所示。
图1 Linux内核结构
Linux内核主要包含进程管理、内存管理、虚拟文件系统、网络系统、IPC、设备驱动程序等几个部分[9]。进程管理负责管理CPU资源,按照策略让各个进程都能使用CPU资源;内存管理负责管理内存资源,以便各个进程都能使用有限的内存资源;虚拟文件系统管理将外设(硬盘、磁盘、软盘、打印机等设备)抽象成为文件,通过统一的文件操作接口访问;网络服务负责管理网络设备,支持多种网络标准;IPC负责Linux系统中进程间的通信。此外,Linux系统支持模块编程,可以将软件作为一个模块插入Linux内核,进行内核级的开发[10]。
在主从模式下,主机不断地发送心跳包给备机,若备机或心跳线路出现故障,主机无法察觉。在这种情况下主机故障,系统服务无法迁移到备机。双心跳线路可避免单条线路失效的风险。
为了保持对外服务接口的一致性,系统采用虚拟IP技术。两台服务器都有独立的IP地址,但是对外服务公用一个虚拟IP地址。虚拟IP由主机拥有,当服务迁移时,虚拟IP也随之漂移到新的主机上。硬件连接如图2所示。
图2 基于Linux双机热备系统硬件拓扑图
在软件设计上,将双机热备设计成多个功能模块。利用Linux模块加载原理,将模块加载到内核,完成双机热备功能。从功能上看,软件包括基础服务、故障诊断与处理、数据管理、对外接口四个功能模块,如图3所示。
图3 软件结构
5.1 基础服务模块设计
基础服务模块负责建立并维护两台服务器的主备状态,双机热备系统状态结构如下所示
typedef struct _DUP_STATUS{
unsigned char StatusOfThis; //本机状态
unsigned char StatusOfOther;//另一台服务器状态
unsigned char Line1Status;//心跳线路1状态
unsigned char Line2Status;//心跳线路2状态
unsigned char Line3Status;//数据线路状态
unsigned char SoftStatusOfThis;//本机关键软件状态
unsigned char NetStatusOfThis;//本机网络连接状态
unsigned char Mode;//双工模式
unsigned char SoftStatusOfOther;//另一台服务器关键软件状态
unsigned char NetStatusOfOther;//另一台服务器网络连接状态
}DUP_STATUS, *PDUP_STATUS;
服务器启动时,双机热备基础服务模块根据配置信息及另一台服务器的状态确定本机的状态。一台服务器可配置为主机、备机或先启动者为主机。当一台服务器配置为主机或先启动者为主机时,若另一台服务器的状态不是主机,则它启动后就为主机,否则就为副机。当一台服务器配置为副机时,若另一台服务器的状态不是副机,则它启动后就为副机,否则就为主机。
主备机通过定期发送心跳包来确定彼此的状态,心跳包格式如图4所示,各字段含义如下:
总长:表示心跳包总长度,心跳包长度固定为10B。
源ID和目的ID:标识主机与备机的心跳线路1、线路2。
序号:用于心跳包和数据包的计数。
SGS:表示本机的双工热备状态,包括主用、备用和双工三种状态。
XL1、XL2、XL3:表示心跳线路1、线路2和数据传输线路的状态。
网络状态:表示服务器连接网络状态。
关键事件状态:表示服务器上系统服务的状态。
图4 心跳协议包格式
5.2 故障监测模块设计与实现
为了能及时发现各种错误,提高服务的可用性,采用基于双心跳线路的心跳监测协议机制,如图5所示。本模块会记录所有心跳信息,作为故障诊断的依据。
图5 双机热备心跳线路
本模块会启动三个监听线程,线程1与关键服务构成服务器系统内部的心跳链路,线程2和线程3分别维护一条主机与备机之间的心跳链路,心跳包发送周期和故障诊断周期由配置文件确定;通过监测心跳包,可获得本机和它机的综合状态,从而进行故障定位和处理。本模块可以定位和处理的故障有心跳线路故障、网络连接故障、服务器故障和关键服务故障四类。
心跳线路故障:当服务器在故障诊断周期内只能收到一条来自另一台服务器的心跳包,则另一条心跳链路故障,主备机重启心跳线程,替代故障线程。
网络连接故障:主机定期向交换机发送ICMP数据包,若主机故障诊断周期内没有收到应答,则认为网络连接故障,进行主备机服务切换。
服务器故障:服务器在故障诊断周期内收不到另一台服务器的心跳包,则认为服务器故障,进行双工切换。
关键服务故障:在一个故障诊断周期内,通过解析心跳包,发现关键服务字段为异常,则主机关键服务故障,进行主备机服务切换。
5.3 数据管理模块设计
在关键服务软件运行过程中,会产生很多重要数据。借助这些数据,关键服务可恢复到故障前的状态,降低主副机切换的损失。本模块通过数据定期同步技术实现备机与主机间重要数据的一致。传输数据的格式如图6所示,各字段含义如下:
总长:表示数据包总长度,心跳包长度不固定。
源ID和目的ID:标识主机与备机的数据线路。
序号:用于数据包的计数。
ACK、SYN、ERR:数据传输的控制标志。
图6 数据协议包格式
数据传输采用文件缓存技术,具体流程如图7所示。将获取的数据构造成传输数据包,发送到对方。若数据链路异常,则将数据放入缓存区,当缓存区满时,将缓存区数据存入磁盘临时文件,并清空缓存区数据;等链路修复后,再将临时文件和缓存区数据依次发送出去。
图7 数据传输流程
5.4 对外接口模块设计
双机热备软件为应用程序提供了编程接口,应用程序可通过编程接口访问双机热备软件,下面给出三类主要的接口。
1) 获取双工状态
int DupGetStatus(DUP_PS_STATUS *pPSStatus);
通过这一接口可获取系统的双工状态,关键软件确定自身的运行状态。
2) 状态切换
int DupSwitch(void);//请求状态切换
int DupSetStatus(unsigned int iStatus);//强制状态切换
在运行过程中,关键软件感知本机的主要部件、主要进程运行不正常或发生了故障,通过请求切换功能改变系统的双工状态。
3) 等待双工事件
等待主/副机状态改变编程接口等待主/副机状态改变事件。接口函数定义如下:
int DupWaitStatusChg(unsigned int *pStatusChanged, DUP_STATUS *pDupStatus, DWORD msTimeOut);
当主副机状态改变时,关键软件通过该接口可获取系统的双工状态改变信息,从而改变本身的工作状态。
双机热备是提高系统高可用性的技术。本文设计并实现了Linux系统下主从模式的双机热备系统。该系统支持主备机间数据传输,为关键服务的快速恢复和数据备份提供了条件。
[1] 林晓东,刘心松.高可用性系统的研究与实现[J].电子科技大学学报,1997(5):533-538. LIN Xiaodong, LIU Xinsong. Research and implementation of high availability system. Journal of University of Electronic Science and technology of China,1997(5):533-538.
[2] 胡兵全.基于Windows的双机热备系统的设计与实现[D].武汉:华中科技大学,2004:12-13. HU Bingquan. Design and implementation of dual computer hot standby system based on [D]. Wuhan: Huazhong University of Science and Technology,2004(5):12-13.
[3] 任振芳.基于Xen虚拟机的双机热备可用性研究[D].郑州:郑州大学,2012:16-17. REN Zhenfang. Research on availability of dual computer hot standby based on Xen virtual machine [D]. Zhengzhou: Zhengzhou University,2012:16-17.
[4] 弗洛伊德.皮耶达德.高可用性:设计、技术与运作过程[M].高广卿,何铖,译.北京:社会科学文献出版社,2003:32-33. Freud. Piedade. High availability: design, technology and operation process [M]. Gao Guangqing, osmium, translated. Beijing: Social Science Literature Publishing House,2003:32-33.
[5] 李胜广,张其善.实现Linux防火墙系统双机热备的方法[J].计算机与数字工程,2006,34(3):77-78. LI Shengguang, ZHANG Qishan. The method of dual computer hot standby in the Linux firewall system [J]. Computer and digital engineering,2006,34(3):77-78.
[6] 谢斌,高扬.Linux高可用集群心跳机制研究[J].计算机工程与应用,2004(1):67-68. XIE Bin, GAO yang.high availability cluster heartbeat mechanism Linux. Computer engineering and applications,2004(1):67-68.
[7] 姚耀文,茹建斌,缪炯烨.基于Linux的服务器群集方案[J].计算机工程,2001,27(4):139-140. YAO Yaowen, RU Jianbin, MIAO Jiongye. Linux server cluster scheme based on [J]. Computer Engineering,2001,27(4):139-140.
[8] 毛德操,胡希明.Linux内核源代码情景分析[M].杭州:浙江大学出版社,2003:273-274. MAO Decao, HU Ximing.Linux kernel source code scenario analysis[M]. Hangzhou: Zhejiang University press,2003:273-274.
[9] 赖娟.Linux内核分析及实时性改造[D].武汉:华中科技大学,2007:32-33. LAI Juan.Linux kernel analysis and real time transformation of [D]. Wuhan: Huazhong University of Science and Technology,2007:32-33.
[10] 孙海彬,傅谦,徐良贤.Linux内核模块的实现机制[J].微型机与应用,2000,11(2):10-11. SUN Haibin, FU Qian, XU Liangxian.Linux kernel module implementation mechanism [J]. Microcomputer and application,2000,11(2):10-11.
Research and Design of Dual Computer Hot Standby System Based on Linux
LI Yong
(Unit 96, No 92941 Troops of PLA, Huludao 125001)
In order to improve the high availability of software based on Linux system, the hot standby technology is studied, the mechanism of Linux kernel is analyzed, the architecture of dual machine hot standby system based on Linux system is designed, the modular design is completed, and the call interface of the system is provided.
hot standby, high availability, Linux, modularization
2016年5月4日,
2016年6月25日
李勇,男,硕士研究生,工程师,研究方向:计算机应用软件、系统安全。
TP319
10.3969/j.issn.1672-9722.2016.11.041