首页> 中国专利> 一种基于socket的容错计算机系统的网络同步方法

一种基于socket的容错计算机系统的网络同步方法

摘要

本发明公开了一种基于socket的容错计算机系统的网络同步方法。该方法通过修改Linux操作系统,在Linux网络体系结构的套接字接口层上建立监测器,对socket通信相关内核函数进行监控。当双模冗余进程通过socket方式进行网络通信时,在套接字接口层将其通信操作截获并触发同步逻辑。同步逻辑通过改造socket系列内核函数实现,双模进程在执行改造后的内核函数时进入同步点并完成同步过程。该方法无需特殊硬件定制,实现简单。改造后的操作系统适用于普通硬件架构,通用性强。同步流程由操作系统主动完成,对上层应用完全透明。具有好的可扩展性,可扩展至多模冗余系统。

著录项

  • 公开/公告号CN101383690A

    专利类型发明专利

  • 公开/公告日2009-03-11

    原文格式PDF

  • 申请/专利权人 西安交通大学;

    申请/专利号CN200810231895.4

  • 申请日2008-10-27

  • 分类号H04L1/22;H04L7/00;

  • 代理机构西安通大专利代理有限责任公司;

  • 代理人张震国

  • 地址 710049 陕西省西安市咸宁路28号

  • 入库时间 2023-12-17 21:32:13

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-12-16

    未缴年费专利权终止 IPC(主分类):H04L1/22 授权公告日:20110601 终止日期:20141027 申请日:20081027

    专利权的终止

  • 2011-06-01

    授权

    授权

  • 2009-05-06

    实质审查的生效

    实质审查的生效

  • 2009-03-11

    公开

    公开

说明书

技术领域

本发明属于计算机领域,涉及容错技术与同步技术,具体涉及一种基于socket的容错计算机系统的网络同步方法。

背景技术

随着互联网以及信息平台的广泛应用,信息化已成为企业核心竞争力的重要组成部分。在现代企业中,服务器宕机时间是损失利润的主要原因之一。对那些需要保障信息安全和提供不间断信息服务的机构来说,例如证券、制造、通信、银行、运输,业务系统的容错性和不间断性显得尤为重要。如何保障各种关键应用持续运营,达到永续经营的良性循环,已成为当今企事业单位和IT领域急需解决的关键问题。容错计算机及相关技术正是在这种客观需求下应运而生,利用容错计算机能避免因服务器故障而引发的数以万计的经济损失。

容错计算机是在冗余(硬件冗余、时间兀余、信息冗余、软件冗余)基础上,通过合理的体系结构,在系统软件的有效管理下而形成的高可靠、高可用计算机。故障检测是容错计算机的关键技术之一。而在协调完成多模块容错系统的表决、故障模块的隔离过程中,同步是其核心。在多模冗余系统中,各模块运行相同的任务,对结果进行比较、表决,从而检错。无论将比较点,表决数据置于何处,例如处理器核(Processor Core),高速缓存(Cache),主存(Memory)等,同步都是一个关键的环节。

同步方式可以分为时钟同步与任务同步。时钟同步包括严格的硬件时钟同步和部分软件实现的松散时钟同步,以及引伸的相关算法。时钟同步发现错误及时,开销小,但需要一定的硬件支持,实现复杂。任务同步以一个独立运行的、具有一定逻辑任务的一次运行作为同步的基础,用这种方式,系统在任务中设立一个或多个比较、表决点。在相同比较表决点位置,运行正常的任务具有一致的任务进程状态数据和应用数据,处于任务同步状态。此时可对任务的中间结果和最后输出进行一致性判断,即对任务进程状态数据和应用数据进行一致性的比较表决判断,从而检错。

对于网络数据,任务同步又有不同的实现方法。一种方法在设备驱动与操作系统内核之间添加一层伪设备驱动Pseudo Device Driver(PDD),在PDD中设置同步点与检查点,对流经数据进行比较。另一种方式将同步点移入了操作系统内核中,将同步点设置在网络核心层的netif_rx()(接收数据包)和dev_queue_xmit()(发送数据包)等函数中。还有一些研究对IP层进行改动,添加连接管理和缓冲管理模块,在高可用集群系统上实现TCP连接的同步。当然,也可直接利用硬件锁步,以特定硬件及体系结构实现同步。

以上各种网络数据同步方法中,有一些太靠近底层设备,有一些需要对TCP/IP协议本身作改动,有一些完全依赖于硬件设计,或多或少都存在实现上的复杂性。

发明内容

本发明的目的在于克服上述现有技术的缺点,提供了一种简单有效的方式实现容错系统中网络数据同步的基于socket的容错计算机系统的网络同步方法。

为达到上述目的,本发明采用的技术方案是:在Linux网络体系结构的套接字接口层插入监测器,进程通过socket方式进行网络通信调用socket相关接口函数,socket相关接口函数包括套接字创建函数socket()、绑定端口函数bind()、监听端口函数listen()、请求连接函数connect()、接受连接函数accept()、关闭连接函数close()、发送数据包函数send()或write()、接收数据包函数recv()或read(),接口函数通过系统调用进入操作系统内核,并执行对应内核函数完成核心操作,包括sys_socket(),sys_bind(),sys_listen(),sys_accept(),sys_connect(),__sock_sendmsg(),__sock_recvmsg(),sys_close(),对以上内核函数设置监测,一旦内核函数被双模冗余进程调用则触发同步逻辑;

其具体步骤如下:

1)对创建socket结构相关内核函数插入同步逻辑

Socket通信要求通信双方进程创建通信套接字数据结构即struct socket结构,并以socket类型inode节点的文件打开方式与进程关联,内核函数sys_socket()用于完成此任务,插入同步逻辑后的sys_socket()函数使双模冗余进程仅建立单一socket结构,并共用该结构进行网络通信,当监测器监测到双模冗余进程调用sys_socket()函数时,执行同步逻辑进行同步,先到达的进程P1完成socket结构创建过程,将其地址临时保存,并进入等待队列睡眠等待;后到达的进程P2根据先到达的进程P1保存的地址获取socket结构,并唤醒P1,完成同步逻辑后,P1,P2分别建立自己的文件对象、目录项对象与socket结构关联,也即完成了双模进程共用socket结构的创建;

2)对建立与关闭连接相关内核函数插入同步逻辑

进程在收发数据包进行网络通信前,需要完成建立通信连接的辅助操作,包括调用bind()绑定通信端口,listen()监听端口,accept()接收连接请求,connect()发送连接请求,其中listen(),accept()和connect()仅用于TCP通信,在此类函数的同步逻辑中,将双模进程区分为主、从进程,主进程执行核心操作,从进程仅完成形式同步;

网络通信结束后进程调用close()函数关闭连接,在关闭函数同步逻辑中,主进程执行sock_close()释放socket;从进程仅完成同步等待,不执行核心操作;

3)对数据包收发内核函数插入同步逻辑

通信进程调用send()或write()函数发送数据,send()和write()函数都对应于内核函数__sock_sendmsg(),对于发送过程,从进程到达同步点后,在内核堆区申请临时空间存储待发送的数据包;主进程到达后,将自身待发送数据包与从进程存储的数据包进行比较,若数据相同则执行发送,若不同则触发出错处理;对于接收过程,主进程到达同步点后,调用接收函数接收数据包,并在内核堆区申请空间将数据包复制并存储;从进程到达后从内核堆区将数据包拷贝到本进程的地址空间。

本发明在内核中添加同步用数据结构和同步项,定义等待队列socket_wq,到达同步点尚未完成同步的任务在此等待队列中睡眠等待,定义数据结构structft_socket_msghdr,用于存储同步点任务的需要比较的msghdr数据包,在socket结构中添加ft_socket_bind_syn,ft_socket_listen_syn,ft_socket_connect_syn,ft_socket_read_syn,ft_socket_write_syn,ft_socket_close_syn域作为同步标志位;增加ft_socket_msghdr型指针*ft_msg_recv,*ft_msg_send,作为内核临时存储区空间的地址指针;增加ft_socket_ret用于存储函数操作返回值,在进程控制块中增加ft_socket_executor用于标识主从进程,增加*ft_create_socket和*ft_accept_socket作为同步点上公用socket结构的指针。

本发明的监测器对进程类型进行判断,若执行内核函数的进程为冗余进程,则执行插入同步逻辑的内核函数,接下来依次对sys_socket(),sys_bind(),sys_listen(),sys_accept(),sys_connect(),__sock_sendmsg(),__sock_recvmsg()和sys_close()函数进行改造,插入同步逻辑;

改造sys_socket(),sys_socket()用于创建socket结构并将此结构与进程联系,其中创建部分由sock_create()完成,连接部分由sock_map_fd()完成。当双模冗余任务进程调用sys_socket()创建socket时,对双模进程进行同步,使其共用一个socket结构。根据ft_socket_executor判断进程类型,该值为1的进程为主进程,该值为0的进程为从进程。如果主进程先到达同步点,则调用sock_create()完成创建过程,将创建的socket结构地址存入ft_create_socket中,之后进入等待队列socket_wq等待,后到达同步点的从进程读取ft_create_socket并唤醒等待中的主进程完成同步;如果从进程先到达同步点,则进入等待队列socket_wq睡眠等待,后到达的主进程完成创建工作后唤醒从进程完成同步。在sock_create()函数中最终调用sock_alloc()分配socket结构和其对应的索引节点,对索引节点的引用计数i_count设为2,以便双模进程共用一个socket结构和索引节点。在创建socket结构的同时需要将ft_socket_bind_syn,ft_socket_listen_syn等所有同步标志位初始化为0。之后,双模冗余进程分别调用sock_map_fd()建立自己的文件对象、目录项对象与索引节点关联。其中,socket结构中的file指针指向主进程的文件对象。

改造sys_bind(),根据ft_socket_executor区分主从进程执行不同的操作。对于主进程,执行ops->bind()绑定端口,将返回值存入ft_socket_ret,将同步位ft_socket_bind_syn置1,唤醒socket_wq等待队列中的从进程;对于从进程,到达同步点时,若ft_socket_bind_syn为1,通过同步点,将ft_socket_bind_syn清0,并从ft_socket_ret中读取返回值,若ft_socket_bind_syn为0,进入socket_wq睡眠等待。

改造sys_listen(),根根ft_socket_executor区分主从进程执行不同的操作。对于主进程,执行ops->listen()监听端口,将返回值存入ft_socket_ret,将同步位ft_socket_listen_syn置1,唤醒socket_wq等待队列中的从进程;对于从进程,到达同步点时,若ft_socket_listen_syn为1,通过同步点,将ft_socket_listen_syn清0,并从ft_socket_ret中读取返回值,若ft_socket_listen_syn为0,进入socket_wq睡眠等待。

改造sys_accept(),sys_accept()由监听进程调用,接收连接请求并创建新的通信socket。根据ft_socket_executor区分主从进程,主进程调用sock_alloc()分配新的socket结构,通过ops->accept()将新生成的socket转变为通信socket,用ft_accept_socket保存其地址,并唤醒等待队列socket_wq;从进程根据ft_accept_socket是否为空判断到达顺序,从进程若先到达同步点,则进入等待队列等待,若后到达同步点,则通过ft_accept_socket读取新创建的socket与其建立联系。

改造sys_connect(),根据ft_socket_executor区分主从进程执行不同的操作。对于主进程,执行ops->connect请求连接,将返回值存入ft_socket_ret,将同步位ft_socket_connect_syn置1,唤醒socket_wq等待队列中的从进程;对于从进程,到达同步点时,若ft_socket_connect_syn为1,通过同步点,将ft_socket_connect_syn清0,并从ft_socket_ret中读取返回值,若ft_socket_connect_syn为0,进入socket_wq睡眠等待。

改造send()和write(),这两个函数均可用于发送数据,在内核中最终都调用__sock_sendmsg(),可改__sock_sendmsg()同时捕获两种调用方式。在内核堆区为ft_msg_send分配空间用于存储供比较的数据包。根据ft_socket_executor区分主从进程,从进程首先准备好需要发送的数据包struct msghdr msg,将msg拷贝入ft_msg_send指向的内存空间中,对ft_socket_write_syn置1,唤醒等待队列,自己进入等待队列睡眠;主进程到达同步点时,若ft_socket_write_syn为0,则进入等待队列等待,若ft_socket_write_syn为1,则将自己的数据包与ft_msg_send指向的内存空间中的数据进行比较,并最终调用ops->sendmsg()发送数据,将ft_socket_write_syn清0,唤醒等待队列。其中需要比较的数据包含msghdr结构中的所有内容,包括msg_name,msg_namelen,msg_iov,msg_iovlen,msg_control,msg_controllen,msg_flags等。

改造recv()和read(),这两个函数均可用于接收数据,在内核中最终都调用__sock_recvmsg(),可改造__sock_recvmsg()同时捕获两种调用方式。在内核堆区为ft_msg_recv分配空间用于存储供复制的数据包。根据ft_socket_executor区分主从进程,主进程首先调用ops->recvmsg()接收数据存入struct msghdr msg中,并将msg中的内容逐项拷贝入ft_msg_recv指向的内存空间中,将同步标志位ft_socket_read_syn置1,并进入等待队列等待;从进程到达后从ft_msg_recv指向的内存空间中将数据包拷贝入自己的struct msghdr msg中,包括msg_name,msg_namelen,msg_iov,msg_iovlen,msg_control,msg_controllen,msg_flags等内容。最后将ft_socket_read_syn清0,唤醒等待队列中的主进程。

改造sys_close(),根据ft_socket_executor区分主从进程执行不同的操作。对于主进程,执行sock_close()释放socket,将同步位ft_socket_close_syn置1,唤醒socket_wq等待队列中的从进程;对于从进程,到达同步点时,若ft_socket_close_syn为1,通过同步点,将ft_socket_close_syn清0,若ft_socket_close_syn为0,进入socket_wq睡眠等待。

本发明通过修改linux操作系统内核,在套接字接口层上设置同步点,对双模冗余进程的网络通信进行同步。经过在套接字层设置监测器,插入同步逻辑改造后的操作系统,主动对socket相关内核函数进行监控,截获调用相关函数进行网络通信的双模冗余进程,并对其进行同步。整个过程对上层应用完全透明。与其他实现方式相比,此方法实现简单,无需改动硬件设计,对设备驱动透明,无需修改下层网络协议。

附图说明

图1为本发明的工作流程图;

图2为本发明的同步原理图;

图3为本发明在接收数据同步点上主进程的工作流程图;

图4为本发明在接收数据同步点上从进程的工作流程图;

图5为本发明在发送数据同步点上主进程的工作流程图;

图6为本发明在发送数据同步点上从进程的工作流程图。

具体实施方式

下面结合附图对本发明作进一步详细说明。

如图1所示。图中以服务器端运行双模冗余为例,客户端如需运行双模冗余,流程类似。如图所示,冗余进程同步执行create(),bind(),listen(),accept(),read(),write(),close()等操作。图中服务器端,左侧的进程为主进程,即主从标志位ft_socket_executor为1的进程;右端为从进程,即ft_socket_executor为0的进程。图中实线框内的操作执行实际的核心操作,虚线框内的操作仅完成同步。执行create()操作,主进程创建socket索引节点结构,从进程在同步点与socket结构建立连接,双进程公用一个socket结构。执行bind()操作,主进程将socket结构与指定端口绑定,从进程在同步点同步等待,不执行实际操作。执行listen()操作,主进程完成将其所建立的socket转变为监听socket,从进程在同步点同步等待,不执行实际操作。执行accept()操作,主进程创建新的通信socket,从进程在同步点与该socket建立关联,同样双进程共享socket。执行read()操作,主进程在读取下层传递来的数据包的同时,将数据复制到内核临时存储区中,从进程在同步点从临时存储区中读取数据包。执行write()操作,从进程在同步点将所需写出的数据存入内核临时存储区,主进程将自己的数据与从进程存入的数据进行比较,并最终将一份数据传向下层。执行close()操作,主进程释放socket结构,从进程在同步点同步等待。从以上过程可以看出,主从进程始终通过共享的socket结构完成套接字方式的通信。

双模冗余进程的同步原理如图2所示,任务P1,P2是一对冗余进程,分别独立执行,在执行到socket()系统调用收发网络数据时进行同步。图中,第一次同步对数据发送同步,P2准备好了发送数据首先到达同步点,而P1尚未到达,P2进入等待状态,在经过时间t1后,P1也顺利到达同步点,内核启动同步过程,对发送数据进行比较并向下层发送。第二次同步为对接收过程同步,P1首先到达同步点进入等待,在经过时间t2后P2到达同步点,内核进行同步,将下层数据复制为两份分别发送给P1,P2。系统为同步特别构建了等待队列,先到达同步点的任务进入等待队列等待,当后到达任务进入同步点后将先到任务从等待队列唤醒。

参见图3,主进程进入数据接收同步点,首先调用sock->ops->recvmsg()接收数据包,同时分配临时存储区ft_msg_recv的空间,并将接收的数据包逐项拷贝入临时存储区ft_msg_recv所指空间中。此后将同步标志位ft_socket_read_syn置1,对等待队列socket_wq执行wake_up()操作,唤醒可能在等待的从进程,而自己进入等待队列socket_wq等待。主进程在等待队列中循环对标志位ft_socket_read_syn进行判断,当ft_socket_read_syn被(从进程)清0后,主进程脱离等待队列,释放临时存储区,结束数据接收同步过程。

参见图4,从进程到达数据接收同步点,首先进入等待队列socket_wq等待,并对标志位ft_socket_read_syn循环检测,当ft_socket_read_syn被(主进程)置1后,从进程脱离等待队列,之后从临时存储区中将数据包逐项拷贝入自己的数据空间中,最后将ft_socket_read_syn清0,并对等待队列socket_wq调用wake_up操作,唤醒可能在等待的主进程,结束数据接收同步过程。

参见图5,主进程到达数据发送同步点,首先进入等待队列socket_wq等待,并循环检测标志位ft_socket_write_syn,当ft_socket_write_syn被(从进程)置1后,主进程被唤醒。然后将自己欲发送的数据包与内核临时存储区中的数据逐项进行比较,比较通过后调用ops->sendmsg()发送数据,若未通过转入错误处理。最后将ft_socket_write_syn清0,对等待队列socket_wq执行wake_up操作,唤醒可能在等待的从进程,结束数据发送同步过程。

参见图6,从进程到达数据发送同步点,首先分配内核临时存储区,将欲发送数据包逐项考入临时存储区中,并将ft_socket_write_syn置1。然后对等待队列socket_wq执行wake_up()操作,唤醒可能在等待的主进程,而自己进入等待队列等待,并循环检测标志位ft_socket_write_syn。当ft_socket_write_syn被(主进程)清0后,从进程脱离等待队列,释放临时存储区,结束数据发送同步过程。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号