基于内核中套接字对接的第七层负载均衡的方法

文档序号:6605516阅读:137来源:国知局
专利名称:基于内核中套接字对接的第七层负载均衡的方法
技术领域
本发明涉及机群中负载均衡的方法,尤其涉及一种基于内核中套接字对接的第七层负载均衡的方法,属于计算机网络技术领域。
背景技术
随着计算机网络应用的普及,计算机网络用户的数量在不断膨胀,这对于服务提供商提出了更大的挑战按照传统的方法使用单台服务器提供服务已经远远不能满足庞大的用户请求的需求;现在通常都会使用多台服务器向用户提供服务。但是,如何才能把所有的用户请求均衡地分布到后台服务器上,则是负载均衡需要解决的问题。
如果按照实施负载均衡策略组件所处的位置来划分,可以将负载均衡分为两类基于域名服务器(Domain Name Server,简称DNS)的负载均衡和基于服务端应用层与/或网际协议(Internet Protocol,简称IP)层的负载均衡。基于DNS的负载均衡通常使用DNS轮询(round-robin)机制,在DNS上为一个名字设置多个IP地址,分别指向后台实际提供服务的服务器。其机制十分简单,却缺乏灵活性,而且有很多限制条件;例如后台的服务器必须使用外部地址,能和客户端直接进行通信。而基于服务端应用层与/或IP层的负载均衡则不同,它可以根据一定的策略,对请求数据的具体内容进行分析,适当修改请求报文的内容,将其发送到适当的服务节点;例如专用的负载均衡器硬件、环球网(Web)服务器提供的万维网(World Wide Web,简称WWW)服务程序所用的超文本传输协议(Hypertext Transfer Protocol,简称HTTP)重定向功能等,都可以在服务端根据应用的请求而实施负载均衡。
集群技术可以把多台服务器封装成一些服务器聚集,统一对外界提供服务。这种技术具有很多优点,例如可扩展性好、对外界屏蔽内部细节等。在集群中通常会为用户提供一个唯一的单一登录点(称为前置节点),它和集群中的所有服务器保持连通,这种特点决定了可以在集群中实施特殊的负载均衡机制。
集群中的前置节点通常就是为用户提供的单一登录点,它负责转发客户端和服务器之间交互的数据,并根据一定的策略,将客户端的请求均衡地分发到各个服务节点上,并将服务节点的响应转发给客户端,从而透明地为用户提供强大的服务处理能力。
实际上,前置节点的主要任务有两个报文转发和均衡负载。报文转发可以在两个层次上进行传输层和应用层。基于传输层的报文转发可以使用网络地址转换(NAT)、目标地址转换、IP封装、直接包转发等技术;这样可以直接修改IP数据报的源地址、目的地址,或者另外附加一个IP数据报首部,或者直接修改数据报的以太网地址,最终将报文发送到目的地址。
由于上述的过程只需修改传输控制协议(Transfer Control Protocol,简称TCP)首部或IP首部,不涉及传输数据的变化,因此,能够快速地转发报文;其缺点是缺乏灵活性。而基于应用层的包转发方式则不同,它把接收到的数据报逐步解析,剥离IP首部和TCP首部,最终得到应用数据;然后根据应用数据选择适当的目的地址,重新封装TCP首部和IP首部,通过网络驱动程序转发给内部网络的目的地址。其优点是可以根据请求的内容选择目标节点,并能对请求数据进行缓冲,同时可以屏蔽内部节点的细节和故障,对终端用户透明。由于应用层是开放式系统互联参考模型(Open System InterconnectReference Model简称OSI模型)中的第七层,因此这种报文转发技术通常就称为第七层转发。
由于前置节点需要处理各种用户请求,这涉及到报文分析、数据库查询等大量操作,不可能完全在内核空间中完成,因此,前置节点一般都采用应用层程序来实现报文转发和负载均衡。
以用于电子邮件接收的(Point of Presence,also Post Office Protocol,简称POP3)服务为例如果只对外提供一台POP3服务器,而且可以直接与客户端连通,那么情况就非常简单客户端只需要和POP3服务器的110端口建立一条TCP连接,并向服务器请求数据即可。而对于一个提供POP3服务的集群来说,情况就变得非常复杂通常大型的邮件服务器中的用户都是分布式的,用户的数据文件可能分布在多台邮件服务器上,而客户端对此并不知情。假设客户端需要读取“username@domain.com”的邮件,过程如图1所示详细步骤如下1、客户端向前置节点(domain.com)的110端口发起请求,要求读取用户“username@domain.com”的邮件;2、前置节点的网卡接收到用户请求之后,操作系统将其从内核空间拷贝到用户空间,交给应用层的程序处理;3、应用层程序对用户请求进行分析,确定是POP3请求,需要查询邮件用户数据库LDAP/DB;4、返回查询结果,确定用户“username”的数据文件保存在邮件服务器Mail Server1上;5、将用户空间中的数据拷贝到内核空间,重新封装报文;6、和邮件服务器Mail Server1建立套接字(socket)连接,发送请求数据;7、邮件服务器Mail Server1接收到请求之后,读取用户“username”的邮件数据,作为响应报文发送回前置节点;响应报文沿着来路反向返回,直至发送到客户端。
如果客户端的请求是新建立一个“username@domain.com”的用户,那么上面的步骤3就不再是简单地查询邮件用户数据库;应用层程序会搜集所有邮件服务器的负载、磁盘空间等信息,采用相应的策略,将该用户的请求分配到最合适的一个邮件服务器上,并在这台邮件服务器上为该用户建立数据文件,并将结果返回给前置节点,由前置节点转发给客户端,这样就能保证所有的邮件服务器之间的负载是均衡的。
TCP是面向连接的协议,普通的TCP连接的建立需要经历一个三次握手的过程首先,请求端(通常称为客户端)向连接端(服务器)发送一个SYN报文,指明要打开的端口,报文中包括客户端的初始序号ISNC;接着,服务器返回一个命令正确应答(ACK)报文进行应答,其中的应答号等于ISNC+1,同时向客户端发送一个SYN报文,其中包括服务器的初始序号ISNS;最后,客户端将ISNS+1作为应答号向服务器发送ACK报文进行应答,同时可以发送请求数据报文。
此后,客户端和服务器之间就使用这个TCP连接进行交互数据,构成一个完整的会话。
可以使用源IP地址、源端口号、目的IP地址以及目的端口号来唯一标识一个会话;而每次会话的具体过程还需要另外两个值进行标识序列号(SEQ)和应答号(ACK)。其中源IP地址和目的IP地址位于IP数据报的首部中,而源端口号、目的端口号、序号、应答号则位于TCP报文的首部中。
和基于传输层的报文转发技术相比,第七层转发有一个致命的缺点就是效率非常低,因为它将传输的应用数据从内核空间拷贝到用户空间,未对其进行任何修改,又拷贝回内核空间,而且还引起了相应的上下文切换的开销。FreeBSD中提供了一种转移套接字(divert socket)机制,允许在用户层直接处理TCP/用户数据报协议(User Datagram Protocol,简称UDP)报文,可以简化应用层转发报文的过程,但是仍然不可避免应用数据进出内核空间的开销。
实际上,转发节点和客户端、服务器分别建立的两个TCP连接并非毫不相干。这两个连接一旦建立,在内核空间中就可以得到这两个连接各自的源地址、源端口号、目的地址和目的端口号;而且请求和应答的序列号之间也存在一定的对应关系。分别以符号串SEQC-D、SEQD-S、SEQS-D、SEQD-C表示客户端到转发节点、转发节点到服务器、服务器到转发节点、转发节点到客户端之间报文中的序列号,以ACKC-D、ACKD-S、ACKS-D、ACKD-C表示客户端到转发节点、转发节点到服务器、服务器到转发节点、转发节点到客户端之间报文中的应答序列号,并设ΔR=SEQD-S-SEQC-D=ACKD-S-ACKC-DΔA=SEQD-C-SEQS-D=ACKD-C-ACKS-D转发节点在第一次对客户端和服务器之间的请求/响应信息进行转发之后,就可以计算出这两个值,而且这两个值在该会话的生存期内保持不变;此后转发节点就可以根据接收到的客户端报文中的SEQC-D和服务器报文中的SEQS-D来计算出对应的SEQD-S和SEQD-C。
图2所示为使用基于内核套接字对接机制对报文进行转发的示意图,客户端经由转发节点完成一次请求任务的过程为1、客户端向转发节点发送第一个SYN报文,其中包括32位的客户端IP地址(简称SA)、32位的转发节点的IP地址(简称DA)、16位的客户端端口号(简称SP)、16位的转发节点端口号(简称DP)、初始序列号(简称ISNC);2、转发节点在传输层接收到SYN报文后,产生一个记录,记下SA、DA、SP、DP、ISNC等值,并将该报文传递给上层等待接收的应用层程序。应用层程序产生一个初始序列号(简称ISND),并向客户端发送应答连接包;其中ACK=ISNC+1、SEQ=ISND;3、客户端向转发节点开始请求数据,SEQ=ISNC+1,ACK=ISND+1;4、转发节点上的应用层程序接收到数据后,对请求数据的内容进行分析,确定目标服务器节点;5、转发节点重复1到3步,和真正提供服务的服务节点建立连接,并将请求数据发送给服务节点;6、服务节点接收到请求之后,将响应数据发送给转发节点;
7、转发节点接收到服务节点的响应数据之后,将响应数据重新组装,将其发送给客户端;同时查找转换映射表中的数据,计算相应的转发前后的序号差值ΔR和ΔA,完成转换映射表的构造;8、转发节点的应用层程序确定可以进行双向转发之后,通过输入输出控制(ioctl)系统调用通知内核合并两个socket,同时释放对这两个socket的控制权;9、以后的数据转发,根据图2所示的机制,在内核中修改TCP报文首部、IP数据报首部中相应的内容,直接对数据进行转发,所转发的数据将不再进出用户空间,因此将极大提高转发的效率;10、连接的双方如果一方中断,则释放整个连接。

发明内容
本发明的主要目的是提供一种基于内核中套接字对接的第七层负载均衡的方法,可以减少前置节点/服务器在转发数据时由于数据在内核空间和用户空间之间拷贝,以及相应的上下文切换等所引起的系统开销,降低前置节点的负载,缩短用户请求的响应时间。
本发明的目的是这样实现的一种基于内核中套接字对接的第七层负载均衡的方法,至少包括步骤10前置节点接收到客户端的请求;步骤20修改请求报文的源、目的地址和端口号,将报文直接发送给服务节点;步骤30接收服务节点的响应;步骤40修改响应报文的源、目的地址和端口号,将报文直接发送给服务节点;步骤50如果请求完成,则回收两个套接字,更新转换映射表;否则执行步骤10。
在上述的步骤20之前还进一步包括步骤11如果前置节点第一次接收到客户端的请求,则将该请求数据从内核空间拷贝到用户空间,交由应用层程序处理;步骤12应用层程序对请求数据进行分析,并根据负载均衡策略和服务节点的状态,将本次服务请求交由相应的服务节点处理;步骤13应用层程序和选定的服务节点建立套接字连接,将用户请求数据重新封装,并将其转发给选定的服务节点;步骤14服务节点对用户请求进行处理,并将响应报文发给前置节点;步骤15前置节点的应用层程序接收到响应报文,构建转换映射表,通知内核合并该两个套接字,同时放弃对两个套接字的控制权。
步骤12中所述的负载均衡策略至少为轮询算法;或加权的轮询算法;或最少连接数算法;或加权的最少连接数算法;或基于请求位置的最少连接数算法,即将相同客户端IP的请求发送给相同的服务节点处理;或预先分配任务法,即根据承担任务情况来选择负载最轻的节点;或加权的预先分配任务法,即根据承担任务情况及节点的性能来综合选择负载最轻的节点;或客户端IP地址分区法,即将不同客户端的IP地址分为多个区,来自一个区的请求全部被分发到一个指定的节点。
本发明所提供的基于内核中套接字对接的第七层负载均衡的方法,可以充分利用传输层转发和应用层转发的优点,既能提高报文转发效率,又具有很大的灵活性,从而更快、更均衡地把客户端的请求分发到服务节点上。
并且可以使用这种机制设计一种通用的中间件,实现所有端口上的报文转发功能;也可以对报文进行复杂的分析,应用特殊的过滤规则,实现功能复杂的防火墙;甚至可以对现有TCP连接动态地进行迁移。


图1为现有技术在集群中使用应用层程序处理POP3服务请求的过程;图2为本发明使用基于内核套接字对接机制对报文进行转发的示意图;图3为使用基于内核中套接字对接技术实现第七层负载均衡的流程图;图4为套接字对接之后的通信过程的流程图。
具体实施例方式
以下结合具体的实施例对本发明做进一步的说明参见图3,本发明的方法首先接受客户端建立连接的请求,完成初始化的工作,然后就接收客户端的数据请求;根据该请求判断转换映射表中是否已有相应的记录,如果有记录,则修改请求报文的源地址、目的地址及端口号等内容,将报文直接转发给服务节点;然后接收服务节点的响应,接着修改响应报文的源、目的地址及端口号等内容,将报文直接转发给服务节点;再进一步判断请求是否完成;若未完成,则返回接收客户端的数据请求,继续循环,接受客户端建立连接的请求;若已完成,则回收两个Socket,更新转换映射表,结束。
如果上述的转换映射表中没有记录,则将请求交给应用层程序处理,应用层程序按照负载均衡策略确定服务节点,然后应用层程序与服务节点建立连接,发送数据请求;接着接收服务节点的响应并搜集负载等相关信息,接收到服务节点的响应后,通知内核合并两个Socket,把响应信息转发给客户端,再判断请求是否完成,若未完成,则返回接收客户端的数据请求,继续循环;若已完成,则回收两个Socket,更新转换映射表,结束。
由图3可知,前置节点的应用程序在接收到邮件服务器Mail Server1的响应报文之后,就可以确定客户端和服务节点之间可以相互转发报文,因此通知内核将两个socket合并,此后前置节点在转发客户端和邮件服务器MailServer1之间的通信时,就可以直接在内核空间完成,在两个socket合并之后,客户端和服务节点之间的通信过程就如图4所示,因此,大大减少了传输时间,极大地提高了效率。
最后所应说明的是以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。
权利要求
1.一种基于内核中套接字对接的第七层负载均衡的方法,其特征在于至少包括步骤10前置节点接收到客户端的请求;步骤20修改请求报文的源、目的地址和端口号,将报文直接发送给服务节点;步骤30接收服务节点的响应;步骤40修改响应报文的源、目的地址和端口号,将报文直接发送给服务节点;步骤50如果请求完成,则回收两个套接字,更新转换映射表;否则执行步骤10。
2.根据权利要求1所述的基于内核中套接字对接的第七层负载均衡的方法,其特征在于步骤20之前还进一步包括步骤11如果前置节点第一次接收到客户端的请求,则将该请求数据从内核空间拷贝到用户空间,交由应用层程序处理;步骤12应用层程序对请求数据进行分析,并根据负载均衡策略和服务节点的状态,将本次服务请求交由相应的服务节点处理;步骤13应用层程序和选定的服务节点建立套接字连接,将用户请求数据重新封装,并将其转发给选定的服务节点;步骤14服务节点对用户请求进行处理,并将响应报文发给前置节点;步骤15前置节点的应用层程序接收到响应报文,构建转换映射表,通知内核合并该两个套接字,同时放弃对两个套接字的控制权。
3.根据权利要求2所述的基于内核中套接字对接的第七层负载均衡的方法,其特征在于所述的负载均衡策略至少为轮询算法;或加权的轮询算法;或最少连接数算法;或加权的最少连接数算法;或基于请求位置的最少连接数算法,即将相同客户端IP的请求发送给相同的服务节点处理;或预先分配任务法,即根据承担任务情况来选择负载最轻的节点;或加权的预先分配任务法,即根据承担任务情况及节点的性能来综合选择负载最轻的节点;或客户端IP地址分区法,即将不同客户端的IP地址分为多个区,来自一个区的请求全部被分发到一个指定的节点。
全文摘要
一种基于内核中套接字对接的第七层负载均衡的方法,前置节点接收客户端请求;修改请求报文源、目的地址和端口号,将报文直接发送给服务节点;接收服务节点的响应;修改响应报文的源、目的地址和端口号,将报文直接发送给服务节点;如果请求完成,则回收两个套接字,更新转换映射表;否则继续接收客户端的请求。本发明可充分利用传输层转发和应用层转发的优点,既能提高报文转发效率,又具有很大的灵活性,从而更快、更均衡地把客户端的请求分发到服务节点上;并且可用该设计通用的中间件,实现所有端口上的报文转发功能;也可对报文进行复杂的分析,应用特殊的过滤规则,实现功能复杂的防火墙;甚至可以对现有TCP连接动态地进行迁移。
文档编号G06F15/16GK1512377SQ0215949
公开日2004年7月14日 申请日期2002年12月31日 优先权日2002年12月31日
发明者李电森, 冯锐, 许正华, 肖利民 申请人:联想(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1